From 8a360fe93b4f53d328c157ce0ec88cb0be1164ae Mon Sep 17 00:00:00 2001
From: jgeldart <jgeldart@91dfdad4-c543-0410-b26a-7d79dded8189>
Date: Fri, 4 Apr 2008 17:20:08 +0000
Subject: [PATCH] Added an implementation of LOAN, the Non-Axiomatic Ontology
 Language. Documentation forthcoming, although there is a PDF of the BNF for
 the language included.

---
 open-nars/JLex/Main.java                      | 7841 +++++++++++++++++
 .../opennars/language/BooleanLiteral.java     |   17 +
 .../googlecode/opennars/language/Literal.java |   12 +
 .../opennars/language/NumericLiteral.java     |   34 +
 .../opennars/language/StringLiteral.java      |    9 +
 .../googlecode/opennars/language/Term.java    |   13 +
 .../googlecode/opennars/language/URIRef.java  |   39 +
 .../googlecode/opennars/main/Reasoner.java    |   10 +-
 .../googlecode/opennars/parser/Parser.java    |   23 +-
 .../opennars/parser/TermVisitor.java          |   49 +
 .../googlecode/opennars/parser/loan/Loan.cf   |   94 +
 .../googlecode/opennars/parser/loan/Loan.pdf  |  Bin 0 -> 44023 bytes
 .../parser/loan/Loan/AbstractVisitor.java     |  110 +
 .../parser/loan/Loan/Absyn/BaseR.java         |   24 +
 .../parser/loan/Loan/Absyn/BaseRule.java      |   10 +
 .../opennars/parser/loan/Loan/Absyn/Doc.java  |   24 +
 .../parser/loan/Loan/Absyn/DocBR.java         |   25 +
 .../parser/loan/Loan/Absyn/Document.java      |   11 +
 .../parser/loan/Loan/Absyn/ListIdent.java     |    4 +
 .../parser/loan/Loan/Absyn/ListSentence.java  |    4 +
 .../parser/loan/Loan/Absyn/ListTerm.java      |    4 +
 .../parser/loan/Loan/Absyn/LitDbl.java        |   24 +
 .../parser/loan/Loan/Absyn/LitFalse.java      |   22 +
 .../parser/loan/Loan/Absyn/LitInt.java        |   24 +
 .../parser/loan/Loan/Absyn/LitQVar.java       |   24 +
 .../parser/loan/Loan/Absyn/LitQVarAn.java     |   22 +
 .../parser/loan/Loan/Absyn/LitSVarD.java      |   25 +
 .../parser/loan/Loan/Absyn/LitSVarI.java      |   24 +
 .../parser/loan/Loan/Absyn/LitString.java     |   24 +
 .../parser/loan/Loan/Absyn/LitTrue.java       |   22 +
 .../parser/loan/Loan/Absyn/LitURI.java        |   24 +
 .../parser/loan/Loan/Absyn/Literal.java       |   19 +
 .../parser/loan/Loan/Absyn/NSPrefix.java      |   11 +
 .../parser/loan/Loan/Absyn/NSPrefix1.java     |   24 +
 .../parser/loan/Loan/Absyn/NSPrefix2.java     |   22 +
 .../parser/loan/Loan/Absyn/SentDelay.java     |   24 +
 .../parser/loan/Loan/Absyn/SentGoal.java      |   25 +
 .../parser/loan/Loan/Absyn/SentImport.java    |   24 +
 .../parser/loan/Loan/Absyn/SentJudge.java     |   25 +
 .../parser/loan/Loan/Absyn/SentOp.java        |   24 +
 .../parser/loan/Loan/Absyn/SentPrefix.java    |   25 +
 .../parser/loan/Loan/Absyn/SentQuest.java     |   24 +
 .../parser/loan/Loan/Absyn/Sentence.java      |   16 +
 .../opennars/parser/loan/Loan/Absyn/Stm.java  |   31 +
 .../parser/loan/Loan/Absyn/StmConj.java       |   24 +
 .../parser/loan/Loan/Absyn/StmDisj.java       |   24 +
 .../parser/loan/Loan/Absyn/StmEquiv.java      |   24 +
 .../parser/loan/Loan/Absyn/StmEqvConc.java    |   24 +
 .../parser/loan/Loan/Absyn/StmEqvPred.java    |   24 +
 .../parser/loan/Loan/Absyn/StmFut.java        |   24 +
 .../parser/loan/Loan/Absyn/StmImpConc.java    |   24 +
 .../parser/loan/Loan/Absyn/StmImpPred.java    |   24 +
 .../parser/loan/Loan/Absyn/StmImpRet.java     |   24 +
 .../parser/loan/Loan/Absyn/StmImpl.java       |   24 +
 .../parser/loan/Loan/Absyn/StmInPp.java       |   24 +
 .../parser/loan/Loan/Absyn/StmInher.java      |   24 +
 .../parser/loan/Loan/Absyn/StmInst.java       |   24 +
 .../parser/loan/Loan/Absyn/StmNot.java        |   24 +
 .../parser/loan/Loan/Absyn/StmOp.java         |   25 +
 .../parser/loan/Loan/Absyn/StmPar.java        |   24 +
 .../parser/loan/Loan/Absyn/StmPres.java       |   24 +
 .../parser/loan/Loan/Absyn/StmProp.java       |   24 +
 .../parser/loan/Loan/Absyn/StmPst.java        |   24 +
 .../parser/loan/Loan/Absyn/StmSeq.java        |   24 +
 .../parser/loan/Loan/Absyn/StmSim.java        |   24 +
 .../parser/loan/Loan/Absyn/StmTrm.java        |   24 +
 .../opennars/parser/loan/Loan/Absyn/Term.java |   20 +
 .../parser/loan/Loan/Absyn/TrmExDif.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmExImg.java      |   25 +
 .../parser/loan/Loan/Absyn/TrmExInt.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmExSet.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmInDif.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmInImg.java      |   25 +
 .../parser/loan/Loan/Absyn/TrmInInt.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmInSet.java      |   24 +
 .../parser/loan/Loan/Absyn/TrmLit.java        |   24 +
 .../parser/loan/Loan/Absyn/TrmProd.java       |   24 +
 .../parser/loan/Loan/Absyn/TrmStm.java        |   24 +
 .../parser/loan/Loan/Absyn/TruthE.java        |   22 +
 .../parser/loan/Loan/Absyn/TruthF.java        |   24 +
 .../parser/loan/Loan/Absyn/TruthFC.java       |   24 +
 .../parser/loan/Loan/Absyn/TruthValue.java    |   12 +
 .../parser/loan/Loan/Absyn/URICur.java        |   25 +
 .../parser/loan/Loan/Absyn/URIFul.java        |   24 +
 .../parser/loan/Loan/Absyn/URIRef.java        |   11 +
 .../opennars/parser/loan/Loan/AllVisitor.java |   16 +
 .../parser/loan/Loan/ComposVisitor.java       |  452 +
 .../parser/loan/Loan/FoldVisitor.java         |  362 +
 .../opennars/parser/loan/Loan/Loan.cup        |  197 +
 .../parser/loan/Loan/PrettyPrinter.java       | 1458 +++
 .../opennars/parser/loan/Loan/Test.java       |   48 +
 .../opennars/parser/loan/Loan/VisitSkel.java  |  566 ++
 .../opennars/parser/loan/Loan/Yylex           |   96 +
 .../opennars/parser/loan/Loan/Yylex.java      |  915 ++
 .../opennars/parser/loan/Loan/parser.java     | 1433 +++
 .../opennars/parser/loan/Loan/sym.java        |   66 +
 .../opennars/parser/loan/LoanParser.java      | 1449 +++
 .../googlecode/opennars/parser/loan/loan.g    |   56 +-
 .../opennars/parser/loan/loan.tokens          |   76 -
 .../opennars/parser/loan/loanLexer.java       | 3574 --------
 .../opennars/parser/loan/loanParser.java      | 3160 -------
 .../parser/narsese/NarseseParser.java         |   19 +
 open-nars/java_cup/Main.java                  |  854 ++
 open-nars/java_cup/action_part.java           |   93 +
 open-nars/java_cup/action_production.java     |   39 +
 open-nars/java_cup/assoc.java                 |   16 +
 open-nars/java_cup/emit.java                  |  897 ++
 open-nars/java_cup/internal_error.java        |   22 +
 open-nars/java_cup/lalr_item.java             |  330 +
 open-nars/java_cup/lalr_item_set.java         |  371 +
 open-nars/java_cup/lalr_state.java            |  884 ++
 open-nars/java_cup/lalr_transition.java       |   93 +
 open-nars/java_cup/lexer.java                 |  543 ++
 open-nars/java_cup/lr_item_core.java          |  280 +
 open-nars/java_cup/non_terminal.java          |  301 +
 open-nars/java_cup/nonassoc_action.java       |   71 +
 open-nars/java_cup/parse_action.java          |   92 +
 open-nars/java_cup/parse_action_row.java      |  106 +
 open-nars/java_cup/parse_action_table.java    |  143 +
 open-nars/java_cup/parse_reduce_row.java      |   41 +
 open-nars/java_cup/parse_reduce_table.java    |   99 +
 open-nars/java_cup/parser.cup                 |  863 ++
 open-nars/java_cup/parser.java                | 1849 ++++
 open-nars/java_cup/production.java            |  756 ++
 open-nars/java_cup/production_part.java       |   94 +
 open-nars/java_cup/reduce_action.java         |   84 +
 open-nars/java_cup/runtime/Scanner.java       |   25 +
 open-nars/java_cup/runtime/Symbol.java        |  105 +
 open-nars/java_cup/runtime/lr_parser.java     | 1238 +++
 .../java_cup/runtime/virtual_parse_stack.java |  145 +
 open-nars/java_cup/shift_action.java          |   82 +
 open-nars/java_cup/simple_calc/Main.java      |   32 +
 open-nars/java_cup/simple_calc/parser.cup     |   55 +
 open-nars/java_cup/simple_calc/parser.java    |  318 +
 open-nars/java_cup/simple_calc/scanner.java   |   63 +
 open-nars/java_cup/simple_calc/sym.java       |   25 +
 open-nars/java_cup/sym.java                   |   43 +
 open-nars/java_cup/symbol.java                |  107 +
 open-nars/java_cup/symbol_part.java           |  100 +
 open-nars/java_cup/symbol_set.java            |  231 +
 open-nars/java_cup/terminal.java              |  169 +
 open-nars/java_cup/terminal_set.java          |  253 +
 open-nars/java_cup/version.java               |   55 +
 open-nars/lib/antlr-runtime-3.0.1.jar         |  Bin 105209 -> 0 bytes
 open-nars/lib/stringtemplate-3.0.jar          |  Bin 161716 -> 0 bytes
 145 files changed, 28933 insertions(+), 6820 deletions(-)
 create mode 100644 open-nars/JLex/Main.java
 create mode 100644 open-nars/com/googlecode/opennars/language/BooleanLiteral.java
 create mode 100644 open-nars/com/googlecode/opennars/language/Literal.java
 create mode 100644 open-nars/com/googlecode/opennars/language/NumericLiteral.java
 create mode 100644 open-nars/com/googlecode/opennars/language/StringLiteral.java
 create mode 100644 open-nars/com/googlecode/opennars/language/URIRef.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/TermVisitor.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan.cf
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan.pdf
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/AbstractVisitor.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseR.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseRule.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Doc.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/DocBR.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Document.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListIdent.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListSentence.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListTerm.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitDbl.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitFalse.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitInt.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVar.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVarAn.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarD.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarI.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitString.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitTrue.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitURI.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Literal.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix1.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix2.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentDelay.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentGoal.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentImport.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentJudge.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentOp.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentPrefix.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentQuest.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Sentence.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Stm.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmConj.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmDisj.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEquiv.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvConc.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvPred.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmFut.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpConc.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpPred.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpRet.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpl.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInPp.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInher.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInst.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmNot.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmOp.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPar.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPres.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmProp.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPst.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSeq.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSim.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmTrm.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Term.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExDif.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExImg.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExInt.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExSet.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInDif.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInImg.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInInt.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInSet.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmLit.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmProd.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmStm.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthE.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthF.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthFC.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthValue.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URICur.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIFul.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIRef.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/AllVisitor.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/ComposVisitor.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/FoldVisitor.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Loan.cup
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/PrettyPrinter.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Test.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/VisitSkel.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/parser.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/Loan/sym.java
 create mode 100644 open-nars/com/googlecode/opennars/parser/loan/LoanParser.java
 delete mode 100644 open-nars/com/googlecode/opennars/parser/loan/loan.tokens
 delete mode 100644 open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
 delete mode 100644 open-nars/com/googlecode/opennars/parser/loan/loanParser.java
 create mode 100644 open-nars/java_cup/Main.java
 create mode 100644 open-nars/java_cup/action_part.java
 create mode 100644 open-nars/java_cup/action_production.java
 create mode 100644 open-nars/java_cup/assoc.java
 create mode 100644 open-nars/java_cup/emit.java
 create mode 100644 open-nars/java_cup/internal_error.java
 create mode 100644 open-nars/java_cup/lalr_item.java
 create mode 100644 open-nars/java_cup/lalr_item_set.java
 create mode 100644 open-nars/java_cup/lalr_state.java
 create mode 100644 open-nars/java_cup/lalr_transition.java
 create mode 100644 open-nars/java_cup/lexer.java
 create mode 100644 open-nars/java_cup/lr_item_core.java
 create mode 100644 open-nars/java_cup/non_terminal.java
 create mode 100644 open-nars/java_cup/nonassoc_action.java
 create mode 100644 open-nars/java_cup/parse_action.java
 create mode 100644 open-nars/java_cup/parse_action_row.java
 create mode 100644 open-nars/java_cup/parse_action_table.java
 create mode 100644 open-nars/java_cup/parse_reduce_row.java
 create mode 100644 open-nars/java_cup/parse_reduce_table.java
 create mode 100644 open-nars/java_cup/parser.cup
 create mode 100644 open-nars/java_cup/parser.java
 create mode 100644 open-nars/java_cup/production.java
 create mode 100644 open-nars/java_cup/production_part.java
 create mode 100644 open-nars/java_cup/reduce_action.java
 create mode 100644 open-nars/java_cup/runtime/Scanner.java
 create mode 100644 open-nars/java_cup/runtime/Symbol.java
 create mode 100644 open-nars/java_cup/runtime/lr_parser.java
 create mode 100644 open-nars/java_cup/runtime/virtual_parse_stack.java
 create mode 100644 open-nars/java_cup/shift_action.java
 create mode 100644 open-nars/java_cup/simple_calc/Main.java
 create mode 100644 open-nars/java_cup/simple_calc/parser.cup
 create mode 100644 open-nars/java_cup/simple_calc/parser.java
 create mode 100644 open-nars/java_cup/simple_calc/scanner.java
 create mode 100644 open-nars/java_cup/simple_calc/sym.java
 create mode 100644 open-nars/java_cup/sym.java
 create mode 100644 open-nars/java_cup/symbol.java
 create mode 100644 open-nars/java_cup/symbol_part.java
 create mode 100644 open-nars/java_cup/symbol_set.java
 create mode 100644 open-nars/java_cup/terminal.java
 create mode 100644 open-nars/java_cup/terminal_set.java
 create mode 100644 open-nars/java_cup/version.java
 delete mode 100644 open-nars/lib/antlr-runtime-3.0.1.jar
 delete mode 100644 open-nars/lib/stringtemplate-3.0.jar

diff --git a/open-nars/JLex/Main.java b/open-nars/JLex/Main.java
new file mode 100644
index 0000000..89ba5bb
--- /dev/null
+++ b/open-nars/JLex/Main.java
@@ -0,0 +1,7841 @@
+/**************************************************************
+  JLex: A Lexical Analyzer Generator for Java(TM)
+  Written by Elliot Berk <ejberk@cs.princeton.edu>. Copyright 1996.
+  Maintained by C. Scott Ananian <cananian@alumni.princeton.edu>.
+  See below for copyright notice, license, and disclaimer.
+  New releases from http://www.cs.princeton.edu/~appel/modern/java/JLex/
+
+  Version 1.2.6, 2/7/03, [C. Scott Ananian]
+   Renamed 'assert' function 'ASSERT' to accomodate Java 1.4's new keyword.
+   Fixed a bug which certain forms of comment in the JLex directives section
+     (which are not allowed) to be incorrectly parsed as macro definitions.
+  Version 1.2.5, 7/25/99-5/16/00, [C. Scott Ananian]
+   Stomped on one more 8-bit character bug.  Should work now (really!).
+   Added unicode support, including unicode escape sequences.
+   Rewrote internal JavaLexBitSet class as SparseBitSet for efficient
+     unicoding.
+   Added an NFA character class simplification pass for unicode efficiency.
+   Changed byte- and stream-oriented I/O routines to use characters and
+     java.io.Reader and java.io.Writer instead --- which means we read in
+     unicode specifications correctly and write out a proper unicode java
+     source file.  As a happy side-effect, the output java file is written
+     with your platform's preferred newline character(s).
+   Rewrote CInput to fix bugs with line-counting in the specification file
+     and "unusual behaviour" when the last line of the specification wasn't
+     terminated with a newline. Thanks to Matt Hanna <mhanna@cs.caltech.edu>
+     for pointing out the bug.
+   Fixed a bug that would cause JLex not to terminate given certain input
+     specifications.  Thanks to Mark Greenstreet <mrg@cs.ubc.ca> and
+     Frank B. Brokken <frank@suffix.icce.rug.nl> for reporting this.
+   CUP parser integration improved according to suggestions made by
+     David MacMahon <davidm@smartsc.com>.  The %cup directive now tells
+     JLex to generate a parser conforming to the java_cup.runtime.Scanner
+     interface; see manual for more details.
+   Fixed bug with null string literals ("") in regexps.  Reported by
+     Charles Fischer <fischer@cs.wisc.edu>.
+   Rewrote start-of-line and end-of-line handling, closing active bug #5.
+     Also fixed line-counting code, closing active bug #12.  All
+     new-line handling is now platform-independent.
+   Used unpackFromString more extensively to allow larger cmap, etc,
+     tables.  This helps unicode support work reliably.  It's also
+     prettier now if you happen to read the source to the generated
+     lexer.
+   Generated lexer now accepts unicode LS (U+2028) and PS (U+2029) as
+     line separators for strict unicode compliance; see
+     http://www.unicode.org/unicode/reports/tr18/
+   Fixed bug with character constants in action strings.  Reported by
+     Andrew Appel against 1.2.5b3.
+   Fixed bug with illegal \^C-style escape sequences.  Reported by
+     Toshiya Iwai <iwai@isdnet.co.jp> against 1.2.5b4.
+   Fixed "newline in quoted string" error when unpaired single- or
+     double-quotes were present in comments in the action phrase.
+     Reported by Stephen Ostermiller <1010JLex@ostermiller.com>
+     against 1.2.5b4.  Reported by Eric Esposito <eric.esposito@unh.edu>
+     against 1.2.4 and 1.2.5b2.
+   Fixed "newline in quoted string" error when /* or // appeared
+     in quoted strings in the action phrase.  Reported by
+     David Eichmann <david-eichmann@uiowa.edu> against 1.2.5b5.
+   Fixed 'illegal constant' errors in case statements caused by
+     Sun's JDK 1.3 more closely adhering to the Java Language
+     Specification.  Reported by a number of people, but 
+     Harold Grovesteen <hgrovesteen@home.com> was the first to direct me to
+     a Sun bug report (4119776) which quoted the relevant section of the
+     JLS (15.27) to convince me that the JLex construction actually was
+     illegal.  Reported against 1.2.5b6, but this bit of code has been
+     present since the very first version of JLex (1.1.1).
+
+  Version 1.2.4, 7/24/99, [C. Scott Ananian]
+   Correct the parsing of '-' in character classes, closing active 
+     bug #1.  Behaviour follows egrep: leading and trailing dashes in
+     a character class lose their special meaning, so [-+] and [+-] do
+     what you would expect them to.
+   New %ignorecase directive for generating case-insensitive lexers by
+     expanding matched character classes in a unicode-friendly way.
+   Handle unmatched braces in quoted strings or comments within
+     action code blocks.
+   Fixed input lexer to allow whitespace in character classes, closing
+     active bug #9.  Whitespace in quotes had been previously fixed.
+   Made Yylex.YYEOF and %yyeof work like the manual says they should.
+
+  Version 1.2.3, 6/26/97, [Raimondas Lencevicius]
+   Fixed the yy_nxt[][] assignment that has generated huge code
+   exceeding 64K method size limit. Now the assignment
+   is handled by unpacking a string encoding of integer array.
+   To achieve that, added
+   "private int [][] unpackFromString(int size1, int size2, String st)"
+   function and coded the yy_nxt[][] values into a string
+   by printing integers into a string and representing
+   integer sequences as "value:length" pairs.
+   Improvement: generated .java file reduced 2 times, .class file
+     reduced 6 times for sample grammar. No 64K errors.
+   Possible negatives: Some editors and OSs may not be able to handle 
+     the huge one-line generated string. String unpacking may be slower
+     than direct array initialization.
+
+  Version 1.2.2, 10/24/97, [Martin Dirichs]
+  Notes:
+    Changed yy_instream to yy_reader of type BufferedReader. This reflects
+     the improvements in the JDK 1.1 concerning InputStreams. As a
+     consequence, changed yy_buffer from byte[] to char[].
+     The lexer can now be initialized with either an InputStream
+     or a Reader. A third, private constructor is called by the other
+     two to execute user specified constructor code.
+
+  Version 1.2.1, 9/15/97 [A. Appel]
+   Fixed bugs 6 (character codes > 127) and 10 (deprecated String constructor).
+
+  Version 1.2, 5/5/97, [Elliot Berk]
+  Notes:
+    Simply changed the name from JavaLex to JLex.  No other changes.
+
+  Version 1.1.5, 2/25/97, [Elliot Berk]
+  Notes:
+    Simple optimization to the creation of the source files.
+     Added a BufferedOutputStream in the creation of the DataOutputStream
+     field m_outstream of the class CLexGen.  This helps performance by
+     doing some buffering, and was suggested by Max Hailperin,
+     Associate Professor of Computer Science, Gustavus Adolphus College.
+
+  Version 1.1.4, 12/12/96, [Elliot Berk]
+  Notes:
+    Added %public directive to make generated class public.
+
+  Version 1.1.3, 12/11/96, [Elliot Berk]
+  Notes:
+    Converted assertion failure on invalid character class 
+     when a dash '-' is not preceded with a start-of-range character.
+     Converted this into parse error E_DASH.
+
+  Version 1.1.2, October 30, 1996 [Elliot Berk]
+    Fixed BitSet bugs by installing a BitSet class of my own,
+     called JavaLexBitSet.  Fixed support for '\r', non-UNIX 
+     sequences.  Added try/catch block around lexer generation
+     in main routine to moderate error information presented 
+     to user.  Fixed macro expansion, so that macros following 
+     quotes are expanded correctly in regular expressions.
+     Fixed dynamic reallocation of accept action buffers.
+
+  Version 1.1.1, September 3, 1996 [Andrew Appel]
+    Made the class "Main" instead of "JavaLex", 
+     improved the installation instructions to reflect this.
+
+  Version 1.1, August 15, 1996  [Andrew Appel]
+    Made yychar, yyline, yytext global to the lexer so that
+     auxiliary functions can access them.
+  **************************************************************/
+
+/***************************************************************
+       JLEX COPYRIGHT NOTICE, LICENSE, AND DISCLAIMER
+  Copyright 1996-2000 by Elliot Joel Berk and C. Scott Ananian 
+
+  Permission to use, copy, modify, and distribute this software and its
+  documentation for any purpose and without fee is hereby granted,
+  provided that the above copyright notice appear in all copies and that
+  both the copyright notice and this permission notice and warranty
+  disclaimer appear in supporting documentation, and that the name of
+  the authors or their employers not be used in advertising or publicity
+  pertaining to distribution of the software without specific, written
+  prior permission.
+
+  The authors and their employers disclaim all warranties with regard to
+  this software, including all implied warranties of merchantability and
+  fitness. In no event shall the authors or their employers be liable
+  for any special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether in an
+  action of contract, negligence or other tortious action, arising out
+  of or in connection with the use or performance of this software.
+  **************************************************************/
+
+/***************************************************************
+  Package Declaration
+  **************************************************************/
+package JLex;
+
+/***************************************************************
+  Imported Packages
+  **************************************************************/
+import java.lang.System;
+import java.lang.Integer;
+import java.lang.Character;
+
+import java.util.Enumeration;
+import java.util.Stack;
+import java.util.Hashtable;
+import java.util.Vector;
+
+/******************************
+  Questions:
+  2) How should I use the Java package system
+  to make my tool more modularized and
+  coherent?
+
+  Unimplemented:
+  !) Fix BitSet issues -- expand only when necessary.
+  2) Repeated accept rules.
+  6) Clean up the CAlloc class and use buffered
+  allocation.
+  9) Add to spec about extending character set.
+  11) m_verbose -- what should be done with it?
+  12) turn lexical analyzer into a coherent
+  Java package
+  13) turn lexical analyzer generator into a
+  coherent Java package
+  16) pretty up generated code
+  17) make it possible to have white space in
+  regular expressions
+  18) clean up all of the class files the lexer
+  generator produces when it is compiled,
+  and reduce this number in some way.
+  24) character format to and from file: writeup
+  and implementation
+  25) Debug by testing all arcane regular expression cases.
+  26) Look for and fix all UNDONE comments below.
+  27) Fix package system.
+  28) Clean up unnecessary classes.
+  *****************************/
+
+/***************************************************************
+  Class: CSpec
+ **************************************************************/
+class CSpec
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+    
+  /* Lexical States. */
+  Hashtable m_states; /* Hashtable taking state indices (Integer) 
+			 to state name (String). */
+
+  /* Regular Expression Macros. */ 
+  Hashtable m_macros; /* Hashtable taking macro name (String)
+				to corresponding char buffer that
+				holds macro definition. */
+
+  /* NFA Machine. */
+  CNfa m_nfa_start; /* Start state of NFA machine. */
+  Vector m_nfa_states; /* Vector of states, with index
+				 corresponding to label. */
+  
+  Vector m_state_rules[]; /* An array of Vectors of Integers.
+				    The ith Vector represents the lexical state
+				    with index i.  The contents of the ith 
+				    Vector are the indices of the NFA start
+				    states that can be matched while in
+				    the ith lexical state. */
+				    
+
+  int m_state_dtrans[];
+
+  /* DFA Machine. */
+  Vector m_dfa_states; /* Vector of states, with index
+				 corresponding to label. */
+  Hashtable m_dfa_sets; /* Hashtable taking set of NFA states
+				  to corresponding DFA state, 
+				  if the latter exists. */
+  
+  /* Accept States and Corresponding Anchors. */
+  Vector m_accept_vector;
+  int m_anchor_array[];
+
+  /* Transition Table. */
+  Vector m_dtrans_vector;
+  int m_dtrans_ncols;
+  int m_row_map[];
+  int m_col_map[];
+
+  /* Special pseudo-characters for beginning-of-line and end-of-file. */
+  static final int NUM_PSEUDO=2;
+  int BOL; // beginning-of-line
+  int EOF; // end-of-line
+
+  /** NFA character class minimization map. */
+  int m_ccls_map[];
+
+  /* Regular expression token variables. */
+  int m_current_token;
+  char m_lexeme;
+  boolean m_in_quote;
+  boolean m_in_ccl;
+
+  /* Verbose execution flag. */
+  boolean m_verbose;
+
+  /* JLex directives flags. */
+  boolean m_integer_type;
+  boolean m_intwrap_type;
+  boolean m_yyeof;
+  boolean m_count_chars;
+  boolean m_count_lines;
+  boolean m_cup_compatible;
+  boolean m_unix;
+  boolean m_public;
+  boolean m_ignorecase;
+
+  char m_init_code[];
+  int m_init_read;
+
+  char m_init_throw_code[];
+  int m_init_throw_read;
+
+  char m_class_code[];
+  int m_class_read;
+
+  char m_eof_code[];
+  int m_eof_read;
+
+  char m_eof_value_code[];
+  int m_eof_value_read;
+
+  char m_eof_throw_code[];
+  int m_eof_throw_read;
+
+  char m_yylex_throw_code[];
+  int m_yylex_throw_read;
+
+  /* Class, function, type names. */
+  char m_class_name[] = {          
+    'Y', 'y', 'l', 
+    'e', 'x' 
+    };
+  char m_implements_name[] = {};
+  char m_function_name[] = {
+    'y', 'y', 'l', 
+    'e', 'x' 
+    };
+  char m_type_name[] = {
+    'Y', 'y', 't', 
+    'o', 'k', 'e',
+    'n'
+    };
+
+  /* Lexical Generator. */
+  private CLexGen m_lexGen;
+
+  /***************************************************************
+    Constants
+    ***********************************************************/
+  static final int NONE = 0;
+  static final int START = 1;
+  static final int END = 2;
+  
+  /***************************************************************
+    Function: CSpec
+    Description: Constructor.
+    **************************************************************/
+  CSpec
+    (
+     CLexGen lexGen
+     )
+      {
+	m_lexGen = lexGen;
+
+	/* Initialize regular expression token variables. */
+	m_current_token = m_lexGen.EOS;
+	m_lexeme = '\0';
+	m_in_quote = false;
+	m_in_ccl = false;
+
+	/* Initialize hashtable for lexer states. */
+	m_states = new Hashtable();
+	m_states.put(new String("YYINITIAL"),new Integer(m_states.size()));
+
+	/* Initialize hashtable for lexical macros. */
+	m_macros = new Hashtable();
+
+	/* Initialize variables for lexer options. */
+	m_integer_type = false;
+	m_intwrap_type = false;
+	m_count_lines = false;
+	m_count_chars = false;
+	m_cup_compatible = false;
+	m_unix = true;
+        m_public = false;
+	m_yyeof = false;
+	m_ignorecase = false;
+
+	/* Initialize variables for JLex runtime options. */
+	m_verbose = true;
+
+	m_nfa_start = null;
+	m_nfa_states = new Vector();
+	
+	m_dfa_states = new Vector();
+	m_dfa_sets = new Hashtable();
+
+	m_dtrans_vector = new Vector();
+	m_dtrans_ncols = CUtility.MAX_SEVEN_BIT + 1;
+	m_row_map = null;
+	m_col_map = null;
+
+	m_accept_vector = null;
+	m_anchor_array = null;
+
+	m_init_code = null;
+	m_init_read = 0;
+
+	m_init_throw_code = null;
+	m_init_throw_read = 0;
+
+	m_yylex_throw_code = null;
+	m_yylex_throw_read = 0;
+
+	m_class_code = null;
+	m_class_read = 0;
+
+	m_eof_code = null;
+	m_eof_read = 0;
+
+	m_eof_value_code = null;
+	m_eof_value_read = 0;
+
+	m_eof_throw_code = null;
+	m_eof_throw_read = 0;
+
+	m_state_dtrans = null;
+
+	m_state_rules = null;
+      }
+}
+
+/***************************************************************
+  Class: CEmit
+  **************************************************************/
+class CEmit
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  private CSpec m_spec;
+  private java.io.PrintWriter m_outstream;
+
+  /***************************************************************
+    Constants: Anchor Types
+    **************************************************************/
+  private final int START = 1;
+  private final int END = 2;
+  private final int NONE = 4;
+
+  /***************************************************************
+    Constants
+    **************************************************************/
+  private final boolean EDBG = true;
+  private final boolean NOT_EDBG = false;
+
+  /***************************************************************
+    Function: CEmit
+    Description: Constructor.
+    **************************************************************/
+  CEmit
+    (
+     )
+      {
+	reset();
+      }
+
+  /***************************************************************
+    Function: reset
+    Description: Clears member variables.
+    **************************************************************/
+  private void reset
+    (
+     )
+      {
+	m_spec = null;
+	m_outstream = null;
+      }
+
+  /***************************************************************
+    Function: set
+    Description: Initializes member variables.
+    **************************************************************/
+  private void set
+    (
+     CSpec spec,
+     java.io.PrintWriter outstream
+     )
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != spec);
+	    CUtility.ASSERT(null != outstream);
+	  }
+
+	m_spec = spec;
+	m_outstream = outstream;
+      }
+
+  /***************************************************************
+    Function: emit_imports
+    Description: Emits import packages at top of 
+    generated source file.
+    **************************************************************/
+  /*void emit_imports
+    (
+     CSpec spec,
+     OutputStream outstream
+     )
+      throws java.io.IOException      
+	{
+	  set(spec,outstream);
+	  
+	  if (CUtility.DEBUG)
+	    {
+	      CUtility.ASSERT(null != m_spec);
+	      CUtility.ASSERT(null != m_outstream);
+	    }*/
+	  
+	  /*m_outstream.println("import java.lang.String;");
+	  m_outstream.println("import java.lang.System;");
+	  m_outstream.println("import java.io.BufferedReader;");
+	  m_outstream.println("import java.io.InputStream;");*/
+	/*  
+	  reset();
+	}*/
+  
+  /***************************************************************
+    Function: print_details
+    Description: Debugging output.
+    **************************************************************/
+  private void print_details
+    (
+     )
+      {
+	int i;
+	int j;
+	int next;
+	int state;
+	CDTrans dtrans;
+	CAccept accept;
+	boolean tr;
+
+	System.out.println("---------------------- Transition Table " 
+			   + "----------------------");
+	
+	for (i = 0; i < m_spec.m_row_map.length; ++i)
+	  {
+	    System.out.print("State " + i);
+	    
+	    accept = (CAccept) m_spec.m_accept_vector.elementAt(i);
+	    if (null == accept)
+	      {
+		System.out.println(" [nonaccepting]");
+	      }
+	    else
+	      {
+		System.out.println(" [accepting, line "
+				 + accept.m_line_number 
+				 + " <"
+				 + (new java.lang.String(accept.m_action,0,
+					       accept.m_action_read))
+				 + ">]");
+	      }
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(m_spec.m_row_map[i]);
+	    
+	    tr = false;
+	    state = dtrans.m_dtrans[m_spec.m_col_map[0]];
+	    if (CDTrans.F != state)
+	      {
+		tr = true;
+		System.out.print("\tgoto " + state + " on [" + ((char) 0));
+	      }
+	    for (j = 1; j < m_spec.m_dtrans_ncols; ++j)
+	      {
+		next = dtrans.m_dtrans[m_spec.m_col_map[j]];
+		if (state == next)
+		  {
+		    if (CDTrans.F != state)
+		      {
+			System.out.print((char) j);
+		      }
+		  }
+		else
+		  {
+		    state = next;
+	  	    if (tr)
+		      {
+			System.out.println("]");
+			tr = false;
+		      }
+		    if (CDTrans.F != state)
+		      {
+			tr = true;
+			System.out.print("\tgoto " + state + " on [" + ((char) j));
+		      }
+		  }
+	      }
+	    if (tr)
+	      {
+		System.out.println("]");
+	      }
+	  }
+
+	System.out.println("---------------------- Transition Table " 
+			   + "----------------------");
+      }
+
+  /***************************************************************
+    Function: emit
+    Description: High-level access function to module.
+    **************************************************************/
+  void emit
+    (
+     CSpec spec,
+     java.io.PrintWriter outstream
+     )
+      throws java.io.IOException      
+	{
+	  set(spec,outstream);
+	  
+	  if (CUtility.DEBUG)
+	    {
+	      CUtility.ASSERT(null != m_spec);
+	      CUtility.ASSERT(null != m_outstream);
+	    }
+	  
+	  if (CUtility.OLD_DEBUG) {
+	    print_details();
+	  }
+
+	  emit_header();
+	  emit_construct();
+	  emit_helpers();
+	  emit_driver();
+	  emit_footer();
+	  
+	  reset();
+	}
+
+  /***************************************************************
+    Function: emit_construct
+    Description: Emits constructor, member variables,
+    and constants.
+    **************************************************************/
+  private void emit_construct
+    (
+     )
+      throws java.io.IOException
+	{
+	  if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(null != m_outstream);
+	  }
+	  
+	  /* Constants */
+	  m_outstream.println("\tprivate final int YY_BUFFER_SIZE = 512;");
+
+	  m_outstream.println("\tprivate final int YY_F = -1;");
+	  m_outstream.println("\tprivate final int YY_NO_STATE = -1;");
+
+	  m_outstream.println("\tprivate final int YY_NOT_ACCEPT = 0;");
+	  m_outstream.println("\tprivate final int YY_START = 1;");
+	  m_outstream.println("\tprivate final int YY_END = 2;");
+	  m_outstream.println("\tprivate final int YY_NO_ANCHOR = 4;");
+
+	  // internal
+	  m_outstream.println("\tprivate final int YY_BOL = "+m_spec.BOL+";");
+	  m_outstream.println("\tprivate final int YY_EOF = "+m_spec.EOF+";");
+	  // external
+	  if (m_spec.m_integer_type || true == m_spec.m_yyeof)
+	    m_outstream.println("\tpublic final int YYEOF = -1;");
+	  
+          /* User specified class code. */
+	  if (null != m_spec.m_class_code)
+	    {
+	      m_outstream.print(new String(m_spec.m_class_code,0,
+						m_spec.m_class_read));
+	    }
+
+	  /* Member Variables */
+	  m_outstream.println("\tprivate java.io.BufferedReader yy_reader;");
+	  m_outstream.println("\tprivate int yy_buffer_index;");
+	  m_outstream.println("\tprivate int yy_buffer_read;");
+	  m_outstream.println("\tprivate int yy_buffer_start;");
+	  m_outstream.println("\tprivate int yy_buffer_end;");
+	  m_outstream.println("\tprivate char yy_buffer[];");
+	  if (m_spec.m_count_chars)
+	    {
+	      m_outstream.println("\tprivate int yychar;");
+	    }
+	  if (m_spec.m_count_lines)
+	    {
+	      m_outstream.println("\tprivate int yyline;");
+	    }
+	  m_outstream.println("\tprivate boolean yy_at_bol;");
+	  m_outstream.println("\tprivate int yy_lexical_state;");
+	  /*if (m_spec.m_count_lines || true == m_spec.m_count_chars)
+	    {
+	      m_outstream.println("\tprivate int yy_buffer_prev_start;");
+	    }*/
+	  m_outstream.println();
+
+	  
+	  /* Function: first constructor (Reader) */
+	  m_outstream.print("\t");
+	  if (true == m_spec.m_public) {
+	    m_outstream.print("public ");
+	  }
+          m_outstream.print(new String(m_spec.m_class_name));
+	  m_outstream.print(" (java.io.Reader reader)");
+	  
+	  if (null != m_spec.m_init_throw_code)
+	    {
+	      m_outstream.println(); 
+	      m_outstream.print("\t\tthrows "); 
+	      m_outstream.print(new String(m_spec.m_init_throw_code,0,
+						m_spec.m_init_throw_read));
+	      m_outstream.println();
+	      m_outstream.println("\t\t{");
+	    }
+	  else
+	    {
+	      m_outstream.println(" {");
+	    }
+
+	  m_outstream.println("\t\tthis ();");	  
+	  m_outstream.println("\t\tif (null == reader) {");
+	  m_outstream.println("\t\t\tthrow (new Error(\"Error: Bad input "
+				 + "stream initializer.\"));");
+	  m_outstream.println("\t\t}");
+	  m_outstream.println("\t\tyy_reader = new java.io.BufferedReader(reader);");
+	  m_outstream.println("\t}");
+	  m_outstream.println();
+
+
+	  /* Function: second constructor (InputStream) */
+	  m_outstream.print("\t");
+	  if (true == m_spec.m_public) {
+	    m_outstream.print("public ");
+	  }
+          m_outstream.print(new String(m_spec.m_class_name));
+	  m_outstream.print(" (java.io.InputStream instream)");
+	  
+	  if (null != m_spec.m_init_throw_code)
+	    {
+	      m_outstream.println(); 
+	      m_outstream.print("\t\tthrows "); 
+	      m_outstream.println(new String(m_spec.m_init_throw_code,0,
+						m_spec.m_init_throw_read));
+	      m_outstream.println("\t\t{");
+	    }
+	  else
+	    {
+	      m_outstream.println(" {");
+	    }
+	  
+	  m_outstream.println("\t\tthis ();");	  
+	  m_outstream.println("\t\tif (null == instream) {");
+	  m_outstream.println("\t\t\tthrow (new Error(\"Error: Bad input "
+				 + "stream initializer.\"));");
+	  m_outstream.println("\t\t}");
+	  m_outstream.println("\t\tyy_reader = new java.io.BufferedReader(new java.io.InputStreamReader(instream));");
+	  m_outstream.println("\t}");
+	  m_outstream.println();
+
+
+	  /* Function: third, private constructor - only for internal use */
+	  m_outstream.print("\tprivate ");
+          m_outstream.print(new String(m_spec.m_class_name));
+	  m_outstream.print(" ()");
+	  
+	  if (null != m_spec.m_init_throw_code)
+	    {
+	      m_outstream.println(); 
+	      m_outstream.print("\t\tthrows "); 
+	      m_outstream.println(new String(m_spec.m_init_throw_code,0,
+						m_spec.m_init_throw_read));
+	      m_outstream.println("\t\t{");
+	    }
+	  else
+	    {
+	      m_outstream.println(" {");
+	    }
+	  
+	  m_outstream.println("\t\tyy_buffer = new char[YY_BUFFER_SIZE];");
+	  m_outstream.println("\t\tyy_buffer_read = 0;");
+	  m_outstream.println("\t\tyy_buffer_index = 0;");
+	  m_outstream.println("\t\tyy_buffer_start = 0;");
+	  m_outstream.println("\t\tyy_buffer_end = 0;");
+	  if (m_spec.m_count_chars)
+	    {
+	      m_outstream.println("\t\tyychar = 0;");
+	    }
+	  if (m_spec.m_count_lines)
+	    {
+	      m_outstream.println("\t\tyyline = 0;");
+	    }
+	  m_outstream.println("\t\tyy_at_bol = true;");
+	  m_outstream.println("\t\tyy_lexical_state = YYINITIAL;");
+	  /*if (m_spec.m_count_lines || true == m_spec.m_count_chars)
+	    {
+	      m_outstream.println("\t\tyy_buffer_prev_start = 0;");
+	    }*/
+
+	  /* User specified constructor code. */
+	  if (null != m_spec.m_init_code)
+	    {
+	      m_outstream.print(new String(m_spec.m_init_code,0,
+						m_spec.m_init_read));
+	    }
+
+	  m_outstream.println("\t}");
+	  m_outstream.println();
+
+	}
+
+  /***************************************************************
+    Function: emit_states
+    Description: Emits constants that serve as lexical states,
+    including YYINITIAL.
+    **************************************************************/
+  private void emit_states
+    (
+     )
+      throws java.io.IOException
+	{
+	  Enumeration states;
+	  String state;
+	  int index;
+
+	  states = m_spec.m_states.keys();
+	  /*index = 0;*/
+	  while (states.hasMoreElements())
+	    {
+	      state = (String) states.nextElement();
+	      
+	      if (CUtility.DEBUG)
+		{
+		  CUtility.ASSERT(null != state);
+		}
+	      
+	      m_outstream.println("\tprivate final int " 
+				     + state 
+				     + " = " 
+				     + (m_spec.m_states.get(state)).toString() 
+				     + ";");
+	      /*++index;*/
+	    }
+
+	  m_outstream.println("\tprivate final int yy_state_dtrans[] = {");
+	  for (index = 0; index < m_spec.m_state_dtrans.length; ++index)
+	    {
+	      m_outstream.print("\t\t" + m_spec.m_state_dtrans[index]);
+	      if (index < m_spec.m_state_dtrans.length - 1)
+		{
+		  m_outstream.println(",");
+		}
+	      else
+		{
+		  m_outstream.println();
+		}
+	    }
+	  m_outstream.println("\t};");
+	}
+
+  /***************************************************************
+    Function: emit_helpers
+    Description: Emits helper functions, particularly 
+    error handling and input buffering.
+    **************************************************************/
+  private void emit_helpers
+    (
+     )
+      throws java.io.IOException
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(null != m_outstream);
+	  }
+
+	/* Function: yy_do_eof */
+	m_outstream.println("\tprivate boolean yy_eof_done = false;");
+	if (null != m_spec.m_eof_code)
+	  {
+	    m_outstream.print("\tprivate void yy_do_eof ()");
+
+	    if (null != m_spec.m_eof_throw_code)
+	      {
+		m_outstream.println(); 
+		m_outstream.print("\t\tthrows "); 
+		m_outstream.println(new String(m_spec.m_eof_throw_code,0,
+						  m_spec.m_eof_throw_read));
+		m_outstream.println("\t\t{");
+	      }
+	    else
+	      {
+		m_outstream.println(" {");
+	      }
+
+	    m_outstream.println("\t\tif (false == yy_eof_done) {");
+	    m_outstream.print(new String(m_spec.m_eof_code,0,
+					      m_spec.m_eof_read));
+	    m_outstream.println("\t\t}");
+	    m_outstream.println("\t\tyy_eof_done = true;");
+	    m_outstream.println("\t}");
+	  }
+
+	emit_states();
+	
+	/* Function: yybegin */
+	m_outstream.println("\tprivate void yybegin (int state) {");
+	m_outstream.println("\t\tyy_lexical_state = state;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_initial_dtrans */
+	/*m_outstream.println("\tprivate int yy_initial_dtrans (int state) {");
+	m_outstream.println("\t\treturn yy_state_dtrans[state];");
+	m_outstream.println("\t}");*/
+
+	/* Function: yy_advance */
+	m_outstream.println("\tprivate int yy_advance ()");
+	m_outstream.println("\t\tthrows java.io.IOException {");
+	/*m_outstream.println("\t\t{");*/
+	m_outstream.println("\t\tint next_read;");
+	m_outstream.println("\t\tint i;");
+	m_outstream.println("\t\tint j;");
+	m_outstream.println();
+
+	m_outstream.println("\t\tif (yy_buffer_index < yy_buffer_read) {");
+	m_outstream.println("\t\t\treturn yy_buffer[yy_buffer_index++];");
+	/*m_outstream.println("\t\t\t++yy_buffer_index;");*/
+	m_outstream.println("\t\t}");
+	m_outstream.println();
+
+	m_outstream.println("\t\tif (0 != yy_buffer_start) {");
+	m_outstream.println("\t\t\ti = yy_buffer_start;");
+	m_outstream.println("\t\t\tj = 0;");
+	m_outstream.println("\t\t\twhile (i < yy_buffer_read) {");
+	m_outstream.println("\t\t\t\tyy_buffer[j] = yy_buffer[i];");
+	m_outstream.println("\t\t\t\t++i;");
+	m_outstream.println("\t\t\t\t++j;");
+	m_outstream.println("\t\t\t}");
+	m_outstream.println("\t\t\tyy_buffer_end = yy_buffer_end - yy_buffer_start;");
+	m_outstream.println("\t\t\tyy_buffer_start = 0;");
+	m_outstream.println("\t\t\tyy_buffer_read = j;");
+	m_outstream.println("\t\t\tyy_buffer_index = j;");
+	m_outstream.println("\t\t\tnext_read = yy_reader.read(yy_buffer,");
+	m_outstream.println("\t\t\t\t\tyy_buffer_read,");
+	m_outstream.println("\t\t\t\t\tyy_buffer.length - yy_buffer_read);");
+	m_outstream.println("\t\t\tif (-1 == next_read) {");
+	m_outstream.println("\t\t\t\treturn YY_EOF;");
+	m_outstream.println("\t\t\t}");
+	m_outstream.println("\t\t\tyy_buffer_read = yy_buffer_read + next_read;");
+	m_outstream.println("\t\t}");
+	m_outstream.println();
+
+	m_outstream.println("\t\twhile (yy_buffer_index >= yy_buffer_read) {");
+	m_outstream.println("\t\t\tif (yy_buffer_index >= yy_buffer.length) {");
+	m_outstream.println("\t\t\t\tyy_buffer = yy_double(yy_buffer);");
+	m_outstream.println("\t\t\t}");
+	m_outstream.println("\t\t\tnext_read = yy_reader.read(yy_buffer,");
+	m_outstream.println("\t\t\t\t\tyy_buffer_read,");
+	m_outstream.println("\t\t\t\t\tyy_buffer.length - yy_buffer_read);");
+	m_outstream.println("\t\t\tif (-1 == next_read) {");
+	m_outstream.println("\t\t\t\treturn YY_EOF;");
+	m_outstream.println("\t\t\t}");
+	m_outstream.println("\t\t\tyy_buffer_read = yy_buffer_read + next_read;");
+	m_outstream.println("\t\t}");
+
+	m_outstream.println("\t\treturn yy_buffer[yy_buffer_index++];");
+	m_outstream.println("\t}");
+	
+	/* Function: yy_move_end */
+	m_outstream.println("\tprivate void yy_move_end () {");
+	m_outstream.println("\t\tif (yy_buffer_end > yy_buffer_start &&");
+	m_outstream.println("\t\t    '\\n' == yy_buffer[yy_buffer_end-1])");
+	m_outstream.println("\t\t\tyy_buffer_end--;");
+	m_outstream.println("\t\tif (yy_buffer_end > yy_buffer_start &&");
+	m_outstream.println("\t\t    '\\r' == yy_buffer[yy_buffer_end-1])");
+	m_outstream.println("\t\t\tyy_buffer_end--;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_mark_start */
+	m_outstream.println("\tprivate boolean yy_last_was_cr=false;");
+	m_outstream.println("\tprivate void yy_mark_start () {");
+	if (m_spec.m_count_lines || true == m_spec.m_count_chars)
+	  {
+	    if (m_spec.m_count_lines)
+	      {
+		m_outstream.println("\t\tint i;");
+		m_outstream.println("\t\tfor (i = yy_buffer_start; " 
+				       + "i < yy_buffer_index; ++i) {");
+		m_outstream.println("\t\t\tif ('\\n' == yy_buffer[i] && !yy_last_was_cr) {");
+		m_outstream.println("\t\t\t\t++yyline;");
+		m_outstream.println("\t\t\t}");
+		m_outstream.println("\t\t\tif ('\\r' == yy_buffer[i]) {");
+		m_outstream.println("\t\t\t\t++yyline;");
+		m_outstream.println("\t\t\t\tyy_last_was_cr=true;");
+		m_outstream.println("\t\t\t} else yy_last_was_cr=false;");
+		m_outstream.println("\t\t}");
+	      }
+	    if (m_spec.m_count_chars)
+	      {
+		m_outstream.println("\t\tyychar = yychar"); 
+		m_outstream.println("\t\t\t+ yy_buffer_index - yy_buffer_start;");
+	      }
+	  }
+	m_outstream.println("\t\tyy_buffer_start = yy_buffer_index;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_mark_end */
+	m_outstream.println("\tprivate void yy_mark_end () {");
+	m_outstream.println("\t\tyy_buffer_end = yy_buffer_index;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_to_mark */
+	m_outstream.println("\tprivate void yy_to_mark () {");
+	m_outstream.println("\t\tyy_buffer_index = yy_buffer_end;");
+	m_outstream.println("\t\tyy_at_bol = "+
+			    "(yy_buffer_end > yy_buffer_start) &&");
+	m_outstream.println("\t\t            "+
+			    "('\\r' == yy_buffer[yy_buffer_end-1] ||");
+	m_outstream.println("\t\t            "+
+			    " '\\n' == yy_buffer[yy_buffer_end-1] ||");
+	m_outstream.println("\t\t            "+ /* unicode LS */
+			    " 2028/*LS*/ == yy_buffer[yy_buffer_end-1] ||");
+	m_outstream.println("\t\t            "+ /* unicode PS */
+			    " 2029/*PS*/ == yy_buffer[yy_buffer_end-1]);");
+	m_outstream.println("\t}");
+
+	/* Function: yytext */
+	m_outstream.println("\tprivate java.lang.String yytext () {");
+	m_outstream.println("\t\treturn (new java.lang.String(yy_buffer,");
+	m_outstream.println("\t\t\tyy_buffer_start,");
+	m_outstream.println("\t\t\tyy_buffer_end - yy_buffer_start));");
+	m_outstream.println("\t}");
+
+	/* Function: yylength */
+	m_outstream.println("\tprivate int yylength () {");
+	m_outstream.println("\t\treturn yy_buffer_end - yy_buffer_start;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_double */
+	m_outstream.println("\tprivate char[] yy_double (char buf[]) {");
+	m_outstream.println("\t\tint i;");
+	m_outstream.println("\t\tchar newbuf[];");
+	m_outstream.println("\t\tnewbuf = new char[2*buf.length];");
+	m_outstream.println("\t\tfor (i = 0; i < buf.length; ++i) {");
+	m_outstream.println("\t\t\tnewbuf[i] = buf[i];");
+	m_outstream.println("\t\t}");
+	m_outstream.println("\t\treturn newbuf;");
+	m_outstream.println("\t}");
+
+	/* Function: yy_error */
+	m_outstream.println("\tprivate final int YY_E_INTERNAL = 0;");
+	m_outstream.println("\tprivate final int YY_E_MATCH = 1;");
+	m_outstream.println("\tprivate java.lang.String yy_error_string[] = {");
+	m_outstream.println("\t\t\"Error: Internal error.\\n\",");
+	m_outstream.println("\t\t\"Error: Unmatched input.\\n\"");
+	m_outstream.println("\t};");
+	m_outstream.println("\tprivate void yy_error (int code,boolean fatal) {");
+	m_outstream.println("\t\tjava.lang.System.out.print(yy_error_string[code]);");
+	m_outstream.println("\t\tjava.lang.System.out.flush();");
+	m_outstream.println("\t\tif (fatal) {");
+	m_outstream.println("\t\t\tthrow new Error(\"Fatal Error.\\n\");");
+	m_outstream.println("\t\t}");
+	m_outstream.println("\t}");
+
+	/* Function: yy_next */
+	/*m_outstream.println("\tprivate int yy_next (int current,char lookahead) {");
+	m_outstream.println("\t\treturn yy_nxt[yy_rmap[current]][yy_cmap[lookahead]];");
+	m_outstream.println("\t}");*/
+
+	/* Function: yy_accept */
+	/*m_outstream.println("\tprivate int yy_accept (int current) {");
+	m_outstream.println("\t\treturn yy_acpt[current];");
+	m_outstream.println("\t}");*/
+
+
+	// Function: private int [][] unpackFromString(int size1, int size2, String st)
+	// Added 6/24/98 Raimondas Lencevicius
+	// May be made more efficient by replacing String operations
+	// Assumes correctly formed input String. Performs no error checking
+	m_outstream.println("\tprivate int[][] unpackFromString"+
+			    "(int size1, int size2, String st) {");
+	m_outstream.println("\t\tint colonIndex = -1;");
+	m_outstream.println("\t\tString lengthString;");
+	m_outstream.println("\t\tint sequenceLength = 0;");
+	m_outstream.println("\t\tint sequenceInteger = 0;");
+	m_outstream.println();
+	m_outstream.println("\t\tint commaIndex;");
+	m_outstream.println("\t\tString workString;");
+	m_outstream.println();
+	m_outstream.println("\t\tint res[][] = new int[size1][size2];");
+	m_outstream.println("\t\tfor (int i= 0; i < size1; i++) {");
+	m_outstream.println("\t\t\tfor (int j= 0; j < size2; j++) {");
+	m_outstream.println("\t\t\t\tif (sequenceLength != 0) {");
+	m_outstream.println("\t\t\t\t\tres[i][j] = sequenceInteger;");
+	m_outstream.println("\t\t\t\t\tsequenceLength--;");
+	m_outstream.println("\t\t\t\t\tcontinue;");
+	m_outstream.println("\t\t\t\t}");
+	m_outstream.println("\t\t\t\tcommaIndex = st.indexOf(',');");
+	m_outstream.println("\t\t\t\tworkString = (commaIndex==-1) ? st :");
+	m_outstream.println("\t\t\t\t\tst.substring(0, commaIndex);");
+	m_outstream.println("\t\t\t\tst = st.substring(commaIndex+1);");  
+	m_outstream.println("\t\t\t\tcolonIndex = workString.indexOf(':');");
+	m_outstream.println("\t\t\t\tif (colonIndex == -1) {");
+	m_outstream.println("\t\t\t\t\tres[i][j]=Integer.parseInt(workString);");
+	m_outstream.println("\t\t\t\t\tcontinue;");
+	m_outstream.println("\t\t\t\t}");
+	m_outstream.println("\t\t\t\tlengthString =");
+	m_outstream.println("\t\t\t\t\tworkString.substring(colonIndex+1);");
+	m_outstream.println("\t\t\t\tsequenceLength="+
+			    "Integer.parseInt(lengthString);");
+	m_outstream.println("\t\t\t\tworkString="+
+			    "workString.substring(0,colonIndex);");
+	m_outstream.println("\t\t\t\tsequenceInteger="+
+			    "Integer.parseInt(workString);");
+	m_outstream.println("\t\t\t\tres[i][j] = sequenceInteger;");
+	m_outstream.println("\t\t\t\tsequenceLength--;");
+	m_outstream.println("\t\t\t}");
+	m_outstream.println("\t\t}");
+	m_outstream.println("\t\treturn res;");
+	m_outstream.println("\t}");
+      }
+
+  /***************************************************************
+    Function: emit_header
+    Description: Emits class header.
+    **************************************************************/
+  private void emit_header
+    (
+     )
+      throws java.io.IOException
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(null != m_outstream);
+	  }
+
+	m_outstream.println();
+	m_outstream.println();
+	if (true == m_spec.m_public) {
+	  m_outstream.print("public ");
+	}
+	m_outstream.print("class ");
+	m_outstream.print(new String(m_spec.m_class_name,0,
+					  m_spec.m_class_name.length));
+        if (m_spec.m_implements_name.length > 0) {
+	   m_outstream.print(" implements ");	
+	   m_outstream.print(new String(m_spec.m_implements_name,0,
+					  m_spec.m_implements_name.length));
+	}	  
+	m_outstream.println(" {");
+      }
+
+  /***************************************************************
+    Function: emit_table
+    Description: Emits transition table.
+    **************************************************************/
+  private void emit_table
+    (
+     )
+      throws java.io.IOException
+      {
+	int i;
+	int elem;
+	int size;
+	CDTrans dtrans;
+	boolean is_start;
+	boolean is_end;
+	CAccept accept;
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(null != m_outstream);
+	  }
+
+	m_outstream.println("\tprivate int yy_acpt[] = {");
+	size = m_spec.m_accept_vector.size();
+	for (elem = 0; elem < size; ++elem)
+	  {
+	    accept = (CAccept) m_spec.m_accept_vector.elementAt(elem);
+	    
+	    m_outstream.print("\t\t/* "+elem+" */ ");
+	    if (null != accept)
+	      {
+		is_start = (0 != (m_spec.m_anchor_array[elem] & CSpec.START));
+		is_end = (0 != (m_spec.m_anchor_array[elem] & CSpec.END));
+		
+		if (is_start && true == is_end)
+		  {
+		    m_outstream.print("YY_START | YY_END");
+		  }
+		else if (is_start)
+		  {
+		    m_outstream.print("YY_START");
+		  }
+		else if (is_end)
+		  {
+		    m_outstream.print("YY_END");
+		  }
+		else
+		  {
+		    m_outstream.print("YY_NO_ANCHOR");
+		  }
+	      }
+	    else 
+	      {
+		m_outstream.print("YY_NOT_ACCEPT");
+	      }
+	    
+	    if (elem < size - 1)
+	      {
+		m_outstream.print(",");
+	      }
+	    
+	    m_outstream.println();
+	  }
+	m_outstream.println("\t};");
+
+	// CSA: modified yy_cmap to use string packing 9-Aug-1999
+	int[] yy_cmap = new int[m_spec.m_ccls_map.length];
+	for (i = 0; i < m_spec.m_ccls_map.length; ++i)
+	    yy_cmap[i] = m_spec.m_col_map[m_spec.m_ccls_map[i]];
+	m_outstream.print("\tprivate int yy_cmap[] = unpackFromString(");
+	emit_table_as_string(new int[][] { yy_cmap });
+	m_outstream.println(")[0];");
+	m_outstream.println();
+
+	// CSA: modified yy_rmap to use string packing 9-Aug-1999
+	m_outstream.print("\tprivate int yy_rmap[] = unpackFromString(");
+	emit_table_as_string(new int[][] { m_spec.m_row_map });
+	m_outstream.println(")[0];");
+	m_outstream.println();
+
+	// 6/24/98 Raimondas Lencevicius
+	// modified to use
+	//    int[][] unpackFromString(int size1, int size2, String st)
+	size = m_spec.m_dtrans_vector.size();
+	int[][] yy_nxt = new int[size][];
+	for (elem=0; elem<size; elem++) {
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(elem);
+	    CUtility.ASSERT(dtrans.m_dtrans.length==m_spec.m_dtrans_ncols);
+	    yy_nxt[elem] = dtrans.m_dtrans;
+	}
+	m_outstream.print
+	  ("\tprivate int yy_nxt[][] = unpackFromString(");
+	emit_table_as_string(yy_nxt);
+	m_outstream.println(");");
+	m_outstream.println();
+      }
+
+  /***************************************************************
+    Function: emit_driver
+    Description: Output an integer table as a string.  Written by
+    Raimondas Lencevicius 6/24/98; reorganized by CSA 9-Aug-1999.
+    From his original comments:
+	   yy_nxt[][] values are coded into a string
+	   by printing integers and representing
+	   integer sequences as "value:length" pairs.
+    **************************************************************/
+  private void emit_table_as_string(int[][] ia) {
+	int sequenceLength = 0; // RL - length of the number sequence
+	boolean sequenceStarted = false; // RL - has number sequence started?
+	int previousInt = -20; // RL - Bogus -20 state.
+	
+	// RL - Output matrix size
+	m_outstream.print(ia.length);
+	m_outstream.print(",");
+	m_outstream.print(ia.length>0?ia[0].length:0);
+	m_outstream.println(",");
+
+	StringBuffer outstr = new StringBuffer();
+
+	//  RL - Output matrix 
+	for (int elem = 0; elem < ia.length; ++elem)
+	  {
+	    for (int i = 0; i < ia[elem].length; ++i)
+	      {
+		int writeInt = ia[elem][i];
+		if (writeInt == previousInt) // RL - sequence?
+		  {
+		    if (sequenceStarted)
+		      {
+			sequenceLength++;
+		      }
+		    else
+		      {
+			outstr.append(writeInt);
+			outstr.append(":");
+			sequenceLength = 2;
+			sequenceStarted = true;
+		      }
+		  }
+		else // RL - no sequence or end sequence
+		  {
+		    if (sequenceStarted)
+		      {
+			outstr.append(sequenceLength);
+			outstr.append(",");
+			sequenceLength = 0;
+			sequenceStarted = false;
+		      }
+		    else
+		      {
+			if (previousInt != -20)
+			  {
+			    outstr.append(previousInt);
+			    outstr.append(",");
+			  }
+		      }
+		  }
+		previousInt = writeInt;
+		// CSA: output in 75 character chunks.
+		if (outstr.length() > 75) {
+		  String s = outstr.toString();
+		  m_outstream.println("\""+s.substring(0,75)+"\" +");
+		  outstr = new StringBuffer(s.substring(75));
+		}
+	      }
+	  }
+	if (sequenceStarted)
+	  {
+	    outstr.append(sequenceLength);
+	  }
+	else
+	  {
+	    outstr.append(previousInt);
+	  }    
+	// CSA: output in 75 character chunks.
+	if (outstr.length() > 75) {
+	  String s = outstr.toString();
+	  m_outstream.println("\""+s.substring(0,75)+"\" +");
+	  outstr = new StringBuffer(s.substring(75));
+	}
+	m_outstream.print("\""+outstr+"\"");
+  }
+
+  /***************************************************************
+    Function: emit_driver
+    Description: 
+    **************************************************************/
+  private void emit_driver
+    (
+     )
+      throws java.io.IOException
+	{
+	  if (CUtility.DEBUG)
+	    {
+	      CUtility.ASSERT(null != m_spec);
+	      CUtility.ASSERT(null != m_outstream);
+	    }
+	  
+	  emit_table();
+
+	  if (m_spec.m_integer_type)
+	    {
+	      m_outstream.print("\tpublic int ");
+	      m_outstream.print(new String(m_spec.m_function_name));
+	      m_outstream.println(" ()");
+	    }
+	  else if (m_spec.m_intwrap_type)
+	    {
+	      m_outstream.print("\tpublic java.lang.Integer ");
+	      m_outstream.print(new String(m_spec.m_function_name));
+	      m_outstream.println(" ()");
+	    }
+	  else
+	    {
+	      m_outstream.print("\tpublic ");
+	      m_outstream.print(new String(m_spec.m_type_name));
+	      m_outstream.print(" ");
+	      m_outstream.print(new String(m_spec.m_function_name));
+	      m_outstream.println(" ()");
+	    }
+
+	  /*m_outstream.println("\t\tthrows java.io.IOException {");*/
+	  m_outstream.print("\t\tthrows java.io.IOException");
+	  if (null != m_spec.m_yylex_throw_code)
+	    {
+	      m_outstream.print(", "); 
+	      m_outstream.print(new String(m_spec.m_yylex_throw_code,0,
+						m_spec.m_yylex_throw_read));
+	      m_outstream.println();
+	      m_outstream.println("\t\t{");
+	    }
+	  else
+	    {
+	      m_outstream.println(" {");
+	    }
+
+	  m_outstream.println("\t\tint yy_lookahead;");
+	  m_outstream.println("\t\tint yy_anchor = YY_NO_ANCHOR;");
+	  /*m_outstream.println("\t\tint yy_state "
+	    + "= yy_initial_dtrans(yy_lexical_state);");*/
+	  m_outstream.println("\t\tint yy_state " 
+				 + "= yy_state_dtrans[yy_lexical_state];");
+	  m_outstream.println("\t\tint yy_next_state = YY_NO_STATE;");
+	  /*m_outstream.println("\t\tint yy_prev_stave = YY_NO_STATE;");*/
+	  m_outstream.println("\t\tint yy_last_accept_state = YY_NO_STATE;");
+    	  m_outstream.println("\t\tboolean yy_initial = true;");
+	  m_outstream.println("\t\tint yy_this_accept;");
+	  m_outstream.println();
+
+	  m_outstream.println("\t\tyy_mark_start();");
+	  /*m_outstream.println("\t\tyy_this_accept = yy_accept(yy_state);");*/
+	  m_outstream.println("\t\tyy_this_accept = yy_acpt[yy_state];");
+	  m_outstream.println("\t\tif (YY_NOT_ACCEPT != yy_this_accept) {");
+	  m_outstream.println("\t\t\tyy_last_accept_state = yy_state;");
+	  m_outstream.println("\t\t\tyy_mark_end();");
+	  m_outstream.println("\t\t}");
+
+	  if (NOT_EDBG)
+	    {
+	      m_outstream.println("\t\tjava.lang.System.out.println(\"Begin\");");
+	    }
+
+	  m_outstream.println("\t\twhile (true) {");
+
+	  m_outstream.println("\t\t\tif (yy_initial && yy_at_bol) "+
+			                 "yy_lookahead = YY_BOL;");
+	  m_outstream.println("\t\t\telse yy_lookahead = yy_advance();");
+	  m_outstream.println("\t\t\tyy_next_state = YY_F;");
+	  /*m_outstream.println("\t\t\t\tyy_next_state = "
+				 + "yy_next(yy_state,yy_lookahead);");*/
+	  m_outstream.println("\t\t\tyy_next_state = "
+ 	   + "yy_nxt[yy_rmap[yy_state]][yy_cmap[yy_lookahead]];");
+
+	  if (NOT_EDBG)
+	    {
+	      m_outstream.println("java.lang.System.out.println(\"Current state: \"" 
+				     + " + yy_state");
+	      m_outstream.println("+ \"\tCurrent input: \""); 
+	      m_outstream.println(" + ((char) yy_lookahead));");
+	    }
+	  if (NOT_EDBG)
+	    {
+	      m_outstream.println("\t\t\tjava.lang.System.out.println(\"State = \"" 
+				     + "+ yy_state);");
+	      m_outstream.println("\t\t\tjava.lang.System.out.println(\"Accepting status = \"" 
+				     + "+ yy_this_accept);");
+	      m_outstream.println("\t\t\tjava.lang.System.out.println(\"Last accepting state = \"" 
+				     + "+ yy_last_accept_state);");
+	      m_outstream.println("\t\t\tjava.lang.System.out.println(\"Next state = \"" 
+				     + "+ yy_next_state);");
+	      m_outstream.println("\t\t\tjava.lang.System.out.println(\"Lookahead input = \"" 
+				     + "+ ((char) yy_lookahead));");
+	    }
+
+	  // handle bare EOF.
+	  m_outstream.println("\t\t\tif (YY_EOF == yy_lookahead " 
+				 + "&& true == yy_initial) {");
+	  if (null != m_spec.m_eof_code)
+	    {
+	      m_outstream.println("\t\t\t\tyy_do_eof();");
+	    }
+	  if (true == m_spec.m_integer_type)
+	    {
+	      m_outstream.println("\t\t\t\treturn YYEOF;");
+	    }
+	  else if (null != m_spec.m_eof_value_code) 
+	    {
+	      m_outstream.print(new String(m_spec.m_eof_value_code,0,
+						m_spec.m_eof_value_read));
+	    }
+	  else
+	    {
+	      m_outstream.println("\t\t\t\treturn null;");
+	    }
+	  m_outstream.println("\t\t\t}");
+
+	  m_outstream.println("\t\t\tif (YY_F != yy_next_state) {");
+	  m_outstream.println("\t\t\t\tyy_state = yy_next_state;");
+     	  m_outstream.println("\t\t\t\tyy_initial = false;");
+     	  /*m_outstream.println("\t\t\t\tyy_this_accept = yy_accept(yy_state);");*/
+	  m_outstream.println("\t\t\t\tyy_this_accept = yy_acpt[yy_state];");
+	  m_outstream.println("\t\t\t\tif (YY_NOT_ACCEPT != yy_this_accept) {");
+	  m_outstream.println("\t\t\t\t\tyy_last_accept_state = yy_state;");
+	  m_outstream.println("\t\t\t\t\tyy_mark_end();");
+	  m_outstream.println("\t\t\t\t}");
+	  /*m_outstream.println("\t\t\t\tyy_prev_state = yy_state;");*/
+	  /*m_outstream.println("\t\t\t\tyy_state = yy_next_state;");*/
+	  m_outstream.println("\t\t\t}");
+
+	  m_outstream.println("\t\t\telse {");
+	  
+	  m_outstream.println("\t\t\t\tif (YY_NO_STATE == yy_last_accept_state) {");
+	  
+
+	  /*m_outstream.println("\t\t\t\t\tyy_error(YY_E_MATCH,false);");
+    	  m_outstream.println("\t\t\t\t\tyy_initial = true;");
+	  m_outstream.println("\t\t\t\t\tyy_state "
+				 + "= yy_state_dtrans[yy_lexical_state];");
+	  m_outstream.println("\t\t\t\t\tyy_next_state = YY_NO_STATE;");*/
+	  /*m_outstream.println("\t\t\t\t\tyy_prev_state = YY_NO_STATE;");*/
+	  /*m_outstream.println("\t\t\t\t\tyy_last_accept_state = YY_NO_STATE;");
+	  m_outstream.println("\t\t\t\t\tyy_mark_start();");*/
+	  /*m_outstream.println("\t\t\t\t\tyy_this_accept = yy_accept(yy_state);");*/
+	  /*m_outstream.println("\t\t\t\t\tyy_this_accept = yy_acpt[yy_state];");
+	  m_outstream.println("\t\t\t\t\tif (YY_NOT_ACCEPT != yy_this_accept) {");
+	  m_outstream.println("\t\t\t\t\t\tyy_last_accept_state = yy_state;");
+	  m_outstream.println("\t\t\t\t\t}");*/
+
+	  m_outstream.println("\t\t\t\t\tthrow (new Error(\"Lexical Error: Unmatched Input.\"));");
+	  m_outstream.println("\t\t\t\t}");
+
+	  m_outstream.println("\t\t\t\telse {");
+
+	  m_outstream.println("\t\t\t\t\tyy_anchor = yy_acpt[yy_last_accept_state];");
+	  /*m_outstream.println("\t\t\t\t\tyy_anchor " 
+	    + "= yy_accept(yy_last_accept_state);");*/
+	  m_outstream.println("\t\t\t\t\tif (0 != (YY_END & yy_anchor)) {");
+	  m_outstream.println("\t\t\t\t\t\tyy_move_end();");
+	  m_outstream.println("\t\t\t\t\t}");
+	  m_outstream.println("\t\t\t\t\tyy_to_mark();");
+
+	  m_outstream.println("\t\t\t\t\tswitch (yy_last_accept_state) {");
+
+	  emit_actions("\t\t\t\t\t");
+
+	  m_outstream.println("\t\t\t\t\tdefault:");
+	  m_outstream.println("\t\t\t\t\t\tyy_error(YY_E_INTERNAL,false);");
+	  /*m_outstream.println("\t\t\t\t\t\treturn null;");*/
+	  m_outstream.println("\t\t\t\t\tcase -1:");
+	  m_outstream.println("\t\t\t\t\t}");
+	  
+    	  m_outstream.println("\t\t\t\t\tyy_initial = true;");
+	  m_outstream.println("\t\t\t\t\tyy_state "
+				 + "= yy_state_dtrans[yy_lexical_state];");
+	  m_outstream.println("\t\t\t\t\tyy_next_state = YY_NO_STATE;");
+	  /*m_outstream.println("\t\t\t\t\tyy_prev_state = YY_NO_STATE;");*/
+	  m_outstream.println("\t\t\t\t\tyy_last_accept_state = YY_NO_STATE;");
+
+	  m_outstream.println("\t\t\t\t\tyy_mark_start();");
+
+	  /*m_outstream.println("\t\t\t\t\tyy_this_accept = yy_accept(yy_state);");*/
+	  m_outstream.println("\t\t\t\t\tyy_this_accept = yy_acpt[yy_state];");
+	  m_outstream.println("\t\t\t\t\tif (YY_NOT_ACCEPT != yy_this_accept) {");
+	  m_outstream.println("\t\t\t\t\t\tyy_last_accept_state = yy_state;");
+	  m_outstream.println("\t\t\t\t\t\tyy_mark_end();");
+	  m_outstream.println("\t\t\t\t\t}");
+
+	  m_outstream.println("\t\t\t\t}");	  
+	  m_outstream.println("\t\t\t}");
+	  m_outstream.println("\t\t}");
+	  m_outstream.println("\t}");
+
+	  /*m_outstream.println("\t\t\t\t");
+	  m_outstream.println("\t\t\t");
+	  m_outstream.println("\t\t\t");
+	  m_outstream.println("\t\t\t");
+	  m_outstream.println("\t\t\t");
+	  m_outstream.println("\t\t}");*/
+	}
+  
+  /***************************************************************
+    Function: emit_actions
+    Description:     
+    **************************************************************/
+  private void emit_actions 
+    (
+     String tabs
+     )
+      throws java.io.IOException
+	{
+	  int elem;
+	  int size;
+	  int bogus_index;
+	  CAccept accept;
+	  
+	  if (CUtility.DEBUG)
+	    {
+	      CUtility.ASSERT(m_spec.m_accept_vector.size() 
+			      == m_spec.m_anchor_array.length);
+	    }
+
+	  bogus_index = -2;
+	  size = m_spec.m_accept_vector.size();
+	  for (elem = 0; elem < size; ++elem)
+	    {
+	      accept = (CAccept) m_spec.m_accept_vector.elementAt(elem);
+	      if (null != accept) 
+		{
+		  m_outstream.println(tabs + "case " + elem 
+					 + ":");
+		  m_outstream.print(tabs + "\t");
+		  m_outstream.print(new String(accept.m_action,0,
+						    accept.m_action_read));
+		  m_outstream.println();
+		  m_outstream.println(tabs + "case " + bogus_index + ":");
+		  m_outstream.println(tabs + "\tbreak;");
+		  --bogus_index;
+		}
+	    }
+	}
+  
+  /***************************************************************
+    Function: emit_footer
+    Description:     
+    **************************************************************/
+  private void emit_footer
+    (
+     )
+      throws java.io.IOException
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(null != m_outstream);
+	  }
+
+	m_outstream.println("}");
+      }
+}
+
+/***************************************************************
+  Class: CBunch
+  **************************************************************/
+class CBunch
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  Vector m_nfa_set; /* Vector of CNfa states in dfa state. */
+  SparseBitSet m_nfa_bit; /* BitSet representation of CNfa labels. */
+  CAccept m_accept; /* Accepting actions, or null if nonaccepting state. */
+  int m_anchor; /* Anchors on regular expression. */
+  int m_accept_index; /* CNfa index corresponding to accepting actions. */
+
+  /***************************************************************
+    Function: CBunch
+    Description: Constructor.
+    **************************************************************/
+  CBunch
+    (
+     )
+      {
+	m_nfa_set = null;
+	m_nfa_bit = null;
+	m_accept = null;
+	m_anchor = CSpec.NONE;
+	m_accept_index = -1;
+      }
+}
+
+/***************************************************************
+  Class: CMakeNfa
+  **************************************************************/
+class CMakeNfa
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  private CSpec m_spec;
+  private CLexGen m_lexGen;
+  private CInput m_input;
+
+  /***************************************************************
+    Function: CMakeNfa
+    Description: Constructor.
+    **************************************************************/
+  CMakeNfa
+    (
+     )
+      {
+	reset();
+      }
+
+  /***************************************************************
+    Function: reset
+    Description: Resets CMakeNfa member variables.
+    **************************************************************/
+  private void reset
+    (
+     )
+      {
+	m_input = null;
+	m_lexGen = null;
+	m_spec = null;
+      }
+
+  /***************************************************************
+    Function: set
+    Description: Sets CMakeNfa member variables.
+    **************************************************************/
+  private void set
+    (
+     CLexGen lexGen,
+     CSpec spec,
+     CInput input
+     )
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != input);
+	    CUtility.ASSERT(null != lexGen);
+	    CUtility.ASSERT(null != spec);
+	  }
+
+	m_input = input;
+	m_lexGen = lexGen;
+	m_spec = spec;
+      }
+
+  /***************************************************************
+    Function: allocate_BOL_EOF
+    Description: Expands character class to include special BOL and
+    EOF characters.  Puts numeric index of these characters in
+    input CSpec.
+    **************************************************************/
+  void allocate_BOL_EOF
+    (
+     CSpec spec
+     )
+	{
+	  CUtility.ASSERT(CSpec.NUM_PSEUDO==2);
+	  spec.BOL = spec.m_dtrans_ncols++;
+	  spec.EOF = spec.m_dtrans_ncols++;
+	}
+
+  /***************************************************************
+    Function: thompson
+    Description: High level access function to module.
+    Deposits result in input CSpec.
+    **************************************************************/
+  void thompson
+    (
+     CLexGen lexGen,
+     CSpec spec,
+     CInput input
+     )
+      throws java.io.IOException      
+	{
+	  int i;
+	  CNfa elem;
+	  int size;
+
+	  /* Set member variables. */
+	  reset();
+	  set(lexGen,spec,input);
+
+	  size = m_spec.m_states.size();
+	  m_spec.m_state_rules = new Vector[size];
+	  for (i = 0; i < size; ++i)
+	    {
+	      m_spec.m_state_rules[i] = new Vector();
+	    }
+
+	  /* Initialize current token variable 
+	     and create nfa. */
+	  /*m_spec.m_current_token = m_lexGen.EOS;
+	  m_lexGen.advance();*/
+
+	  m_spec.m_nfa_start = machine();
+	  
+	  /* Set labels in created nfa machine. */
+	  size = m_spec.m_nfa_states.size();
+	  for (i = 0; i < size; ++i)
+	    {
+	      elem = (CNfa) m_spec.m_nfa_states.elementAt(i);
+	      elem.m_label = i;
+	    }
+
+	  /* Debugging output. */
+	  if (CUtility.DO_DEBUG)
+	    {
+	      m_lexGen.print_nfa();
+	    }
+
+	  if (m_spec.m_verbose)
+	    {
+	      System.out.println("NFA comprised of " 
+				 + (m_spec.m_nfa_states.size() + 1) 
+				 + " states.");
+	    }
+
+	  reset();
+	}
+     
+  /***************************************************************
+    Function: discardCNfa
+    Description: 
+    **************************************************************/
+  private void discardCNfa
+    (
+     CNfa nfa
+     )
+      {
+	m_spec.m_nfa_states.removeElement(nfa);
+      }
+
+  /***************************************************************
+    Function: processStates
+    Description:
+    **************************************************************/
+  private void processStates
+    (
+     SparseBitSet states,
+     CNfa current
+     )
+      {
+	int size;
+	int i;
+	
+	size = m_spec.m_states.size();
+	for (i = 0; i <  size; ++i)
+	  {
+	    if (states.get(i))
+	      {
+		m_spec.m_state_rules[i].addElement(current);
+	      }
+	  }
+      }
+
+  /***************************************************************
+    Function: machine
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private CNfa machine
+    (
+     )
+      throws java.io.IOException 
+      {
+	CNfa start;
+	CNfa p;
+	SparseBitSet states;
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("machine",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	start = CAlloc.newCNfa(m_spec);
+	p = start;
+	    
+	states = m_lexGen.getStates();
+
+	/* Begin: Added for states. */
+	m_spec.m_current_token = m_lexGen.EOS;
+	m_lexGen.advance();
+	/* End: Added for states. */
+	
+	if (m_lexGen.END_OF_INPUT != m_spec.m_current_token) // CSA fix.
+	  {
+	    p.m_next = rule();
+	    
+	    processStates(states,p.m_next);
+	  }
+
+	while (m_lexGen.END_OF_INPUT != m_spec.m_current_token)
+	  {
+	    /* Make state changes HERE. */
+	    states = m_lexGen.getStates();
+	
+	    /* Begin: Added for states. */
+	    m_lexGen.advance();
+	    if (m_lexGen.END_OF_INPUT == m_spec.m_current_token)
+	      { 
+		break;
+	      }
+	    /* End: Added for states. */
+	    
+	    p.m_next2 = CAlloc.newCNfa(m_spec);
+	    p = p.m_next2;
+	    p.m_next = rule();
+	    
+	    processStates(states,p.m_next);
+	  }
+
+	// CSA: add pseudo-rules for BOL and EOF
+	SparseBitSet all_states = new SparseBitSet();
+	for (int i = 0; i < m_spec.m_states.size(); ++i)
+		all_states.set(i);
+	p.m_next2 = CAlloc.newCNfa(m_spec);
+	p = p.m_next2;
+	p.m_next = CAlloc.newCNfa(m_spec);
+	p.m_next.m_edge = CNfa.CCL;
+	p.m_next.m_next = CAlloc.newCNfa(m_spec);
+	p.m_next.m_set = new CSet();
+	p.m_next.m_set.add(m_spec.BOL);
+	p.m_next.m_set.add(m_spec.EOF);
+	p.m_next.m_next.m_accept = // do-nothing accept rule
+	    new CAccept(new char[0], 0, m_input.m_line_number+1);
+	processStates(all_states,p.m_next);
+	// CSA: done. 
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("machine",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	return start;
+      }
+  
+  /***************************************************************
+    Function: rule
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private CNfa rule
+    (
+     )
+      throws java.io.IOException 
+      {
+	CNfaPair pair; 
+	CNfa p;
+	CNfa start = null;
+	CNfa end = null;
+	int anchor = CSpec.NONE;
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("rule",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	pair = CAlloc.newCNfaPair();
+
+	if (m_lexGen.AT_BOL == m_spec.m_current_token)
+	  {
+	    anchor = anchor | CSpec.START;
+	    m_lexGen.advance();
+	    expr(pair);
+
+	    // CSA: fixed beginning-of-line operator. 8-aug-1999
+	    start = CAlloc.newCNfa(m_spec);
+	    start.m_edge = m_spec.BOL;
+	    start.m_next = pair.m_start;
+	    end = pair.m_end;
+	  }
+	else
+	  {
+	    expr(pair);
+	    start = pair.m_start;
+	    end = pair.m_end;
+	  }
+
+	if (m_lexGen.AT_EOL == m_spec.m_current_token)
+	  {
+	    m_lexGen.advance();
+	    // CSA: fixed end-of-line operator. 8-aug-1999
+	    CNfaPair nlpair = CAlloc.newNLPair(m_spec);
+	    end.m_next = CAlloc.newCNfa(m_spec);
+	    end.m_next.m_next = nlpair.m_start;
+	    end.m_next.m_next2 = CAlloc.newCNfa(m_spec);
+	    end.m_next.m_next2.m_edge = m_spec.EOF;
+	    end.m_next.m_next2.m_next = nlpair.m_end;
+	    end = nlpair.m_end;
+	    anchor = anchor | CSpec.END;
+	  }
+
+	/* Check for null rules. Charles Fischer found this bug. [CSA] */
+	if (end==null)
+	    CError.parse_error(CError.E_ZERO, m_input.m_line_number);
+
+	/* Handle end of regular expression.  See page 103. */
+	end.m_accept = m_lexGen.packAccept();
+	end.m_anchor = anchor;
+
+	/* Begin: Removed for states. */
+	/*m_lexGen.advance();*/
+	/* End: Removed for states. */
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("rule",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	return start;
+      }
+	    
+  /***************************************************************
+    Function: expr
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private void expr
+    (
+     CNfaPair pair
+     )
+      throws java.io.IOException 
+      {
+	CNfaPair e2_pair;
+	CNfa p;
+	
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("expr",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != pair);
+	  }
+
+	e2_pair = CAlloc.newCNfaPair();
+
+	cat_expr(pair);
+	
+	while (m_lexGen.OR == m_spec.m_current_token)
+	  {
+	    m_lexGen.advance();
+	    cat_expr(e2_pair);
+
+	    p = CAlloc.newCNfa(m_spec);
+	    p.m_next2 = e2_pair.m_start;
+	    p.m_next = pair.m_start;
+	    pair.m_start = p;
+	    
+	    p = CAlloc.newCNfa(m_spec);
+	    pair.m_end.m_next = p;
+	    e2_pair.m_end.m_next = p;
+	    pair.m_end = p;
+	  }
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("expr",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+      }
+	    
+  /***************************************************************
+    Function: cat_expr
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private void cat_expr
+    (
+     CNfaPair pair
+     )
+      throws java.io.IOException 
+      {
+	CNfaPair e2_pair;
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("cat_expr",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != pair);
+	  }
+	
+	e2_pair = CAlloc.newCNfaPair();
+	
+	if (first_in_cat(m_spec.m_current_token))
+	  {
+	    factor(pair);
+	  }
+
+	while (first_in_cat(m_spec.m_current_token))
+	  {
+	    factor(e2_pair);
+
+	    /* Destroy */
+	    pair.m_end.mimic(e2_pair.m_start);
+	    discardCNfa(e2_pair.m_start);
+	    
+	    pair.m_end = e2_pair.m_end;
+	  }
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("cat_expr",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+      }
+  
+  /***************************************************************
+    Function: first_in_cat
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private boolean first_in_cat
+    (
+     int token
+     )
+      {
+	switch (token)
+	  {
+	  case CLexGen.CLOSE_PAREN:
+	  case CLexGen.AT_EOL:
+	  case CLexGen.OR:
+	  case CLexGen.EOS:
+	    return false;
+	    
+	  case CLexGen.CLOSURE:
+	  case CLexGen.PLUS_CLOSE:
+	  case CLexGen.OPTIONAL:
+	    CError.parse_error(CError.E_CLOSE,m_input.m_line_number);
+	    return false;
+
+	  case CLexGen.CCL_END:
+	    CError.parse_error(CError.E_BRACKET,m_input.m_line_number);
+	    return false;
+
+	  case CLexGen.AT_BOL:
+	    CError.parse_error(CError.E_BOL,m_input.m_line_number);
+	    return false;
+
+	  default:
+	    break;
+	  }
+
+	return true;
+      }
+
+  /***************************************************************
+    Function: factor
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private void factor
+    (
+     CNfaPair pair
+     )
+      throws java.io.IOException 
+      {
+	CNfa start = null;
+	CNfa end = null;
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("factor",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	term(pair);
+
+	if (m_lexGen.CLOSURE == m_spec.m_current_token
+	    || m_lexGen.PLUS_CLOSE == m_spec.m_current_token
+	    || m_lexGen.OPTIONAL == m_spec.m_current_token)
+	  {
+	    start = CAlloc.newCNfa(m_spec);
+	    end = CAlloc.newCNfa(m_spec);
+	    
+	    start.m_next = pair.m_start;
+	    pair.m_end.m_next = end;
+
+	    if (m_lexGen.CLOSURE == m_spec.m_current_token
+		|| m_lexGen.OPTIONAL == m_spec.m_current_token)
+	      {
+		start.m_next2 = end;
+	      }
+	    
+	    if (m_lexGen.CLOSURE == m_spec.m_current_token
+		|| m_lexGen.PLUS_CLOSE == m_spec.m_current_token)
+	      {
+		pair.m_end.m_next2 = pair.m_start;
+	      }
+	    
+	    pair.m_start = start;
+	    pair.m_end = end;
+	    m_lexGen.advance();
+	  }
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("factor",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+      }
+      
+  /***************************************************************
+    Function: term
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private void term
+    (
+     CNfaPair pair
+     )
+      throws java.io.IOException 
+      {
+	CNfa start;
+	boolean isAlphaL;
+	int c;
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.enter("term",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+
+	if (m_lexGen.OPEN_PAREN == m_spec.m_current_token)
+	  {
+	    m_lexGen.advance();
+	    expr(pair);
+
+	    if (m_lexGen.CLOSE_PAREN == m_spec.m_current_token)
+	      {
+		m_lexGen.advance();
+	      }
+	    else
+	      {
+		CError.parse_error(CError.E_SYNTAX,m_input.m_line_number);
+	      }
+	  }
+	else
+	  {
+	    start = CAlloc.newCNfa(m_spec);
+	    pair.m_start = start;
+
+	    start.m_next = CAlloc.newCNfa(m_spec);
+	    pair.m_end = start.m_next;
+
+	    if (m_lexGen.L == m_spec.m_current_token &&
+		Character.isLetter(m_spec.m_lexeme)) 
+	      {
+		isAlphaL = true;
+	      } 
+	    else 
+	      {
+		isAlphaL = false;
+	      }
+	    if (false == (m_lexGen.ANY == m_spec.m_current_token
+			  || m_lexGen.CCL_START == m_spec.m_current_token
+			  || (m_spec.m_ignorecase && isAlphaL)))
+	      {
+		start.m_edge = m_spec.m_lexeme;
+		m_lexGen.advance();
+	      }
+	    else
+	      {
+		start.m_edge = CNfa.CCL;
+		
+		start.m_set = new CSet();
+
+		/* Match case-insensitive letters using character class. */
+		if (m_spec.m_ignorecase && isAlphaL) 
+		  {
+		    start.m_set.addncase(m_spec.m_lexeme);
+		  }
+		/* Match dot (.) using character class. */
+		else if (m_lexGen.ANY == m_spec.m_current_token)
+		  {
+		    start.m_set.add('\n');
+		    start.m_set.add('\r');
+		    // CSA: exclude BOL and EOF from character classes
+		    start.m_set.add(m_spec.BOL);
+		    start.m_set.add(m_spec.EOF);
+		    start.m_set.complement();
+		  }
+		else
+		  {
+		    m_lexGen.advance();
+		    if (m_lexGen.AT_BOL == m_spec.m_current_token)
+		      {
+			m_lexGen.advance();
+
+			// CSA: exclude BOL and EOF from character classes
+			start.m_set.add(m_spec.BOL);
+			start.m_set.add(m_spec.EOF);
+			start.m_set.complement();
+		      }
+		    if (false == (m_lexGen.CCL_END == m_spec.m_current_token))
+		      {
+			dodash(start.m_set);
+		      }
+		    /*else
+		      {
+			for (c = 0; c <= ' '; ++c)
+			  {
+			    start.m_set.add((byte) c);
+			  }
+		      }*/
+		  }
+		m_lexGen.advance();
+	      }
+	  }
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("term",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+      }
+
+  /***************************************************************
+    Function: dodash
+    Description: Recursive descent regular expression parser.
+    **************************************************************/
+  private void dodash
+    (
+     CSet set
+     )
+      throws java.io.IOException 
+	{
+	  int first = -1;
+	  
+	  if (CUtility.DESCENT_DEBUG)
+	    {
+	      CUtility.enter("dodash",m_spec.m_lexeme,m_spec.m_current_token);
+	    }
+	  
+	  while (m_lexGen.EOS != m_spec.m_current_token 
+		 && m_lexGen.CCL_END != m_spec.m_current_token)
+	    {
+	      // DASH loses its special meaning if it is first in class.
+	      if (m_lexGen.DASH == m_spec.m_current_token && -1 != first)
+		{
+		  m_lexGen.advance();
+		  // DASH loses its special meaning if it is last in class.
+		  if (m_spec.m_current_token == m_lexGen.CCL_END)
+		    {
+		      // 'first' already in set.
+		      set.add('-');
+		      break;
+		    }
+		  for ( ; first <= m_spec.m_lexeme; ++first)
+		    {
+		      if (m_spec.m_ignorecase) 
+			set.addncase((char)first);
+		      else
+			set.add(first);
+		    }  
+		}
+	      else
+		{
+		  first = m_spec.m_lexeme;
+		  if (m_spec.m_ignorecase)
+		    set.addncase(m_spec.m_lexeme);
+		  else
+		    set.add(m_spec.m_lexeme);
+		}
+
+	      m_lexGen.advance();
+	    }
+	  
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    CUtility.leave("dodash",m_spec.m_lexeme,m_spec.m_current_token);
+	  }
+      }
+}
+
+/**
+ * Extract character classes from NFA and simplify.
+ * @author C. Scott Ananian 25-Jul-1999
+ */
+class CSimplifyNfa
+{
+  private int[] ccls; // character class mapping.
+  private int original_charset_size; // original charset size
+  private int mapped_charset_size; // reduced charset size
+
+  void simplify(CSpec m_spec) {
+    computeClasses(m_spec); // initialize fields.
+    
+    // now rewrite the NFA using our character class mapping.
+    for (Enumeration e=m_spec.m_nfa_states.elements(); e.hasMoreElements(); ) {
+      CNfa nfa = (CNfa) e.nextElement();
+      if (nfa.m_edge==CNfa.EMPTY || nfa.m_edge==CNfa.EPSILON)
+	continue; // no change.
+      if (nfa.m_edge==CNfa.CCL) {
+	CSet ncset = new CSet();
+	ncset.map(nfa.m_set, ccls); // map it.
+	nfa.m_set = ncset;
+      } else { // single character
+	nfa.m_edge = ccls[nfa.m_edge]; // map it.
+      }
+    }
+
+    // now update m_spec with the mapping.
+    m_spec.m_ccls_map = ccls;
+    m_spec.m_dtrans_ncols = mapped_charset_size;
+  }
+  /** Compute minimum set of character classes needed to disambiguate
+   *  edges.  We optimistically assume that every character belongs to
+   *  a single character class, and then incrementally split classes
+   *  as we see edges that require discrimination between characters in
+   *  the class. [CSA, 25-Jul-1999] */
+  private void computeClasses(CSpec m_spec) {
+    this.original_charset_size = m_spec.m_dtrans_ncols;
+    this.ccls = new int[original_charset_size]; // initially all zero.
+
+    int nextcls = 1;
+    SparseBitSet clsA = new SparseBitSet(), clsB = new SparseBitSet();
+    Hashtable h = new Hashtable();
+    
+    System.out.print("Working on character classes.");
+    for (Enumeration e=m_spec.m_nfa_states.elements(); e.hasMoreElements(); ) {
+      CNfa nfa = (CNfa) e.nextElement();
+      if (nfa.m_edge==CNfa.EMPTY || nfa.m_edge==CNfa.EPSILON)
+	continue; // no discriminatory information.
+      clsA.clearAll(); clsB.clearAll();
+      for (int i=0; i<ccls.length; i++)
+	if (nfa.m_edge==i || // edge labeled with a character
+	    nfa.m_edge==CNfa.CCL && nfa.m_set.contains(i)) // set of characters
+	  clsA.set(ccls[i]);
+	else
+	  clsB.set(ccls[i]);
+      // now figure out which character classes we need to split.
+      clsA.and(clsB); // split the classes which show up on both sides of edge
+      System.out.print(clsA.size()==0?".":":");
+      if (clsA.size()==0) continue; // nothing to do.
+      // and split them.
+      h.clear(); // h will map old to new class name
+      for (int i=0; i<ccls.length; i++)
+	if (clsA.get(ccls[i])) // a split class
+	  if (nfa.m_edge==i ||
+	      nfa.m_edge==CNfa.CCL && nfa.m_set.contains(i)) { // on A side
+	    Integer split = new Integer(ccls[i]);
+	    if (!h.containsKey(split))
+	      h.put(split, new Integer(nextcls++)); // make new class
+	    ccls[i] = ((Integer)h.get(split)).intValue();
+	  }
+    }
+    System.out.println();
+    System.out.println("NFA has "+nextcls+" distinct character classes.");
+    
+    this.mapped_charset_size = nextcls;
+  }
+}
+
+/***************************************************************
+  Class: CMinimize
+ **************************************************************/
+class CMinimize
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  CSpec m_spec;
+  Vector m_group;
+  int m_ingroup[];
+
+  /***************************************************************
+    Function: CMinimize
+    Description: Constructor.
+    **************************************************************/
+  CMinimize 
+    (
+     )
+      {
+	reset();
+      }
+  
+  /***************************************************************
+    Function: reset
+    Description: Resets member variables.
+    **************************************************************/
+  private void reset
+    (
+     )
+      {
+	m_spec = null;
+	m_group = null;
+	m_ingroup = null;
+      }
+
+  /***************************************************************
+    Function: set
+    Description: Sets member variables.
+    **************************************************************/
+  private void set
+    (
+     CSpec spec
+     )
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != spec);
+	  }
+
+	m_spec = spec;
+	m_group = null;
+	m_ingroup = null;
+      }
+
+  /***************************************************************
+    Function: min_dfa
+    Description: High-level access function to module.
+    **************************************************************/
+  void min_dfa
+    (
+     CSpec spec
+     )
+      {
+	set(spec);
+
+	/* Remove redundant states. */
+	minimize();
+
+	/* Column and row compression. 
+	   Save accept states in auxilary vector. */
+	reduce();
+
+	reset();
+      }
+
+  /***************************************************************
+    Function: col_copy
+    Description: Copies source column into destination column.
+    **************************************************************/
+  private void col_copy
+    (
+     int dest,
+     int src
+     )
+      {
+	int n;
+	int i;
+	CDTrans dtrans;
+
+	n = m_spec.m_dtrans_vector.size();
+	for (i = 0; i < n; ++i)
+	  {
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+	    dtrans.m_dtrans[dest] = dtrans.m_dtrans[src]; 
+	  }
+      }	
+	
+  /***************************************************************
+    Function: trunc_col
+    Description: Truncates each column to the 'correct' length.
+    **************************************************************/
+  private void trunc_col
+    (
+     )
+      {
+	int n;
+	int i;
+	CDTrans dtrans;
+
+	n = m_spec.m_dtrans_vector.size();
+	for (i = 0; i < n; ++i)
+	  {
+	    int[] ndtrans = new int[m_spec.m_dtrans_ncols];
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+	    System.arraycopy(dtrans.m_dtrans, 0, ndtrans, 0, ndtrans.length);
+	    dtrans.m_dtrans = ndtrans;
+	  }
+      }
+  /***************************************************************
+    Function: row_copy
+    Description: Copies source row into destination row.
+    **************************************************************/
+  private void row_copy
+    (
+     int dest,
+     int src
+     )
+      {
+	CDTrans dtrans;
+
+	dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(src);
+	m_spec.m_dtrans_vector.setElementAt(dtrans,dest); 
+      }	
+	
+  /***************************************************************
+    Function: col_equiv
+    Description: 
+    **************************************************************/
+  private boolean col_equiv
+    (
+     int col1,
+     int col2
+     )
+      {
+	int n;
+	int i;
+	CDTrans dtrans;
+
+	n = m_spec.m_dtrans_vector.size();
+	for (i = 0; i < n; ++i)
+	  {
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+	    if (dtrans.m_dtrans[col1] != dtrans.m_dtrans[col2]) 
+	      {
+		return false;
+	      }
+	  }
+	
+	return true;
+      }
+
+  /***************************************************************
+    Function: row_equiv
+    Description: 
+    **************************************************************/
+  private boolean row_equiv
+    (
+     int row1,
+     int row2
+     )
+      {
+	int i;
+	CDTrans dtrans1;
+	CDTrans dtrans2;
+
+	dtrans1 = (CDTrans) m_spec.m_dtrans_vector.elementAt(row1);
+	dtrans2 = (CDTrans) m_spec.m_dtrans_vector.elementAt(row2);
+	
+	for (i = 0; i < m_spec.m_dtrans_ncols; ++i)
+	  {
+	    if (dtrans1.m_dtrans[i] != dtrans2.m_dtrans[i]) 
+	      {
+		return false;
+	      }
+	  }
+	
+	return true;
+      }
+
+  /***************************************************************
+    Function: reduce
+    Description: 
+    **************************************************************/
+  private void reduce
+    (
+     )
+      {
+	int i;
+	int j;
+	int k;
+	int nrows;
+	int reduced_ncols;
+	int reduced_nrows;
+	SparseBitSet set;
+	CDTrans dtrans;
+	int size;
+
+	set = new SparseBitSet();
+	
+	/* Save accept nodes and anchor entries. */
+	size = m_spec.m_dtrans_vector.size();
+	m_spec.m_anchor_array = new int[size];
+	m_spec.m_accept_vector = new Vector();
+	for (i = 0; i < size; ++i)
+	  {
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+	    m_spec.m_accept_vector.addElement(dtrans.m_accept);
+	    m_spec.m_anchor_array[i] = dtrans.m_anchor;
+	    dtrans.m_accept = null;
+	  }
+	
+	/* Allocate column map. */
+	m_spec.m_col_map = new int[m_spec.m_dtrans_ncols];
+	for (i = 0; i < m_spec.m_dtrans_ncols; ++i)
+	  {
+	    m_spec.m_col_map[i] = -1;
+	  }
+
+	/* Process columns for reduction. */
+	for (reduced_ncols = 0; ; ++reduced_ncols)
+	  {
+	    if (CUtility.DEBUG)
+	      {
+		for (i = 0; i < reduced_ncols; ++i)
+		  {
+		    CUtility.ASSERT(-1 != m_spec.m_col_map[i]);
+		  }
+	      }
+
+	    for (i = reduced_ncols; i < m_spec.m_dtrans_ncols; ++i)
+	      {
+		if (-1 == m_spec.m_col_map[i])
+		  {
+		    break;
+		  }
+	      }
+
+	    if (i >= m_spec.m_dtrans_ncols)
+	      {
+		break;
+	      }
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(false == set.get(i));
+		CUtility.ASSERT(-1 == m_spec.m_col_map[i]);
+	      }
+
+	    set.set(i);
+	    
+	    m_spec.m_col_map[i] = reduced_ncols;
+	    
+	    /* UNDONE: Optimize by doing all comparisons in one batch. */
+	    for (j = i + 1; j < m_spec.m_dtrans_ncols; ++j)
+	      {
+		if (-1 == m_spec.m_col_map[j] && true == col_equiv(i,j))
+		  {
+		    m_spec.m_col_map[j] = reduced_ncols;
+		  }
+	      }
+	  }
+
+	/* Reduce columns. */
+	k = 0;
+	for (i = 0; i < m_spec.m_dtrans_ncols; ++i)
+	  {
+	    if (set.get(i))
+	      {
+		++k;
+
+		set.clear(i);
+		
+		j = m_spec.m_col_map[i];
+		
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(j <= i);
+		  }
+		
+		if (j == i)
+		  {
+		    continue;
+		  }
+		
+		col_copy(j,i);
+	      }
+	  }
+	m_spec.m_dtrans_ncols = reduced_ncols;
+	/* truncate m_dtrans at proper length (freeing extra) */
+	trunc_col();
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(k == reduced_ncols);
+	  }
+
+	/* Allocate row map. */
+	nrows = m_spec.m_dtrans_vector.size();
+	m_spec.m_row_map = new int[nrows];
+	for (i = 0; i < nrows; ++i)
+	  {
+	    m_spec.m_row_map[i] = -1;
+	  }
+
+	/* Process rows to reduce. */
+	for (reduced_nrows = 0; ; ++reduced_nrows)
+	  {
+	    if (CUtility.DEBUG)
+	      {
+		for (i = 0; i < reduced_nrows; ++i)
+		  {
+		    CUtility.ASSERT(-1 != m_spec.m_row_map[i]);
+		  }
+	      }
+
+	    for (i = reduced_nrows; i < nrows; ++i)
+	      {
+		if (-1 == m_spec.m_row_map[i])
+		  {
+		    break;
+		  }
+	      }
+
+	    if (i >= nrows)
+	      {
+		break;
+	      }
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(false == set.get(i));
+		CUtility.ASSERT(-1 == m_spec.m_row_map[i]);
+	      }
+
+	    set.set(i);
+
+	    m_spec.m_row_map[i] = reduced_nrows;
+	    
+	    /* UNDONE: Optimize by doing all comparisons in one batch. */
+	    for (j = i + 1; j < nrows; ++j)
+	      {
+		if (-1 == m_spec.m_row_map[j] && true == row_equiv(i,j))
+		  {
+		    m_spec.m_row_map[j] = reduced_nrows;
+		  }
+	      }
+	  }
+
+	/* Reduce rows. */
+	k = 0;
+	for (i = 0; i < nrows; ++i)
+	  {
+	    if (set.get(i))
+	      {
+		++k;
+
+		set.clear(i);
+		
+		j = m_spec.m_row_map[i];
+		
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(j <= i);
+		  }
+		
+		if (j == i)
+		  {
+		    continue;
+		  }
+		
+		row_copy(j,i);
+	      }
+	  }
+	m_spec.m_dtrans_vector.setSize(reduced_nrows);
+
+	if (CUtility.DEBUG)
+	  {
+	    /*System.out.println("k = " + k + "\nreduced_nrows = " + reduced_nrows + "");*/
+	    CUtility.ASSERT(k == reduced_nrows);
+	  }
+      }
+
+  /***************************************************************
+    Function: fix_dtrans
+    Description: Updates CDTrans table after minimization 
+    using groups, removing redundant transition table states.
+    **************************************************************/
+  private void fix_dtrans
+    (
+     )
+      {
+	Vector new_vector;
+	int i;
+	int size;
+	Vector dtrans_group;
+	CDTrans first;
+	int c;
+
+	new_vector = new Vector();
+
+	size = m_spec.m_state_dtrans.length;
+	for (i = 0; i < size; ++i)
+	  {
+	    if (CDTrans.F != m_spec.m_state_dtrans[i])
+	      {
+		m_spec.m_state_dtrans[i] = m_ingroup[m_spec.m_state_dtrans[i]];
+	      }
+	  }
+
+	size = m_group.size();
+	for (i = 0; i < size; ++i)
+	  {
+	    dtrans_group = (Vector) m_group.elementAt(i);
+	    first = (CDTrans) dtrans_group.elementAt(0);
+	    new_vector.addElement(first);
+
+	    for (c = 0; c < m_spec.m_dtrans_ncols; ++c)
+	      {
+		if (CDTrans.F != first.m_dtrans[c])
+		  {
+		    first.m_dtrans[c] = m_ingroup[first.m_dtrans[c]];
+		  }
+	      }
+	  }
+
+	m_group = null;
+	m_spec.m_dtrans_vector = new_vector;
+      }
+
+  /***************************************************************
+    Function: minimize
+    Description: Removes redundant transition table states.
+    **************************************************************/
+  private void minimize
+    (
+     )
+      {
+	Vector dtrans_group;
+	Vector new_group;
+	int i;
+	int j;
+	int old_group_count;
+	int group_count;
+	CDTrans next;
+	CDTrans first;
+	int goto_first;
+	int goto_next;
+	int c;
+	int group_size;
+	boolean added;
+
+	init_groups();
+
+	group_count = m_group.size();
+	old_group_count = group_count - 1;
+
+	while (old_group_count != group_count)
+	  {
+	    old_group_count = group_count;
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(m_group.size() == group_count);
+	      }
+
+	    for (i = 0; i < group_count; ++i)
+	      {
+		dtrans_group = (Vector) m_group.elementAt(i);
+
+		group_size = dtrans_group.size();
+		if (group_size <= 1)
+		  {
+		    continue;
+		  }
+
+		new_group = new Vector();
+		added = false;
+		
+		first = (CDTrans) dtrans_group.elementAt(0);
+		for (j = 1; j < group_size; ++j)
+		  {
+		    next = (CDTrans) dtrans_group.elementAt(j);
+
+		    for (c = 0; c < m_spec.m_dtrans_ncols; ++c)
+		      {
+			goto_first = first.m_dtrans[c];
+			goto_next = next.m_dtrans[c];
+
+			if (goto_first != goto_next
+			    && (goto_first == CDTrans.F
+				|| goto_next == CDTrans.F
+				|| m_ingroup[goto_next] != m_ingroup[goto_first]))
+			  {
+			    if (CUtility.DEBUG)
+			      {
+				CUtility.ASSERT(dtrans_group.elementAt(j) == next);
+			      }
+			    
+			    dtrans_group.removeElementAt(j);
+			    --j;
+			    --group_size;
+			    new_group.addElement(next);
+			    if (false == added)
+			      {
+				added = true;
+				++group_count;
+				m_group.addElement(new_group);
+			      }
+			    m_ingroup[next.m_label] = m_group.size() - 1;
+
+			    if (CUtility.DEBUG)
+			      {
+				CUtility.ASSERT(m_group.contains(new_group)
+						== true);
+				CUtility.ASSERT(m_group.contains(dtrans_group)
+						== true);
+				CUtility.ASSERT(dtrans_group.contains(first)
+						== true);
+				CUtility.ASSERT(dtrans_group.contains(next)
+						== false);
+				CUtility.ASSERT(new_group.contains(first)
+						== false);
+				CUtility.ASSERT(new_group.contains(next)
+						== true);
+				CUtility.ASSERT(dtrans_group.size() == group_size);
+				CUtility.ASSERT(i == m_ingroup[first.m_label]);
+				CUtility.ASSERT((m_group.size() - 1) 
+						== m_ingroup[next.m_label]);
+			      }
+
+			    break;
+			  }
+		      }
+		  }
+	      }
+	  }
+
+	System.out.println(m_group.size() + " states after removal of redundant states.");
+
+	if (m_spec.m_verbose
+	    && true == CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.println();
+	    System.out.println("States grouped as follows after minimization");
+	    pgroups();
+	  }
+
+	fix_dtrans();
+      }
+
+  /***************************************************************
+    Function: init_groups
+    Description:
+    **************************************************************/
+  private void init_groups
+    (
+     )
+      {
+	int i;
+	int j;
+	int group_count;
+	int size;
+	CAccept accept;
+	CDTrans dtrans;
+	Vector dtrans_group;
+	CDTrans first;
+	boolean group_found;
+
+	m_group = new Vector();
+	group_count = 0;
+	
+	size = m_spec.m_dtrans_vector.size();
+	m_ingroup = new int[size];
+	
+	for (i = 0; i < size; ++i)
+	  {
+	    group_found = false;
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(i == dtrans.m_label);
+		CUtility.ASSERT(false == group_found);
+		CUtility.ASSERT(group_count == m_group.size());
+	      }
+	    
+	    for (j = 0; j < group_count; ++j)
+	      {
+		dtrans_group = (Vector) m_group.elementAt(j);
+		
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(false == group_found);
+		    CUtility.ASSERT(0 < dtrans_group.size());
+		  }
+
+		first = (CDTrans) dtrans_group.elementAt(0);
+		
+		if (CUtility.SLOW_DEBUG)
+		  {
+		    CDTrans check;
+		    int k;
+		    int s;
+
+		    s = dtrans_group.size();
+		    CUtility.ASSERT(0 < s);
+
+		    for (k = 1; k < s; ++k)
+		      {
+			check = (CDTrans) dtrans_group.elementAt(k);
+			CUtility.ASSERT(check.m_accept == first.m_accept);
+		      }
+		  }
+
+		if (first.m_accept == dtrans.m_accept)
+		  {
+		    dtrans_group.addElement(dtrans);
+		    m_ingroup[i] = j;
+		    group_found = true;
+		    
+		    if (CUtility.DEBUG)
+		      {
+			CUtility.ASSERT(j == m_ingroup[dtrans.m_label]);
+		      }
+
+		    break;
+		  }
+	      }
+	    
+	    if (false == group_found)
+	      {
+		dtrans_group = new Vector();
+		dtrans_group.addElement(dtrans);
+		m_ingroup[i] = m_group.size();
+		m_group.addElement(dtrans_group);
+		++group_count;
+	      }
+	  }
+	
+	if (m_spec.m_verbose
+	    && true == CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.println("Initial grouping:");
+	    pgroups();
+	    System.out.println();
+	  }
+      }
+
+  /***************************************************************
+    Function: pset
+    **************************************************************/
+  private void pset
+    (
+     Vector dtrans_group
+     )
+      {
+	int i;
+	int size;
+	CDTrans dtrans;
+
+	size = dtrans_group.size();
+	for (i = 0; i < size; ++i)
+	  {
+	    dtrans = (CDTrans) dtrans_group.elementAt(i);
+	    System.out.print(dtrans.m_label + " ");
+	  }
+      }
+  
+  /***************************************************************
+    Function: pgroups
+    **************************************************************/
+  private void pgroups
+    (
+     )
+      {
+	int i;
+	int dtrans_size;
+	int group_size;
+	
+	group_size = m_group.size();
+	for (i = 0; i < group_size; ++i)
+	  {
+	    System.out.print("\tGroup " + i + " {");
+	    pset((Vector) m_group.elementAt(i));
+	    System.out.println("}");
+	    System.out.println();
+	  }
+	
+	System.out.println();
+	dtrans_size = m_spec.m_dtrans_vector.size();
+	for (i = 0; i < dtrans_size; ++i)
+	  {
+	    System.out.println("\tstate " + i 
+			       + " is in group " 
+			       + m_ingroup[i]);
+	  }
+      }
+}
+
+/***************************************************************
+  Class: CNfa2Dfa
+ **************************************************************/
+class CNfa2Dfa
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  private CSpec m_spec;
+  private int m_unmarked_dfa;
+  private CLexGen m_lexGen;
+
+  /***************************************************************
+    Constants
+    **************************************************************/
+  private static final int NOT_IN_DSTATES = -1;
+
+  /***************************************************************
+    Function: CNfa2Dfa
+    **************************************************************/
+  CNfa2Dfa
+    (
+     )
+      {
+	reset();
+      }
+
+  /***************************************************************
+    Function: set 
+    Description: 
+    **************************************************************/
+  private void set
+    (
+     CLexGen lexGen,
+     CSpec spec
+     )
+      {
+	m_lexGen = lexGen;
+	m_spec = spec;
+	m_unmarked_dfa = 0;
+      }
+
+  /***************************************************************
+    Function: reset 
+    Description: 
+    **************************************************************/
+  private void reset
+    (
+     )
+      {
+	m_lexGen = null;
+	m_spec = null;
+	m_unmarked_dfa = 0;
+      }
+
+  /***************************************************************
+    Function: make_dfa
+    Description: High-level access function to module.
+    **************************************************************/
+  void make_dfa
+    (
+     CLexGen lexGen,
+     CSpec spec
+     )
+      {
+	int i;
+
+	reset();
+	set(lexGen,spec);
+
+	make_dtrans();
+	free_nfa_states();
+
+	if (m_spec.m_verbose && true == CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.println(m_spec.m_dfa_states.size()
+			       + " DFA states in original machine.");
+	  }
+
+	free_dfa_states();
+      }     
+
+   /***************************************************************
+    Function: make_dtrans
+    Description: Creates uncompressed CDTrans transition table.
+    **************************************************************/
+  private void make_dtrans
+    (
+     )
+     /* throws java.lang.CloneNotSupportedException*/
+      {
+	CDfa next;
+	CDfa dfa;
+	CBunch bunch;
+	int i;
+	int nextstate;
+	int size;
+	CDTrans dtrans;
+	CNfa nfa;
+	int istate;
+	int nstates;
+	
+	System.out.print("Working on DFA states.");
+
+	/* Reference passing type and initializations. */
+	bunch = new CBunch();
+	m_unmarked_dfa = 0;
+
+	/* Allocate mapping array. */
+	nstates = m_spec.m_state_rules.length;
+	m_spec.m_state_dtrans = new int[nstates];
+
+	for (istate = 0; nstates > istate; ++istate)
+	  {
+	    /* CSA bugfix: if we skip all zero size rules, then
+	       an specification with no rules produces an illegal
+	       lexer (0 states) instead of a lexer that rejects
+	       everything (1 nonaccepting state). [27-Jul-1999]
+	    if (0 == m_spec.m_state_rules[istate].size())
+	      {
+		m_spec.m_state_dtrans[istate] = CDTrans.F;
+		continue;
+	      }
+	    */
+		
+	    /* Create start state and initialize fields. */
+	    bunch.m_nfa_set = (Vector) m_spec.m_state_rules[istate].clone();
+	    sortStates(bunch.m_nfa_set);
+	    
+	    bunch.m_nfa_bit = new SparseBitSet();
+	    
+	    /* Initialize bit set. */
+	    size = bunch.m_nfa_set.size();
+	    for (i = 0; size > i; ++i)
+	      {
+		nfa = (CNfa) bunch.m_nfa_set.elementAt(i);
+		bunch.m_nfa_bit.set(nfa.m_label);
+	      }
+	    
+	    bunch.m_accept = null;
+	    bunch.m_anchor = CSpec.NONE;
+	    bunch.m_accept_index = CUtility.INT_MAX;
+	    
+	    e_closure(bunch);
+	    add_to_dstates(bunch);
+	    
+	    m_spec.m_state_dtrans[istate] = m_spec.m_dtrans_vector.size();
+
+	    /* Main loop of CDTrans creation. */
+	    while (null != (dfa = get_unmarked()))
+	      {
+		System.out.print(".");
+		System.out.flush();
+		
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(false == dfa.m_mark);
+		  }
+
+		/* Get first unmarked node, then mark it. */
+		dfa.m_mark = true;
+		
+		/* Allocate new CDTrans, then initialize fields. */
+		dtrans = new CDTrans(m_spec.m_dtrans_vector.size(),m_spec);
+		dtrans.m_accept = dfa.m_accept;
+		dtrans.m_anchor = dfa.m_anchor;
+		
+		/* Set CDTrans array for each character transition. */
+		for (i = 0; i < m_spec.m_dtrans_ncols; ++i)
+		  {
+		    if (CUtility.DEBUG)
+		      {
+			CUtility.ASSERT(0 <= i);
+			CUtility.ASSERT(m_spec.m_dtrans_ncols > i);
+		      }
+		    
+		    /* Create new dfa set by attempting character transition. */
+		    move(dfa.m_nfa_set,dfa.m_nfa_bit,i,bunch);
+		    if (null != bunch.m_nfa_set)
+		      {
+			e_closure(bunch);
+		      }
+		    
+		    if (CUtility.DEBUG)
+		      {
+			CUtility.ASSERT((null == bunch.m_nfa_set 
+					 && null == bunch.m_nfa_bit)
+					|| (null != bunch.m_nfa_set 
+					    && null != bunch.m_nfa_bit));
+		      }
+		    
+		    /* Create new state or set state to empty. */
+		    if (null == bunch.m_nfa_set)
+		      {
+			nextstate = CDTrans.F;
+		      }
+		    else 
+		      {
+			nextstate = in_dstates(bunch);
+			
+			if (NOT_IN_DSTATES == nextstate)
+			  {
+			    nextstate = add_to_dstates(bunch);
+			  }
+		      }
+		    
+		    if (CUtility.DEBUG)
+		      {
+			CUtility.ASSERT(nextstate < m_spec.m_dfa_states.size());
+		      }
+		    
+		    dtrans.m_dtrans[i] = nextstate;
+		  }
+		
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(m_spec.m_dtrans_vector.size() == dfa.m_label);
+		  }
+		
+		m_spec.m_dtrans_vector.addElement(dtrans);
+	      }
+	  }
+
+	System.out.println();
+      }
+
+  /***************************************************************
+    Function: free_dfa_states
+    **************************************************************/  
+  private void free_dfa_states
+    (
+     )
+      {
+	m_spec.m_dfa_states = null;
+	m_spec.m_dfa_sets = null;
+      }
+
+  /***************************************************************
+    Function: free_nfa_states
+    **************************************************************/  
+  private void free_nfa_states
+    (
+     )
+      {
+	/* UNDONE: Remove references to nfas from within dfas. */
+	/* UNDONE: Don't free CAccepts. */
+
+	m_spec.m_nfa_states = null;
+	m_spec.m_nfa_start = null;
+	m_spec.m_state_rules = null;
+      }
+
+  /***************************************************************
+    Function: e_closure
+    Description: Alters and returns input set.
+    **************************************************************/
+  private void e_closure
+    (
+     CBunch bunch
+     )
+      {
+	Stack nfa_stack;
+	int size;
+	int i;
+	CNfa state;
+
+	/* Debug checks. */
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != bunch);
+	    CUtility.ASSERT(null != bunch.m_nfa_set);
+	    CUtility.ASSERT(null != bunch.m_nfa_bit);
+	  }
+
+	bunch.m_accept = null;
+	bunch.m_anchor = CSpec.NONE;
+	bunch.m_accept_index = CUtility.INT_MAX;
+	
+	/* Create initial stack. */
+	nfa_stack = new Stack();
+	size = bunch.m_nfa_set.size();
+	for (i = 0; i < size; ++i)
+	  {
+	    state = (CNfa) bunch.m_nfa_set.elementAt(i);
+	    
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(bunch.m_nfa_bit.get(state.m_label));
+	      }
+
+	    nfa_stack.push(state);
+	  }
+
+	/* Main loop. */
+	while (false == nfa_stack.empty())
+	  {
+	    state = (CNfa) nfa_stack.pop();
+	    
+	    if (CUtility.OLD_DUMP_DEBUG)
+	      {
+		if (null != state.m_accept)
+		  {
+		    System.out.println("Looking at accepting state " + state.m_label
+				       + " with <"
+				       + (new String(state.m_accept.m_action,0,
+						     state.m_accept.m_action_read))
+				       + ">");
+		  }
+	      }
+
+	    if (null != state.m_accept 
+		&& state.m_label < bunch.m_accept_index)
+	      {
+		bunch.m_accept_index = state.m_label;
+		bunch.m_accept = state.m_accept;
+		bunch.m_anchor = state.m_anchor;
+
+		if (CUtility.OLD_DUMP_DEBUG)
+		  {
+		    System.out.println("Found accepting state " + state.m_label
+				       + " with <"
+				       + (new String(state.m_accept.m_action,0,
+						     state.m_accept.m_action_read))
+				       + ">");
+		  }
+
+		if (CUtility.DEBUG)
+		  {
+		    CUtility.ASSERT(null != bunch.m_accept);
+		    CUtility.ASSERT(CSpec.NONE == bunch.m_anchor
+				    || 0 != (bunch.m_anchor & CSpec.END)
+				    || 0 != (bunch.m_anchor & CSpec.START));
+		  }
+	      }
+
+	    if (CNfa.EPSILON == state.m_edge)
+	      {
+		if (null != state.m_next)
+		  {
+		    if (false == bunch.m_nfa_set.contains(state.m_next))
+		      {
+			if (CUtility.DEBUG)
+			  {
+			    CUtility.ASSERT(false == bunch.m_nfa_bit.get(state.m_next.m_label));
+			  }
+			
+			bunch.m_nfa_bit.set(state.m_next.m_label);
+			bunch.m_nfa_set.addElement(state.m_next);
+			nfa_stack.push(state.m_next);
+		      }
+		  }
+
+		if (null != state.m_next2)
+		  {
+		    if (false == bunch.m_nfa_set.contains(state.m_next2))
+		      {
+			if (CUtility.DEBUG)
+			  {
+			    CUtility.ASSERT(false == bunch.m_nfa_bit.get(state.m_next2.m_label));
+			  }
+			
+			bunch.m_nfa_bit.set(state.m_next2.m_label);
+			bunch.m_nfa_set.addElement(state.m_next2);
+			nfa_stack.push(state.m_next2);
+		      }
+		  }
+	      }
+	  }
+
+	if (null != bunch.m_nfa_set)
+	  {
+	    sortStates(bunch.m_nfa_set);
+	  }
+
+	return;
+      }
+
+  /***************************************************************
+    Function: move
+    Description: Returns null if resulting NFA set is empty.
+    **************************************************************/
+  void move
+    (
+     Vector nfa_set,
+     SparseBitSet nfa_bit,
+     int b,
+     CBunch bunch
+     )
+      {
+	int size;
+	int index;
+	CNfa state;
+	
+	bunch.m_nfa_set = null;
+	bunch.m_nfa_bit = null;
+
+	size = nfa_set.size();
+	for (index = 0; index < size; ++index)
+	  {
+	    state = (CNfa) nfa_set.elementAt(index);
+	    
+	    if (b == state.m_edge
+		|| (CNfa.CCL == state.m_edge
+		    && true == state.m_set.contains(b)))
+	      {
+		if (null == bunch.m_nfa_set)
+		  {
+		    if (CUtility.DEBUG)
+		      {
+			CUtility.ASSERT(null == bunch.m_nfa_bit);
+		      }
+		    
+		    bunch.m_nfa_set = new Vector();
+		    /*bunch.m_nfa_bit 
+			= new SparseBitSet(m_spec.m_nfa_states.size());*/
+		    bunch.m_nfa_bit = new SparseBitSet();
+		  }
+
+		bunch.m_nfa_set.addElement(state.m_next);
+		/*System.out.println("Size of bitset: " + bunch.m_nfa_bit.size());
+		System.out.println("Reference index: " + state.m_next.m_label);
+		System.out.flush();*/
+		bunch.m_nfa_bit.set(state.m_next.m_label);
+	      }
+	  }
+	
+	if (null != bunch.m_nfa_set)
+	  {
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(null != bunch.m_nfa_bit);
+	      }
+	    
+	    sortStates(bunch.m_nfa_set);
+	  }
+
+	return;
+      }
+
+  /***************************************************************
+    Function: sortStates
+    **************************************************************/
+  private void sortStates
+    (
+     Vector nfa_set
+     )
+      {
+	CNfa elem;
+	int begin;
+	int size;
+	int index;
+	int value;
+	int smallest_index;
+	int smallest_value;
+	CNfa begin_elem;
+
+	size = nfa_set.size();
+	for (begin = 0; begin < size; ++begin)
+	  {
+	    elem = (CNfa) nfa_set.elementAt(begin);
+	    smallest_value = elem.m_label;
+	    smallest_index = begin;
+
+	    for (index = begin + 1; index < size; ++index)
+	      {
+		elem = (CNfa) nfa_set.elementAt(index);
+		value = elem.m_label;
+
+		if (value < smallest_value)
+		  {
+		    smallest_index = index;
+		    smallest_value = value;
+		  }
+	      }
+
+	    begin_elem = (CNfa) nfa_set.elementAt(begin);
+	    elem = (CNfa) nfa_set.elementAt(smallest_index);
+	    nfa_set.setElementAt(elem,begin);
+	    nfa_set.setElementAt(begin_elem,smallest_index);
+	  }
+
+	if (CUtility.OLD_DEBUG)
+	  {
+	    System.out.print("NFA vector indices: ");  
+	    
+	    for (index = 0; index < size; ++index)
+	      {
+		elem = (CNfa) nfa_set.elementAt(index);
+		System.out.print(elem.m_label + " ");
+	      }
+	    System.out.println();
+	  }	
+
+	return;
+      }
+
+  /***************************************************************
+    Function: get_unmarked
+    Description: Returns next unmarked DFA state.
+    **************************************************************/
+  private CDfa get_unmarked
+    (
+     )
+      {
+	int size;
+	CDfa dfa;
+
+	size = m_spec.m_dfa_states.size();
+	while (m_unmarked_dfa < size)
+	  {
+	    dfa = (CDfa) m_spec.m_dfa_states.elementAt(m_unmarked_dfa);
+
+	    if (false == dfa.m_mark)
+	      {
+		if (CUtility.OLD_DUMP_DEBUG)
+		  {
+		    System.out.print("*");
+		    System.out.flush();
+		  }
+
+		if (m_spec.m_verbose && true == CUtility.OLD_DUMP_DEBUG)
+		  {
+		    System.out.println("---------------");
+		    System.out.print("working on DFA state " 
+				     + m_unmarked_dfa
+				     + " = NFA states: ");
+		    m_lexGen.print_set(dfa.m_nfa_set);
+		    System.out.println();
+		  }
+
+		return dfa;
+	      }
+
+	    ++m_unmarked_dfa;
+	  }
+
+	return null;
+      }
+  
+  /***************************************************************
+    function: add_to_dstates
+    Description: Takes as input a CBunch with details of
+    a dfa state that needs to be created.
+    1) Allocates a new dfa state and saves it in 
+    the appropriate CSpec vector.
+    2) Initializes the fields of the dfa state
+    with the information in the CBunch.
+    3) Returns index of new dfa.
+    **************************************************************/
+  private int add_to_dstates
+    (
+     CBunch bunch
+     )
+      {
+	CDfa dfa;
+	
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != bunch.m_nfa_set);
+	    CUtility.ASSERT(null != bunch.m_nfa_bit);
+	    CUtility.ASSERT(null != bunch.m_accept 
+			    || CSpec.NONE == bunch.m_anchor);
+	  }
+
+	/* Allocate, passing CSpec so dfa label can be set. */
+	dfa = CAlloc.newCDfa(m_spec);
+	
+	/* Initialize fields, including the mark field. */
+	dfa.m_nfa_set = (Vector) bunch.m_nfa_set.clone();
+	dfa.m_nfa_bit = (SparseBitSet) bunch.m_nfa_bit.clone();
+	dfa.m_accept = bunch.m_accept;
+	dfa.m_anchor = bunch.m_anchor;
+	dfa.m_mark = false;
+	
+	/* Register dfa state using BitSet in CSpec Hashtable. */
+	m_spec.m_dfa_sets.put(dfa.m_nfa_bit,dfa);
+	/*registerCDfa(dfa);*/
+
+	if (CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.print("Registering set : ");
+	    m_lexGen.print_set(dfa.m_nfa_set);
+	    System.out.println();
+	  }
+
+	return dfa.m_label;
+      }
+
+  /***************************************************************
+    Function: in_dstates
+    **************************************************************/
+  private int in_dstates
+    (
+     CBunch bunch
+     )
+      {
+	CDfa dfa;
+	
+	if (CUtility.OLD_DEBUG)
+	  {
+	    System.out.print("Looking for set : ");
+	    m_lexGen.print_set(bunch.m_nfa_set);
+	  }
+
+	dfa = (CDfa) m_spec.m_dfa_sets.get(bunch.m_nfa_bit);
+
+	if (null != dfa)
+	  {
+	    if (CUtility.OLD_DUMP_DEBUG)
+	      {
+		System.out.println(" FOUND!");
+	      }
+	    
+	    return dfa.m_label;
+	  }
+
+	if (CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.println(" NOT FOUND!");
+	  }
+	return NOT_IN_DSTATES;
+      }
+
+}
+
+/***************************************************************
+  Class: CAlloc
+  **************************************************************/
+class CAlloc
+{
+  /***************************************************************
+    Function: newCDfa
+    **************************************************************/
+  static CDfa newCDfa
+    (
+     CSpec spec
+     )
+      {
+	CDfa dfa;
+	
+	dfa = new CDfa(spec.m_dfa_states.size());
+	spec.m_dfa_states.addElement(dfa);
+
+	return dfa;
+      }
+
+  /***************************************************************
+    Function: newCNfaPair
+    Description: 
+    **************************************************************/
+  static CNfaPair newCNfaPair
+    (
+     )
+      {
+	CNfaPair pair = new CNfaPair();
+	
+	return pair;
+      }
+  /***************************************************************
+    Function: newNLPair
+    Description: return a new CNfaPair that matches a new 
+                 line: (\r\n?|[\n\uu2028\uu2029])
+		 Added by CSA 8-Aug-1999, updated 10-Aug-1999
+    **************************************************************/
+  static CNfaPair newNLPair(CSpec spec) {
+    CNfaPair pair = newCNfaPair();
+    pair.m_end=newCNfa(spec); // newline accepting state
+    pair.m_start=newCNfa(spec); // new state with two epsilon edges
+    pair.m_start.m_next = newCNfa(spec);
+    pair.m_start.m_next.m_edge = CNfa.CCL;
+    pair.m_start.m_next.m_set = new CSet();
+    pair.m_start.m_next.m_set.add('\n');
+    if (spec.m_dtrans_ncols-CSpec.NUM_PSEUDO > 2029) {
+      pair.m_start.m_next.m_set.add(2028); /*U+2028 is LS, the line separator*/
+      pair.m_start.m_next.m_set.add(2029); /*U+2029 is PS, the paragraph sep.*/
+    }
+    pair.m_start.m_next.m_next = pair.m_end; // accept '\n', U+2028, or U+2029
+    pair.m_start.m_next2 = newCNfa(spec);
+    pair.m_start.m_next2.m_edge = '\r';
+    pair.m_start.m_next2.m_next = newCNfa(spec);
+    pair.m_start.m_next2.m_next.m_next = pair.m_end; // accept '\r';
+    pair.m_start.m_next2.m_next.m_next2 = newCNfa(spec);
+    pair.m_start.m_next2.m_next.m_next2.m_edge = '\n';
+    pair.m_start.m_next2.m_next.m_next2.m_next = pair.m_end; // accept '\r\n';
+    return pair;
+  }
+
+  /***************************************************************
+    Function: newCNfa
+    Description: 
+    **************************************************************/
+  static CNfa newCNfa
+    (
+     CSpec spec
+     )
+      {
+	CNfa p;
+
+	/* UNDONE: Buffer this? */
+
+	p = new CNfa();
+	
+	/*p.m_label = spec.m_nfa_states.size();*/
+	spec.m_nfa_states.addElement(p);
+	p.m_edge = CNfa.EPSILON;
+	
+	return p;
+      }
+}
+
+/***************************************************************
+  Class: Main
+  Description: Top-level lexical analyzer generator function.
+ **************************************************************/
+public class Main
+{
+  /***************************************************************
+    Function: main
+    **************************************************************/
+  public static void main
+    (
+     String arg[]
+     )
+    throws java.io.IOException
+      {
+	CLexGen lg;
+
+	if (arg.length < 1)
+	  {
+	    System.out.println("Usage: JLex.Main <filename>");
+	    return;
+	  }
+
+	/* Note: For debuging, it may be helpful to remove the try/catch
+	   block and permit the Exception to propagate to the top level. 
+	   This gives more information. */
+	try 
+	  {	
+	    lg = new CLexGen(arg[0]);
+	    lg.generate();
+	  }
+	catch (Error e)
+	  {
+	    System.out.println(e.getMessage());
+	  }
+      }
+}    
+
+/***************************************************************
+  Class: CDTrans
+  **************************************************************/
+class CDTrans
+{
+  /*************************************************************
+    Member Variables
+    ***********************************************************/
+  int m_dtrans[];
+  CAccept m_accept;
+  int m_anchor;
+  int m_label;
+
+  /*************************************************************
+    Constants
+    ***********************************************************/
+  static final int F = -1;
+
+  /*************************************************************
+    Function: CTrans
+    ***********************************************************/
+  CDTrans
+    (
+     int label,
+     CSpec spec
+     )
+      {
+	m_dtrans = new int[spec.m_dtrans_ncols];
+	m_accept = null;
+	m_anchor = CSpec.NONE;
+	m_label = label;
+      }
+}
+
+/***************************************************************
+  Class: CDfa
+  **************************************************************/
+class CDfa 
+{
+  /***************************************************************
+    Member Variables
+    ***********************************************************/
+  int m_group;
+  boolean m_mark;
+  CAccept m_accept;
+  int m_anchor;
+  Vector m_nfa_set;
+  SparseBitSet m_nfa_bit;
+  int m_label;
+
+  /***************************************************************
+    Function: CDfa
+    **************************************************************/
+  CDfa
+    (
+     int label
+     )
+      {
+	m_group = 0;
+	m_mark = false;
+
+	m_accept = null;
+	m_anchor = CSpec.NONE;
+
+	m_nfa_set = null;
+	m_nfa_bit = null;
+
+	m_label = label;
+      }
+}
+
+/***************************************************************
+  Class: CAccept
+ **************************************************************/
+class CAccept
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  char m_action[];
+  int m_action_read;
+  int m_line_number;
+
+  /***************************************************************
+    Function: CAccept
+    **************************************************************/
+  CAccept
+    (
+     char action[],
+     int action_read,
+     int line_number
+     )
+      {
+	int elem;
+
+	m_action_read = action_read;
+
+	m_action = new char[m_action_read];
+	for (elem = 0; elem < m_action_read; ++elem)
+	  {
+	    m_action[elem] = action[elem];
+	  }
+
+	m_line_number = line_number;
+      }
+
+  /***************************************************************
+    Function: CAccept
+    **************************************************************/
+  CAccept
+    (
+     CAccept accept
+     )
+      {
+	int elem;
+
+	m_action_read = accept.m_action_read;
+	
+	m_action = new char[m_action_read];
+	for (elem = 0; elem < m_action_read; ++elem)
+	  {
+	    m_action[elem] = accept.m_action[elem];
+	  }
+
+	m_line_number = accept.m_line_number;
+      }
+
+  /***************************************************************
+    Function: mimic
+    **************************************************************/
+  void mimic
+    (
+     CAccept accept
+     )
+      {
+	int elem;
+
+	m_action_read = accept.m_action_read;
+	
+	m_action = new char[m_action_read];
+	for (elem = 0; elem < m_action_read; ++elem)
+	  {
+	    m_action[elem] = accept.m_action[elem];
+	  }
+      }
+}
+
+/***************************************************************
+  Class: CAcceptAnchor
+  **************************************************************/
+class CAcceptAnchor
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  CAccept m_accept;
+  int m_anchor;
+
+  /***************************************************************
+    Function: CAcceptAnchor
+    **************************************************************/
+  CAcceptAnchor
+    (
+     )
+      {
+	m_accept = null;
+	m_anchor = CSpec.NONE;
+      }
+}
+
+/***************************************************************
+  Class: CNfaPair
+  **************************************************************/
+class CNfaPair
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  CNfa m_start;
+  CNfa m_end;
+  
+  /***************************************************************
+    Function: CNfaPair
+    **************************************************************/
+  CNfaPair
+    (
+     )
+      {
+	m_start = null;
+	m_end = null;
+      }
+}
+
+/***************************************************************
+  Class: CInput
+  Description: 
+ **************************************************************/
+class CInput
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  private java.io.BufferedReader m_input; /* JLex specification file. */
+
+  boolean m_eof_reached; /* Whether EOF has been encountered. */
+  boolean m_pushback_line; 
+
+  char m_line[]; /* Line buffer. */
+  int m_line_read; /* Number of bytes read into line buffer. */
+  int m_line_index; /* Current index into line buffer. */
+
+  int m_line_number; /* Current line number. */
+
+  /***************************************************************
+    Constants
+    **************************************************************/
+  static final boolean EOF = true;
+  static final boolean NOT_EOF = false;
+  
+  /***************************************************************
+    Function: CInput
+    Description: 
+    **************************************************************/
+  CInput
+    (
+     java.io.Reader input
+     )
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != input);
+	  }
+
+	/* Initialize input stream. */
+	m_input = new java.io.BufferedReader(input);
+
+	/* Initialize buffers and index counters. */
+	m_line = null;
+	m_line_read = 0;
+	m_line_index = 0;
+
+	/* Initialize state variables. */
+	m_eof_reached = false;
+	m_line_number = 0;
+	m_pushback_line = false;
+      }
+
+  /***************************************************************
+    Function: getLine
+    Description: Returns true on EOF, false otherwise.
+    Guarantees not to return a blank line, or a line
+    of zero length.
+    **************************************************************/
+  boolean getLine 
+    (
+     )
+      throws java.io.IOException
+      {
+	String lineStr;
+	int elem;
+	
+	/* Has EOF already been reached? */
+	if (m_eof_reached)
+	  {
+	    return EOF;
+	  }
+	
+	/* Pushback current line? */
+	if (m_pushback_line)
+	  {
+	    m_pushback_line = false;
+
+	    /* Check for empty line. */
+	    for (elem = 0; elem < m_line_read; ++elem)
+	      {
+		if (false == CUtility.isspace(m_line[elem]))
+		  {
+		    break;
+		  }
+	      }
+
+	    /* Nonempty? */
+	    if (elem < m_line_read)
+	      {
+		m_line_index = 0;
+		return NOT_EOF;
+	      }
+	  }
+
+	while (true)
+	  {
+	    if (null == (lineStr = m_input.readLine()))
+	      {
+		m_eof_reached = true;
+		m_line_index = 0;
+		return EOF;
+	      }
+	    m_line = (lineStr + "\n").toCharArray();
+	    m_line_read=m_line.length;
+	    ++m_line_number;
+	    
+	    /* Check for empty lines and discard them. */
+	    elem = 0;
+	    while (CUtility.isspace(m_line[elem])) 
+	      {
+		++elem;
+		if (elem == m_line_read)
+		  {
+		    break;
+		  }
+	      }
+	    
+	    if (elem < m_line_read)
+	      {
+		break;
+	      }
+	  }
+
+	m_line_index = 0;
+	return NOT_EOF;
+      }
+}
+
+/********************************************************
+  Class: Utility
+  *******************************************************/
+class CUtility 
+{
+  /********************************************************
+    Constants
+    *******************************************************/
+  static final boolean DEBUG = true;
+  static final boolean SLOW_DEBUG = true;
+  static final boolean DUMP_DEBUG = true;
+  /*static final boolean DEBUG = false;
+  static final boolean SLOW_DEBUG = false;
+  static final boolean DUMP_DEBUG = false;*/
+  static final boolean DESCENT_DEBUG = false;
+  static final boolean OLD_DEBUG = false;
+  static final boolean OLD_DUMP_DEBUG = false;
+  static final boolean FOODEBUG = false;
+  static final boolean DO_DEBUG = false;
+  
+  /********************************************************
+    Constants: Integer Bounds
+    *******************************************************/
+  static final int INT_MAX = 2147483647;
+
+  static final int MAX_SEVEN_BIT = 127;
+  static final int MAX_EIGHT_BIT = 255;
+  static final int MAX_SIXTEEN_BIT=65535;
+
+  /********************************************************
+    Function: enter
+    Description: Debugging routine.
+    *******************************************************/
+  static void enter
+    (
+     String descent,
+     char lexeme,
+     int token
+     )
+      {
+	System.out.println("Entering " + descent 
+			   + " [lexeme: " + lexeme 
+			   + "] [token: " + token + "]");
+      }
+
+  /********************************************************
+    Function: leave
+    Description: Debugging routine.
+    *******************************************************/
+  static void leave
+    (
+     String descent,
+     char lexeme,
+     int token
+     )
+      {
+	System.out.println("Leaving " + descent 
+			   + " [lexeme:" + lexeme 
+			   + "] [token:" + token + "]");
+      }
+
+  /********************************************************
+    Function: ASSERT
+    Description: Debugging routine.
+    *******************************************************/
+  static void ASSERT
+    (
+     boolean expr
+     )
+      {
+	if (DEBUG && false == expr)
+	  {
+	    System.out.println("Assertion Failed");
+	    throw new Error("Assertion Failed.");
+	  }
+      }
+
+  /***************************************************************
+    Function: doubleSize
+    **************************************************************/
+  static char[] doubleSize
+    (
+     char oldBuffer[]
+     )
+      {
+	char newBuffer[] = new char[2 * oldBuffer.length];
+	int elem;
+
+	for (elem = 0; elem < oldBuffer.length; ++elem)
+	  {
+	    newBuffer[elem] = oldBuffer[elem];
+	  }
+
+	return newBuffer;
+      }
+
+  /***************************************************************
+    Function: doubleSize
+    **************************************************************/
+  static byte[] doubleSize
+    (
+     byte oldBuffer[]
+     )
+      {
+	byte newBuffer[] = new byte[2 * oldBuffer.length];
+	int elem;
+
+	for (elem = 0; elem < oldBuffer.length; ++elem)
+	  {
+	    newBuffer[elem] = oldBuffer[elem];
+	  }
+
+	return newBuffer;
+      }
+
+  /********************************************************
+    Function: hex2bin
+    *******************************************************/
+  static char hex2bin
+    (
+     char c
+     )
+      {
+	if ('0' <= c && '9' >= c)
+	  {
+	    return (char) (c - '0');
+	  }
+	else if ('a' <= c && 'f' >= c)
+	  {
+	    return (char) (c - 'a' + 10);
+	  }	    
+	else if ('A' <= c && 'F' >= c)
+	  {
+	    return (char) (c - 'A' + 10);
+	  }
+	
+	CError.impos("Bad hexidecimal digit" + c);
+	return 0;
+      }
+
+  /********************************************************
+    Function: ishexdigit
+    *******************************************************/
+  static boolean ishexdigit
+    (
+     char c
+     )
+      {
+	if (('0' <= c && '9' >= c)
+	    || ('a' <= c && 'f' >= c)
+	    || ('A' <= c && 'F' >= c))
+	  {
+	    return true;
+	  }
+
+	return false;
+      }
+
+  /********************************************************
+    Function: oct2bin
+    *******************************************************/
+  static char oct2bin
+    (
+     char c
+     )
+      {
+	if ('0' <= c && '7' >= c)
+	  {
+	    return (char) (c - '0');
+	  }
+	
+	CError.impos("Bad octal digit " + c);
+	return 0;
+      }
+
+  /********************************************************
+    Function: isoctdigit
+    *******************************************************/
+  static boolean isoctdigit
+    (
+     char c
+     )
+      {
+	if ('0' <= c && '7' >= c)
+	  {
+	    return true;
+	  }
+
+	return false;
+      }
+	
+  /********************************************************
+    Function: isspace
+    *******************************************************/
+  static boolean isspace
+    (
+     char c
+     )
+      {
+	if ('\b' == c 
+	    || '\t' == c
+	    || '\n' == c
+	    || '\f' == c
+	    || '\r' == c
+	    || ' ' == c)
+	  {
+	    return true;
+	  }
+	
+	return false;
+      }
+
+  /********************************************************
+    Function: isnewline
+    *******************************************************/
+  static boolean isnewline
+    (
+     char c
+     )
+      {
+	if ('\n' == c
+	    || '\r' == c)
+	    {
+	    return true;
+	  }
+	
+	return false;
+      }
+
+  /********************************************************
+    Function: bytencmp
+    Description: Compares up to n elements of 
+    byte array a[] against byte array b[].
+    The first byte comparison is made between 
+    a[a_first] and b[b_first].  Comparisons continue
+    until the null terminating byte '\0' is reached
+    or until n bytes are compared.
+    Return Value: Returns 0 if arrays are the 
+    same up to and including the null terminating byte 
+    or up to and including the first n bytes,
+    whichever comes first.
+    *******************************************************/
+  static int bytencmp
+    (
+     byte a[],
+     int a_first,
+     byte b[],
+     int b_first,
+     int n
+     )
+      {
+	int elem;
+
+	for (elem = 0; elem < n; ++elem)
+	  {
+	    /*System.out.print((char) a[a_first + elem]);
+	    System.out.print((char) b[b_first + elem]);*/
+			     
+	    if ('\0' == a[a_first + elem] && '\0' == b[b_first + elem])
+	      {
+		/*System.out.println("return 0");*/
+		return 0;
+	      }
+	    if (a[a_first + elem] < b[b_first + elem])
+	      {
+		/*System.out.println("return 1");*/
+		return 1;
+	      }
+	    else if (a[a_first + elem] > b[b_first + elem])
+	      {
+		/*System.out.println("return -1");*/
+		return -1;
+	      }
+	  }
+
+	/*System.out.println("return 0");*/
+	return 0;
+      }
+
+  /********************************************************
+    Function: charncmp
+    *******************************************************/
+  static int charncmp
+    (
+     char a[],
+     int a_first,
+     char b[],
+     int b_first,
+     int n
+     )
+      {
+	int elem;
+
+	for (elem = 0; elem < n; ++elem)
+	  {
+	    if ('\0' == a[a_first + elem] && '\0' == b[b_first + elem])
+	      {
+		return 0;
+	      }
+	    if (a[a_first + elem] < b[b_first + elem])
+	      {
+		return 1;
+	      }
+	    else if (a[a_first + elem] > b[b_first + elem])
+	      {
+		return -1;
+	      }
+	  }
+
+	return 0;
+      }
+}
+
+/********************************************************
+  Class: CError
+  *******************************************************/
+class CError 
+{
+  /********************************************************
+    Function: impos
+    Description:
+    *******************************************************/
+  static void impos
+    (
+     String message
+     )
+      {
+	System.out.println("JLex Error: " + message);
+      }
+
+  /********************************************************
+    Constants
+    Description: Error codes for parse_error().
+    *******************************************************/
+  static final int E_BADEXPR = 0;
+  static final int E_PAREN = 1;
+  static final int E_LENGTH = 2;
+  static final int E_BRACKET = 3;
+  static final int E_BOL = 4;
+  static final int E_CLOSE = 5;
+  static final int E_NEWLINE = 6;
+  static final int E_BADMAC = 7;
+  static final int E_NOMAC = 8;
+  static final int E_MACDEPTH = 9;
+  static final int E_INIT = 10;
+  static final int E_EOF = 11;
+  static final int E_DIRECT = 12;
+  static final int E_INTERNAL = 13;
+  static final int E_STATE = 14;
+  static final int E_MACDEF = 15;
+  static final int E_SYNTAX = 16;
+  static final int E_BRACE = 17;
+  static final int E_DASH = 18;
+  static final int E_ZERO = 19;
+  static final int E_BADCTRL = 20;
+  
+  /********************************************************
+    Constants
+    Description: String messages for parse_error();
+    *******************************************************/
+  static final String errmsg[] = 
+    {
+      "Malformed regular expression.",
+      "Missing close parenthesis.",
+      "Too many regular expressions or expression too long.",
+      "Missing [ in character class.",
+      "^ must be at start of expression or after [.",
+      "+ ? or * must follow an expression or subexpression.",
+      "Newline in quoted string.",
+      "Missing } in macro expansion.",
+      "Macro does not exist.",
+      "Macro expansions nested too deeply.",
+      "JLex has not been successfully initialized.",
+      "Unexpected end-of-file found.",
+      "Undefined or badly-formed JLex directive.",
+      "Internal JLex error.",
+      "Unitialized state name.",
+      "Badly formed macro definition.",
+      "Syntax error.",
+      "Missing brace at start of lexical action.",
+      "Special character dash - in character class [...] must\n"
+	+ "\tbe preceded by start-of-range character.",
+      "Zero-length regular expression.",
+      "Illegal \\^C-style escape sequence (character following caret must\n"
+        + "\tbe alphabetic).",
+    };
+  
+  /********************************************************
+    Function: parse_error
+    Description:
+    *******************************************************/
+  static void parse_error
+    (
+     int error_code,
+     int line_number
+     )
+      {
+	System.out.println("Error: Parse error at line " 
+			   + line_number + ".");
+	System.out.println("Description: " + errmsg[error_code]);
+	throw new Error("Parse error.");
+      }
+}
+
+/********************************************************
+  Class: CSet
+  *******************************************************/
+class CSet 
+{
+  /********************************************************
+    Member Variables
+    *******************************************************/
+  private SparseBitSet m_set;
+  private boolean m_complement;
+
+  /********************************************************
+    Function: CSet
+    *******************************************************/
+  CSet
+    (
+     )
+    {
+      m_set = new SparseBitSet();
+      m_complement = false;
+    }
+
+  /********************************************************
+    Function: complement
+    *******************************************************/
+  void complement
+    (
+     )
+      {
+	m_complement = true;
+      }
+
+  /********************************************************
+    Function: add
+    *******************************************************/
+  void add
+    (
+     int i
+     )
+      {
+	m_set.set(i);
+      }
+
+  /********************************************************
+    Function: addncase
+    *******************************************************/
+  void addncase // add, ignoring case.
+    (
+     char c
+     )
+      {
+	/* Do this in a Unicode-friendly way. */
+	/* (note that duplicate adds have no effect) */
+	add(c);
+	add(Character.toLowerCase(c));
+	add(Character.toTitleCase(c));
+	add(Character.toUpperCase(c));
+      }
+  
+  /********************************************************
+    Function: contains
+    *******************************************************/
+  boolean contains
+    (
+     int i
+     )
+      {
+	boolean result;
+	
+	result = m_set.get(i);
+	
+	if (m_complement)
+	  {
+	    return (false == result);
+	  }
+	
+	return result;
+      }
+
+  /********************************************************
+    Function: mimic
+    *******************************************************/
+  void mimic
+    (
+     CSet set
+     )
+      {
+	m_complement = set.m_complement;
+	m_set = (SparseBitSet) set.m_set.clone();
+      } 
+
+  /** Map set using character classes [CSA] */
+  void map(CSet set, int[] mapping) {
+    m_complement = set.m_complement;
+    m_set.clearAll();
+    for (Enumeration e=set.m_set.elements(); e.hasMoreElements(); ) {
+      int old_value =((Integer)e.nextElement()).intValue();
+      if (old_value<mapping.length) // skip unmapped characters
+	m_set.set(mapping[old_value]);
+    }
+  }
+}
+
+/********************************************************
+  Class: CNfa
+  *******************************************************/
+class CNfa
+{
+  /********************************************************
+    Member Variables
+    *******************************************************/
+  int m_edge;  /* Label for edge type:
+			 character code, 
+			 CCL (character class), 
+			 [STATE,
+			 SCL (state class),]
+			 EMPTY, 
+			 EPSILON. */
+  
+  CSet m_set;  /* Set to store character classes. */
+  CNfa m_next;  /* Next state (or null if none). */
+  
+  CNfa m_next2;  /* Another state with type == EPSILON
+			   and null if not used.  
+			   The NFA construction should result in two
+			   outgoing edges only if both are EPSILON edges. */
+  
+  CAccept m_accept;  /* Set to null if nonaccepting state. */
+  int m_anchor;  /* Says if and where pattern is anchored. */
+
+  int m_label;
+
+  SparseBitSet m_states;
+
+  /********************************************************
+    Constants
+    *******************************************************/
+  static final int NO_LABEL = -1;
+
+  /********************************************************
+    Constants: Edge Types
+    Note: Edge transitions on one specific character
+    are labelled with the character Ascii (Unicode)
+    codes.  So none of the constants below should
+    overlap with the natural character codes.
+    *******************************************************/
+  static final int CCL = -1;
+  static final int EMPTY = -2;
+  static final int EPSILON = -3;
+   
+  /********************************************************
+    Function: CNfa
+    *******************************************************/
+ CNfa
+    (
+     )
+    {
+      m_edge = EMPTY;
+      m_set = null;
+      m_next = null;
+      m_next2 = null;
+      m_accept = null;
+      m_anchor = CSpec.NONE;
+      m_label = NO_LABEL;
+      m_states = null;
+    }
+
+  /********************************************************
+    Function: mimic
+    Description: Converts this NFA state into a copy of
+    the input one.
+    *******************************************************/
+  void mimic
+    (
+     CNfa nfa
+     )
+      {
+	m_edge = nfa.m_edge;
+	
+	if (null != nfa.m_set)
+	  {
+	    if (null == m_set)
+	      {
+		m_set = new CSet();
+	      }
+	    m_set.mimic(nfa.m_set);
+	  }
+	else
+	  {
+	    m_set = null;
+	  }
+
+	m_next = nfa.m_next;
+	m_next2 = nfa.m_next2;
+	m_accept = nfa.m_accept;
+	m_anchor = nfa.m_anchor;
+
+	if (null != nfa.m_states)
+	  {
+	    m_states = (SparseBitSet) nfa.m_states.clone();
+	  }
+	else
+	  {
+	    m_states = null;
+	  }
+      }
+}
+
+/***************************************************************
+  Class: CLexGen
+  **************************************************************/
+class CLexGen 
+{
+  /***************************************************************
+    Member Variables
+    **************************************************************/
+  private java.io.Reader m_instream; /* JLex specification file. */
+  private java.io.PrintWriter m_outstream; /* Lexical analyzer source file. */
+
+  private CInput m_input; /* Input buffer class. */
+
+  private Hashtable m_tokens; /* Hashtable that maps characters to their 
+				 corresponding lexical code for
+				 the internal lexical analyzer. */
+  private CSpec m_spec; /* Spec class holds information
+			   about the generated lexer. */
+  private boolean m_init_flag; /* Flag set to true only upon 
+				  successful initialization. */
+
+  private CMakeNfa m_makeNfa; /* NFA machine generator module. */
+  private CNfa2Dfa m_nfa2dfa; /* NFA to DFA machine (transition table) 
+				 conversion module. */
+  private CMinimize m_minimize; /* Transition table compressor. */
+  private CSimplifyNfa m_simplifyNfa; /* NFA simplifier using char classes */
+  private CEmit m_emit; /* Output module that emits source code
+			   into the generated lexer file. */
+
+
+  /********************************************************
+    Constants
+    *******************************************************/
+  private static final boolean ERROR = false;
+  private static final boolean NOT_ERROR = true;
+  private static final int BUFFER_SIZE = 1024;
+
+  /********************************************************
+    Constants: Token Types
+    *******************************************************/
+  static final int EOS = 1;
+  static final int ANY = 2;
+  static final int AT_BOL = 3;
+  static final int AT_EOL = 4;
+  static final int CCL_END = 5;
+  static final int CCL_START = 6;
+  static final int CLOSE_CURLY = 7;
+  static final int CLOSE_PAREN = 8;
+  static final int CLOSURE = 9;
+  static final int DASH = 10;
+  static final int END_OF_INPUT = 11;
+  static final int L = 12;
+  static final int OPEN_CURLY = 13;
+  static final int OPEN_PAREN = 14;
+  static final int OPTIONAL = 15;
+  static final int OR = 16;
+  static final int PLUS_CLOSE = 17;
+
+  /***************************************************************
+    Function: CLexGen
+    **************************************************************/
+  CLexGen 
+    (
+     String filename
+     )
+      throws java.io.FileNotFoundException, java.io.IOException
+      {
+	/* Successful initialization flag. */
+	m_init_flag = false;
+	
+	/* Open input stream. */
+	m_instream = new java.io.FileReader(filename);
+	if (null == m_instream)
+	  {
+	    System.out.println("Error: Unable to open input file "
+			       + filename + ".");
+	    return;
+	  }
+
+	/* Open output stream. */
+	m_outstream 
+	  = new java.io.PrintWriter(new java.io.BufferedWriter(
+		new java.io.FileWriter(filename + ".java")));
+	if (null == m_outstream)
+	  {
+	    System.out.println("Error: Unable to open output file "
+			       + filename + ".java.");
+	    return;
+	  }
+
+	/* Create input buffer class. */
+	m_input = new CInput(m_instream);
+
+	/* Initialize character hash table. */
+	m_tokens = new Hashtable();
+	m_tokens.put(new Character('$'),new Integer(AT_EOL));
+	m_tokens.put(new Character('('),new Integer(OPEN_PAREN));
+	m_tokens.put(new Character(')'),new Integer(CLOSE_PAREN));
+	m_tokens.put(new Character('*'),new Integer(CLOSURE));
+	m_tokens.put(new Character('+'),new Integer(PLUS_CLOSE));
+	m_tokens.put(new Character('-'),new Integer(DASH));
+	m_tokens.put(new Character('.'),new Integer(ANY));
+	m_tokens.put(new Character('?'),new Integer(OPTIONAL));
+	m_tokens.put(new Character('['),new Integer(CCL_START));
+	m_tokens.put(new Character(']'),new Integer(CCL_END));
+	m_tokens.put(new Character('^'),new Integer(AT_BOL));
+	m_tokens.put(new Character('{'),new Integer(OPEN_CURLY));
+	m_tokens.put(new Character('|'),new Integer(OR));
+	m_tokens.put(new Character('}'),new Integer(CLOSE_CURLY));
+      
+	/* Initialize spec structure. */
+	m_spec = new CSpec(this);
+	
+	/* Nfa to dfa converter. */
+	m_nfa2dfa = new CNfa2Dfa();
+	m_minimize = new CMinimize();
+	m_makeNfa = new CMakeNfa();
+	m_simplifyNfa = new CSimplifyNfa();
+
+	m_emit = new CEmit();
+
+	/* Successful initialization flag. */
+	m_init_flag = true;
+      }
+
+  /***************************************************************
+    Function: generate
+    Description: 
+    **************************************************************/
+  void generate
+    (
+     )
+      throws java.io.IOException, java.io.FileNotFoundException
+      {
+	if (false == m_init_flag)
+	  {
+	    CError.parse_error(CError.E_INIT,0);
+	  }
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	    CUtility.ASSERT(m_init_flag);
+	  }
+
+	/*m_emit.emit_imports(m_spec,m_outstream);*/
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Processing first section -- user code.");
+	  }
+	userCode();
+	if (m_input.m_eof_reached)
+	  {
+	    CError.parse_error(CError.E_EOF,m_input.m_line_number);
+	  }
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Processing second section -- " 
+			       + "JLex declarations.");
+	  }
+	userDeclare();
+	if (m_input.m_eof_reached)
+	  {
+	    CError.parse_error(CError.E_EOF,m_input.m_line_number);
+	  }
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Processing third section -- lexical rules.");
+	  }
+	userRules();
+ 	if (CUtility.DO_DEBUG)
+	  {
+	    print_header();
+	  }
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Outputting lexical analyzer code.");
+	  }
+	m_emit.emit(m_spec,m_outstream);
+
+	if (m_spec.m_verbose && true == CUtility.OLD_DUMP_DEBUG)
+	  {
+	    details();
+	  }
+	
+	m_outstream.close();
+      }
+
+  /***************************************************************
+    Function: userCode
+    Description: Process first section of specification,
+    echoing it into output file.
+    **************************************************************/
+  private void userCode
+    (
+     )
+      throws java.io.IOException
+      {
+	int count = 0;
+
+	if (false == m_init_flag)
+	  {
+	    CError.parse_error(CError.E_INIT,0);
+	  }
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	if (m_input.m_eof_reached)
+	  {
+	    CError.parse_error(CError.E_EOF,0);
+	  }
+
+	while (true)
+	  {
+	    if (m_input.getLine())
+	      {
+		/* Eof reached. */
+		CError.parse_error(CError.E_EOF,0);
+	      }
+	    
+	    if (2 <= m_input.m_line_read 
+		&& '%' == m_input.m_line[0]
+		&& '%' == m_input.m_line[1])
+	      {
+		/* Discard remainder of line. */
+		m_input.m_line_index = m_input.m_line_read;
+		return;
+	      }
+
+	    m_outstream.print(new String(m_input.m_line,0,
+					      m_input.m_line_read));
+	  }
+      }
+
+  /***************************************************************
+    Function: getName
+    **************************************************************/
+  private char[] getName
+    (
+     )
+      {
+	char buffer[];
+	int elem;
+
+	/* Skip white space. */
+	while (m_input.m_line_index < m_input.m_line_read
+	       && true == CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+	  {
+	    ++m_input.m_line_index;
+	  }
+
+	/* No name? */
+	if (m_input.m_line_index >= m_input.m_line_read)
+	  {
+	    CError.parse_error(CError.E_DIRECT,0);
+	  }
+
+	/* Determine length. */
+	elem = m_input.m_line_index;
+	while (elem < m_input.m_line_read
+	       && false == CUtility.isnewline(m_input.m_line[elem]))
+	  {
+	    ++elem;
+	  } 
+
+	/* Allocate non-terminated buffer of exact length. */
+	buffer = new char[elem - m_input.m_line_index];
+	
+	/* Copy. */
+	elem = 0;
+	while (m_input.m_line_index < m_input.m_line_read
+	       && false == CUtility.isnewline(m_input.m_line[m_input.m_line_index]))
+	  {
+	    buffer[elem] = m_input.m_line[m_input.m_line_index];
+	    ++elem;
+	    ++m_input.m_line_index;
+	  }
+
+	return buffer;
+      }
+
+  private final int CLASS_CODE = 0;
+  private final int INIT_CODE = 1;
+  private final int EOF_CODE = 2;
+  private final int INIT_THROW_CODE = 3;
+  private final int YYLEX_THROW_CODE = 4;
+  private final int EOF_THROW_CODE = 5;
+  private final int EOF_VALUE_CODE = 6;
+
+  /***************************************************************
+    Function: packCode
+    Description:
+    **************************************************************/
+  private char[] packCode
+    (
+     char start_dir[],
+     char end_dir[],
+     char prev_code[],
+     int prev_read,
+     int specified
+     )
+      throws java.io.IOException
+      {
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(INIT_CODE == specified 
+			    || CLASS_CODE == specified
+			    || EOF_CODE == specified
+			    || EOF_VALUE_CODE == specified
+			    || INIT_THROW_CODE == specified
+			    || YYLEX_THROW_CODE == specified
+			    || EOF_THROW_CODE == specified);
+	  }
+
+	if (0 != CUtility.charncmp(m_input.m_line,
+				   0,
+				   start_dir,
+				   0,
+				   start_dir.length - 1))
+	  {
+	    CError.parse_error(CError.E_INTERNAL,0);
+	  }
+	
+	if (null == prev_code)
+	  {
+	    prev_code = new char[BUFFER_SIZE];
+	    prev_read = 0;
+	  }
+	
+	if (prev_read >= prev_code.length)
+	  {
+	    prev_code = CUtility.doubleSize(prev_code);
+	  }
+	
+	m_input.m_line_index = start_dir.length - 1;
+	while (true)
+	  {
+	    while (m_input.m_line_index >= m_input.m_line_read)
+	      {
+		if (m_input.getLine())
+		  {
+		    CError.parse_error(CError.E_EOF,m_input.m_line_number);
+		  }
+		
+		if (0 == CUtility.charncmp(m_input.m_line,
+					   0,
+					   end_dir,
+					   0,
+					   end_dir.length - 1))
+		  {
+		    m_input.m_line_index = end_dir.length - 1;
+		    
+		    switch (specified)
+		      {
+		      case CLASS_CODE:
+			m_spec.m_class_read = prev_read;
+			break;
+			
+		      case INIT_CODE:
+			m_spec.m_init_read = prev_read;
+			break;
+			
+		      case EOF_CODE:
+			m_spec.m_eof_read = prev_read;
+			break;
+
+		      case EOF_VALUE_CODE:
+			m_spec.m_eof_value_read = prev_read;
+			break;
+
+		      case INIT_THROW_CODE:
+			m_spec.m_init_throw_read = prev_read;
+			break;
+
+		      case YYLEX_THROW_CODE:
+			m_spec.m_yylex_throw_read = prev_read;
+			break;
+			
+		      case EOF_THROW_CODE:
+			m_spec.m_eof_throw_read = prev_read;
+			break;
+			
+		      default:
+			CError.parse_error(CError.E_INTERNAL,m_input.m_line_number);
+			break;
+		      }
+
+		    return prev_code;
+		  }
+	      }
+
+	    while (m_input.m_line_index < m_input.m_line_read)
+	      {
+		prev_code[prev_read] = m_input.m_line[m_input.m_line_index];
+		++prev_read;
+		++m_input.m_line_index;
+
+		if (prev_read >= prev_code.length)
+		  {
+		    prev_code = CUtility.doubleSize(prev_code);
+		  }
+	      }
+	  }
+      }
+
+  /***************************************************************
+    Member Variables: JLex directives.
+    **************************************************************/
+  private char m_state_dir[] = { 
+    '%', 's', 't', 
+    'a', 't', 'e',
+    '\0'
+    };
+  
+  private char m_char_dir[] = { 
+    '%', 'c', 'h',
+    'a', 'r',
+    '\0'
+    };
+
+  private char m_line_dir[] = { 
+    '%', 'l', 'i',
+    'n', 'e',
+    '\0'
+    };
+
+  private char m_cup_dir[] = { 
+    '%', 'c', 'u',
+    'p', 
+    '\0'
+    };
+
+  private char m_class_dir[] = { 
+    '%', 'c', 'l', 
+    'a', 's', 's',
+    '\0'
+    };
+
+  private char m_implements_dir[] = { 
+    '%', 'i', 'm', 'p', 'l', 'e', 'm', 'e', 'n', 't', 's', 
+    '\0'
+    };
+
+  private char m_function_dir[] = { 
+    '%', 'f', 'u',
+    'n', 'c', 't',
+    'i', 'o', 'n',
+    '\0'
+    };
+
+  private char m_type_dir[] = { 
+    '%', 't', 'y',
+    'p', 'e',
+    '\0'
+    };
+
+  private char m_integer_dir[] = { 
+    '%', 'i', 'n',
+    't', 'e', 'g', 
+    'e', 'r',
+    '\0'
+    };
+
+  private char m_intwrap_dir[] = { 
+    '%', 'i', 'n',
+    't', 'w', 'r', 
+    'a', 'p',
+    '\0'
+    };
+
+  private char m_full_dir[] = { 
+    '%', 'f', 'u', 
+    'l', 'l',
+    '\0'
+    };
+
+  private char m_unicode_dir[] = { 
+    '%', 'u', 'n', 
+    'i', 'c', 'o',
+    'd', 'e',
+    '\0'
+    };
+
+  private char m_ignorecase_dir[] = {
+    '%', 'i', 'g',
+    'n', 'o', 'r',
+    'e', 'c', 'a', 
+    's', 'e',
+    '\0'
+    };
+
+  private char m_notunix_dir[] = { 
+    '%', 'n', 'o',
+    't', 'u', 'n', 
+    'i', 'x',
+    '\0'
+    };
+
+  private char m_init_code_dir[] = { 
+    '%', 'i', 'n', 
+    'i', 't', '{',
+    '\0'
+    };
+
+  private char m_init_code_end_dir[] = { 
+    '%', 'i', 'n', 
+    'i', 't', '}',
+    '\0'
+    };
+
+  private char m_init_throw_code_dir[] = { 
+    '%', 'i', 'n', 
+    'i', 't', 't',
+    'h', 'r', 'o',
+    'w', '{',
+    '\0'
+    };
+
+  private char m_init_throw_code_end_dir[] = { 
+    '%', 'i', 'n', 
+    'i', 't', 't',
+    'h', 'r', 'o',
+    'w', '}',
+    '\0'
+    };
+
+  private char m_yylex_throw_code_dir[] = { 
+    '%', 'y', 'y', 'l', 
+    'e', 'x', 't',
+    'h', 'r', 'o',
+    'w', '{',
+    '\0'
+    };
+
+  private char m_yylex_throw_code_end_dir[] = { 
+    '%', 'y', 'y', 'l', 
+    'e', 'x', 't',
+    'h', 'r', 'o',
+    'w', '}',
+    '\0'
+    };
+
+  private char m_eof_code_dir[] = { 
+    '%', 'e', 'o', 
+    'f', '{',
+    '\0'
+    };
+
+  private char m_eof_code_end_dir[] = { 
+    '%', 'e', 'o', 
+    'f', '}',
+    '\0'
+    };
+
+  private char m_eof_value_code_dir[] = { 
+    '%', 'e', 'o', 
+    'f', 'v', 'a', 
+    'l', '{',
+    '\0'
+    };
+
+  private char m_eof_value_code_end_dir[] = { 
+    '%', 'e', 'o', 
+    'f', 'v', 'a',
+    'l', '}',
+    '\0'
+    };
+
+  private char m_eof_throw_code_dir[] = { 
+    '%', 'e', 'o', 
+    'f', 't', 'h',
+    'r', 'o', 'w',
+    '{',
+    '\0'
+    };
+
+  private char m_eof_throw_code_end_dir[] = { 
+    '%', 'e', 'o', 
+    'f', 't', 'h',
+    'r', 'o', 'w',
+    '}',
+    '\0'
+    };
+
+  private char m_class_code_dir[] = { 
+    '%', '{',
+    '\0'
+    };
+
+  private char m_class_code_end_dir[] = { 
+    '%', '}',
+    '\0'
+    };
+
+  private char m_yyeof_dir[] = { 
+    '%', 'y', 'y',
+    'e', 'o', 'f',
+    '\0'
+    };
+  
+  private char m_public_dir[] = { 
+    '%', 'p', 'u',
+    'b', 'l', 'i', 
+    'c', '\0'
+    };
+  
+  /***************************************************************
+    Function: userDeclare
+    Description:
+    **************************************************************/
+  private void userDeclare
+    (
+     )
+      throws java.io.IOException
+	{
+	  int elem;
+	  
+	  if (CUtility.DEBUG)
+	    {
+	      CUtility.ASSERT(null != this);
+	      CUtility.ASSERT(null != m_outstream);
+	      CUtility.ASSERT(null != m_input);
+	      CUtility.ASSERT(null != m_tokens);
+	      CUtility.ASSERT(null != m_spec);
+	    }
+
+	  if (m_input.m_eof_reached)
+	    {
+	      /* End-of-file. */
+	      CError.parse_error(CError.E_EOF,
+				 m_input.m_line_number);
+	    }
+
+	  while (false == m_input.getLine())
+	    {
+	      /* Look for double percent. */
+	      if (2 <= m_input.m_line_read 
+		  && '%' == m_input.m_line[0] 
+		  && '%' == m_input.m_line[1])
+		{
+		  /* Mess around with line. */
+		  m_input.m_line_read -= 2;
+		  System.arraycopy(m_input.m_line, 2,
+				   m_input.m_line, 0, m_input.m_line_read);
+
+		  m_input.m_pushback_line = true;
+		  /* Check for and discard empty line. */
+		  if (0 == m_input.m_line_read 
+		      || '\n' == m_input.m_line[0])
+		    {
+		      m_input.m_pushback_line = false;
+		    }
+
+		  return;
+		}
+
+	      if (0 == m_input.m_line_read)
+		{
+		  continue;
+		}
+
+	      if ('%' == m_input.m_line[0])
+		{
+		  /* Special lex declarations. */
+		  if (1 >= m_input.m_line_read)
+		    {
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      continue;
+		    }
+
+		  switch (m_input.m_line[1])
+		    {
+		    case '{':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_class_code_dir,
+						 0,
+						 m_class_code_dir.length - 1))
+			{
+			  m_spec.m_class_code = packCode(m_class_code_dir,
+							 m_class_code_end_dir,
+							 m_spec.m_class_code,
+							 m_spec.m_class_read,
+							 CLASS_CODE);
+			  break;
+			}
+	      
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'c':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_char_dir,
+						 0,
+						 m_char_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_char_dir.length;
+			  m_spec.m_count_chars = true;
+			  break;
+			}	
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_class_dir, 
+						      0,
+						      m_class_dir.length - 1))
+			{
+			  m_input.m_line_index = m_class_dir.length;
+			  m_spec.m_class_name = getName();
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_cup_dir,
+						      0,
+						      m_cup_dir.length - 1))
+			{
+			  /* Set Java CUP compatibility to ON. */
+			  m_input.m_line_index = m_cup_dir.length;
+			  m_spec.m_cup_compatible = true;
+			  // this is what %cup does: [CSA, 27-Jul-1999]
+			  m_spec.m_implements_name =
+			      "java_cup.runtime.Scanner".toCharArray();
+			  m_spec.m_function_name =
+			      "next_token".toCharArray();
+			  m_spec.m_type_name =
+			      "java_cup.runtime.Symbol".toCharArray();
+			  break;
+			}
+	      
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+		      
+		    case 'e':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_eof_code_dir,
+						 0,
+						 m_eof_code_dir.length - 1))
+			{
+			  m_spec.m_eof_code = packCode(m_eof_code_dir,
+						       m_eof_code_end_dir,
+						       m_spec.m_eof_code,
+						       m_spec.m_eof_read,
+						       EOF_CODE);
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_eof_value_code_dir,
+						      0,
+						      m_eof_value_code_dir.length - 1))
+			{
+			  m_spec.m_eof_value_code = packCode(m_eof_value_code_dir,
+							     m_eof_value_code_end_dir,
+							     m_spec.m_eof_value_code,
+							     m_spec.m_eof_value_read,
+							     EOF_VALUE_CODE);
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_eof_throw_code_dir,
+						      0,
+						      m_eof_throw_code_dir.length - 1))
+			{
+			  m_spec.m_eof_throw_code = packCode(m_eof_throw_code_dir,
+						       m_eof_throw_code_end_dir,
+						       m_spec.m_eof_throw_code,
+						       m_spec.m_eof_throw_read,
+						       EOF_THROW_CODE);
+			  break;
+			}
+	      
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'f':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_function_dir,
+						 0,
+						 m_function_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_function_dir.length;
+			  m_spec.m_function_name = getName();
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_full_dir,
+						      0,
+						      m_full_dir.length - 1))
+			{
+			  m_input.m_line_index = m_full_dir.length;
+			  m_spec.m_dtrans_ncols = CUtility.MAX_EIGHT_BIT + 1;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'i':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_integer_dir,
+						 0,
+						 m_integer_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_integer_dir.length;
+			  m_spec.m_integer_type = true;
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_intwrap_dir,
+						      0,
+						      m_intwrap_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_integer_dir.length;
+			  m_spec.m_intwrap_type = true;
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_init_code_dir,
+						      0,
+						      m_init_code_dir.length - 1))
+			{
+			  m_spec.m_init_code = packCode(m_init_code_dir,
+							m_init_code_end_dir,
+							m_spec.m_init_code,
+							m_spec.m_init_read,
+							INIT_CODE);
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_init_throw_code_dir,
+						      0,
+						      m_init_throw_code_dir.length - 1))
+			{
+			  m_spec.m_init_throw_code = packCode(m_init_throw_code_dir,
+						       m_init_throw_code_end_dir,
+						       m_spec.m_init_throw_code,
+						       m_spec.m_init_throw_read,
+						       INIT_THROW_CODE);
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_implements_dir, 
+						      0,
+						      m_implements_dir.length - 1))
+			{
+			  m_input.m_line_index = m_implements_dir.length;
+			  m_spec.m_implements_name = getName();
+			  break;
+			}
+		      else if (0 == CUtility.charncmp(m_input.m_line,
+						      0,
+						      m_ignorecase_dir,
+						      0,
+						      m_ignorecase_dir.length-1))
+			{
+			  /* Set m_ignorecase to ON. */
+			  m_input.m_line_index = m_ignorecase_dir.length;
+			  m_spec.m_ignorecase = true;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'l':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_line_dir,
+						 0,
+						 m_line_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_line_dir.length;
+			  m_spec.m_count_lines = true;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'n':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_notunix_dir,
+						 0,
+						 m_notunix_dir.length - 1))
+			{
+			  /* Set line counting to ON. */
+			  m_input.m_line_index = m_notunix_dir.length;
+			  m_spec.m_unix = false;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'p':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_public_dir,
+						 0,
+						 m_public_dir.length - 1))
+			{
+			  /* Set public flag. */
+			  m_input.m_line_index = m_public_dir.length;
+			  m_spec.m_public = true;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 's':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_state_dir,
+						 0,
+						 m_state_dir.length - 1))
+			{
+			  /* Recognize state list. */
+			  m_input.m_line_index = m_state_dir.length;
+			  saveStates();
+			  break;
+			}
+
+		      /* Undefined directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+		     
+		    case 't':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_type_dir,
+						 0,
+						 m_type_dir.length - 1))
+			{
+			  /* Set Java CUP compatibility to ON. */
+			  m_input.m_line_index = m_type_dir.length;
+			  m_spec.m_type_name = getName();
+			  break;
+			}
+
+		      /* Undefined directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'u':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_unicode_dir,
+						 0,
+						 m_unicode_dir.length - 1))
+			{
+			  m_input.m_line_index = m_unicode_dir.length;
+			  m_spec.m_dtrans_ncols= CUtility.MAX_SIXTEEN_BIT + 1;
+			  break;
+			}
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    case 'y':
+		      if (0 == CUtility.charncmp(m_input.m_line,
+						 0,
+						 m_yyeof_dir,
+						 0,
+						 m_yyeof_dir.length - 1))
+			{
+			  m_input.m_line_index = m_yyeof_dir.length;
+			  m_spec.m_yyeof = true;
+			  break;
+			} else if (0 == CUtility.charncmp(m_input.m_line,
+							  0,
+							  m_yylex_throw_code_dir,
+							  0,
+							  m_yylex_throw_code_dir.length - 1))
+			{
+			  m_spec.m_yylex_throw_code = packCode(m_yylex_throw_code_dir,
+							       m_yylex_throw_code_end_dir,
+						       m_spec.m_yylex_throw_code,
+						       m_spec.m_yylex_throw_read,
+						       YYLEX_THROW_CODE);
+			  break;
+			}
+
+
+		      /* Bad directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+
+		    default:
+		      /* Undefined directive. */
+		      CError.parse_error(CError.E_DIRECT,
+					 m_input.m_line_number);
+		      break;
+		    }
+		}
+	      else
+		{
+		  /* Regular expression macro. */
+		  m_input.m_line_index = 0;
+		  saveMacro();
+		}
+
+	      if (CUtility.OLD_DEBUG)
+		{
+		  System.out.println("Line number " 
+				     + m_input.m_line_number + ":"); 
+		  System.out.print(new String(m_input.m_line,
+					      0,m_input.m_line_read));
+		}
+	    }
+	}
+	 
+  /***************************************************************
+    Function: userRules
+    Description: Processes third section of JLex 
+    specification and creates minimized transition table.
+    **************************************************************/
+  private void userRules
+    (
+     )
+      throws java.io.IOException
+      {
+	int code;
+
+	if (false == m_init_flag)
+	  {
+	    CError.parse_error(CError.E_INIT,0);
+	  }
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	/* UNDONE: Need to handle states preceding rules. */
+	
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Creating NFA machine representation.");
+	  }
+	m_makeNfa.allocate_BOL_EOF(m_spec);
+	m_makeNfa.thompson(this,m_spec,m_input);
+	
+	m_simplifyNfa.simplify(m_spec);
+
+	/*print_nfa();*/
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(END_OF_INPUT == m_spec.m_current_token);
+	  }
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Creating DFA transition table.");
+	  }
+	m_nfa2dfa.make_dfa(this,m_spec);
+
+	if (CUtility.FOODEBUG) {
+	  print_header();
+	}
+
+	if (m_spec.m_verbose)
+	  {
+	    System.out.println("Minimizing DFA transition table.");
+	  }
+	m_minimize.min_dfa(m_spec);
+      }
+
+  /***************************************************************
+    Function: printccl
+    Description: Debugging routine that outputs readable form
+    of character class.
+    **************************************************************/
+  private void printccl
+    (
+     CSet set
+     )
+      {
+	int i;
+	
+	System.out.print(" [");
+	for (i = 0; i < m_spec.m_dtrans_ncols; ++i)
+	  {
+	    if (set.contains(i))
+	      {
+		System.out.print(interp_int(i));
+	      }
+	  }
+	System.out.print(']');
+      }
+
+  /***************************************************************
+    Function: plab
+    Description:
+    **************************************************************/
+  private String plab
+    (
+     CNfa state
+     )
+      {
+	int index;
+	
+	if (null == state)
+	  {
+	    return (new String("--"));
+	  }
+
+	index = m_spec.m_nfa_states.indexOf(state);
+	
+	return ((new Integer(index)).toString());
+      }
+
+  /***************************************************************
+    Function: interp_int
+    Description:
+    **************************************************************/
+  private String interp_int
+    (
+     int i
+     )
+      {
+	switch (i)
+	  {
+	  case (int) '\b':
+	    return (new String("\\b"));
+
+	  case (int) '\t':
+	    return (new String("\\t"));
+
+	  case (int) '\n':
+	    return (new String("\\n"));
+
+	  case (int) '\f':
+	    return (new String("\\f"));
+
+	  case (int) '\r':
+	    return (new String("\\r"));
+	    
+	  case (int) ' ':
+	    return (new String("\\ "));
+	    
+	  default:
+	    return ((new Character((char) i)).toString());
+	  }
+      }
+
+  /***************************************************************
+    Function: print_nfa
+    Description:
+    **************************************************************/
+  void print_nfa
+    (
+     )
+      {
+	int elem;
+	CNfa nfa;
+	int size;
+	Enumeration states;
+	Integer index;
+	int i;
+	int j;
+	int vsize;
+	String state;
+     
+	System.out.println("--------------------- NFA -----------------------");
+	
+	size = m_spec.m_nfa_states.size();
+	for (elem = 0; elem < size; ++elem)
+	  {
+	    nfa = (CNfa) m_spec.m_nfa_states.elementAt(elem);
+	    
+	    System.out.print("Nfa state " + plab(nfa) + ": ");
+	    
+	    if (null == nfa.m_next)
+	      {
+		System.out.print("(TERMINAL)");
+	      }
+	    else
+	      {
+		System.out.print("--> " + plab(nfa.m_next));
+		System.out.print("--> " + plab(nfa.m_next2));
+		
+		switch (nfa.m_edge)
+		  {
+		  case CNfa.CCL:
+		    printccl(nfa.m_set);
+		    break;
+
+		  case CNfa.EPSILON:
+		    System.out.print(" EPSILON ");
+		    break; 
+		    
+		  default:
+		    System.out.print(" " + interp_int(nfa.m_edge));
+		    break;
+		  }
+	      }
+
+	    if (0 == elem)
+	      {
+		System.out.print(" (START STATE)");
+	      }
+	    
+	    if (null != nfa.m_accept)
+	      {
+		System.out.print(" accepting " 
+				 + ((0 != (nfa.m_anchor & CSpec.START)) ? "^" : "")
+				 + "<" 
+				 + (new String(nfa.m_accept.m_action,0,
+					       nfa.m_accept.m_action_read))
+				 + ">"
+				 + ((0 != (nfa.m_anchor & CSpec.END)) ? "$" : ""));
+	      }
+
+	    System.out.println();
+	  }
+
+	states = m_spec.m_states.keys();
+	while (states.hasMoreElements())
+	  {
+	    state = (String) states.nextElement();
+	    index = (Integer) m_spec.m_states.get(state);
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(null != state);
+		CUtility.ASSERT(null != index);
+	      }
+
+	    System.out.println("State \"" + state 
+			       + "\" has identifying index " 
+			       + index.toString() + ".");
+	    System.out.print("\tStart states of matching rules: ");
+	    
+	    i = index.intValue();
+	    vsize = m_spec.m_state_rules[i].size();
+	    
+	    for (j = 0; j < vsize; ++j)
+	      {
+		nfa = (CNfa) m_spec.m_state_rules[i].elementAt(j);
+
+		System.out.print(m_spec.m_nfa_states.indexOf(nfa) + " ");
+	      }
+
+	    System.out.println();
+	  }
+
+	System.out.println("-------------------- NFA ----------------------");
+      }
+
+  /***************************************************************
+    Function: getStates
+    Description: Parses the state area of a rule,
+    from the beginning of a line.
+    < state1, state2 ... > regular_expression { action }
+    Returns null on only EOF.  Returns all_states, 
+    initialied properly to correspond to all states,
+    if no states are found.
+    Special Notes: This function treats commas as optional
+    and permits states to be spread over multiple lines.
+    **************************************************************/
+  private SparseBitSet all_states = null;
+  SparseBitSet getStates
+    (
+     )
+      throws java.io.IOException
+      {
+	int start_state;
+	int count_state;
+	SparseBitSet states;
+	String name;
+	Integer index;
+	int i;
+	int size;
+	
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	states = null;
+
+	/* Skip white space. */
+	while (CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+	  {
+	    ++m_input.m_line_index;
+    
+	    while (m_input.m_line_index >= m_input.m_line_read)
+	      {
+		/* Must just be an empty line. */
+		if (m_input.getLine())
+		  {
+		    /* EOF found. */
+		    return null;
+		  }
+	      }
+	  }
+
+	/* Look for states. */
+	if ('<' == m_input.m_line[m_input.m_line_index])
+	  {
+	    ++m_input.m_line_index;
+	   
+	    states = new SparseBitSet();
+
+	    /* Parse states. */
+	    while (true)
+	      {
+		/* We may have reached the end of the line. */
+		while (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    if (m_input.getLine())
+		      {
+			/* EOF found. */
+			CError.parse_error(CError.E_EOF,m_input.m_line_number);
+			return states;
+		      }
+		  }
+
+		while (true)
+		  {
+		    /* Skip white space. */
+		    while (CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+		      {
+			++m_input.m_line_index;
+			
+			while (m_input.m_line_index >= m_input.m_line_read)
+			  {
+			    if (m_input.getLine())
+			      {
+				/* EOF found. */
+				CError.parse_error(CError.E_EOF,m_input.m_line_number);
+				return states;
+			      }
+			  }
+		      }
+		    
+		    if (',' != m_input.m_line[m_input.m_line_index])
+		      {
+			break;
+		      }
+
+		    ++m_input.m_line_index;
+		  }
+
+		if ('>' == m_input.m_line[m_input.m_line_index])
+		  {
+		    ++m_input.m_line_index;
+		    if (m_input.m_line_index < m_input.m_line_read)
+		      {
+			m_advance_stop = true;
+		      }
+		    return states;
+		  }
+
+		/* Read in state name. */
+		start_state = m_input.m_line_index;
+		while (false == CUtility.isspace(m_input.m_line[m_input.m_line_index])
+		       && ',' != m_input.m_line[m_input.m_line_index]
+		       && '>' != m_input.m_line[m_input.m_line_index])
+		  {
+		    ++m_input.m_line_index;
+
+		    if (m_input.m_line_index >= m_input.m_line_read)
+		      {
+			/* End of line means end of state name. */
+			break;
+		      }
+		  }
+		count_state = m_input.m_line_index - start_state;
+
+		/* Save name after checking definition. */
+		name = new String(m_input.m_line,
+				  start_state,
+				  count_state);
+		index = (Integer) m_spec.m_states.get(name);
+		if (null == index)
+		  {
+		    /* Uninitialized state. */
+		    System.out.println("Uninitialized State Name: " + name);
+		    CError.parse_error(CError.E_STATE,m_input.m_line_number);
+		  }
+		states.set(index.intValue());
+	      }
+	  }
+	
+	if (null == all_states)
+	  {
+	    all_states = new SparseBitSet();
+
+	    size = m_spec.m_states.size();
+	    for (i = 0; i < size; ++i)
+	      {
+		all_states.set(i);
+	      }
+	  }
+	
+	if (m_input.m_line_index < m_input.m_line_read)
+	  {
+	    m_advance_stop = true;
+	  }
+	return all_states;
+      }
+
+  /********************************************************
+    Function: expandMacro
+    Description: Returns false on error, true otherwise. 
+    *******************************************************/
+  private boolean expandMacro
+    (
+     )
+      {
+	int elem;
+	int start_macro;
+	int end_macro;
+	int start_name;
+	int count_name;
+	String def;
+	int def_elem;
+	String name;
+	char replace[];
+	int rep_elem;
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	/* Check for macro. */
+	if ('{' != m_input.m_line[m_input.m_line_index])
+	  {
+	    CError.parse_error(CError.E_INTERNAL,m_input.m_line_number);
+	    return ERROR;
+	  }
+	
+	start_macro = m_input.m_line_index;
+	elem = m_input.m_line_index + 1;
+	if (elem >= m_input.m_line_read)
+	  {
+	    CError.impos("Unfinished macro name");
+	    return ERROR;
+	  }
+	
+	/* Get macro name. */
+	start_name = elem;
+	while ('}' != m_input.m_line[elem])
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		CError.impos("Unfinished macro name at line " 
+			     + m_input.m_line_number);
+		return ERROR;
+	      }
+	  }
+	count_name = elem - start_name;
+	end_macro = elem;
+
+	/* Check macro name. */
+	if (0 == count_name)
+	  {
+	    CError.impos("Nonexistent macro name");
+	    return ERROR;
+	  }
+
+	/* Debug checks. */
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(0 < count_name);
+	  }
+
+	/* Retrieve macro definition. */
+	name = new String(m_input.m_line,start_name,count_name);
+	def = (String) m_spec.m_macros.get(name);
+	if (null == def)
+	  {
+	    /*CError.impos("Undefined macro \"" + name + "\".");*/
+	    System.out.println("Error: Undefined macro \"" + name + "\".");
+	    CError.parse_error(CError.E_NOMAC, m_input.m_line_number);
+	    return ERROR;
+	  }
+	if (CUtility.OLD_DUMP_DEBUG)
+	  {
+	    System.out.println("expanded escape: " + def);
+	  }
+		
+	/* Replace macro in new buffer,
+	   beginning by copying first part of line buffer. */
+	replace = new char[m_input.m_line.length];
+	for (rep_elem = 0; rep_elem < start_macro; ++rep_elem)
+	  {
+	    replace[rep_elem] = m_input.m_line[rep_elem];
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(rep_elem < replace.length);
+	      }
+	  }
+	
+	/* Copy macro definition. */
+	if (rep_elem >= replace.length)
+	  {
+	    replace = CUtility.doubleSize(replace);
+	  }
+	for (def_elem = 0; def_elem < def.length(); ++def_elem)
+	  {
+	    replace[rep_elem] = def.charAt(def_elem);
+	    
+	    ++rep_elem;
+	    if (rep_elem >= replace.length)
+	      {
+		replace = CUtility.doubleSize(replace);
+	      }
+	  }
+
+	/* Copy last part of line. */
+       	if (rep_elem >= replace.length)
+	  {
+	    replace = CUtility.doubleSize(replace);
+	  }
+	for (elem = end_macro + 1; elem < m_input.m_line_read; ++elem)
+	  {
+	    replace[rep_elem] = m_input.m_line[elem];
+	    
+	    ++rep_elem;
+	    if (rep_elem >= replace.length)
+	      {
+		replace = CUtility.doubleSize(replace);
+	      }
+	  } 
+	
+	/* Replace buffer. */
+	m_input.m_line = replace;
+	m_input.m_line_read = rep_elem;
+	
+	if (CUtility.OLD_DEBUG)
+	  {
+	    System.out.println(new String(m_input.m_line,0,m_input.m_line_read));
+	  }
+	return NOT_ERROR;
+      }
+
+  /***************************************************************
+    Function: saveMacro
+    Description: Saves macro definition of form:
+    macro_name = macro_definition
+    **************************************************************/
+  private void saveMacro
+    (
+     )
+      {
+	int elem;
+	int start_name;
+	int count_name;
+	int start_def;
+	int count_def;
+	boolean saw_escape;
+	boolean in_quote;
+	boolean in_ccl;
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	/* Macro declarations are of the following form:
+	   macro_name macro_definition */
+
+	elem = 0;
+	
+	/* Skip white space preceding macro name. */
+	while (CUtility.isspace(m_input.m_line[elem]))
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* End of line has been reached,
+		   and line was found to be empty. */
+		return;
+	      }
+	  }
+
+	/* Read macro name. */
+	start_name = elem;
+	while (false == CUtility.isspace(m_input.m_line[elem])
+	       && '=' != m_input.m_line[elem])
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* Macro name but no associated definition. */
+		CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	      }
+	  }
+	count_name = elem - start_name;
+
+	/* Check macro name. */
+	if (0 == count_name) 
+	  {
+	    /* Nonexistent macro name. */
+	    CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	  }
+
+	/* Skip white space between name and definition. */
+	while (CUtility.isspace(m_input.m_line[elem]))
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* Macro name but no associated definition. */
+		CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	      }
+	  }
+
+	if ('=' == m_input.m_line[elem])
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* Macro name but no associated definition. */
+		CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	      }
+	  }
+	else /* macro definition without = */
+		CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+
+	/* Skip white space between name and definition. */
+	while (CUtility.isspace(m_input.m_line[elem]))
+	  {
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* Macro name but no associated definition. */
+		CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	      }
+	  }
+
+	/* Read macro definition. */
+	start_def = elem;
+	in_quote = false;
+	in_ccl = false;
+	saw_escape = false;
+	while (false == CUtility.isspace(m_input.m_line[elem])
+	       || true == in_quote
+	       || true == in_ccl
+	       || true == saw_escape)
+	  {
+	    if ('\"' == m_input.m_line[elem] && false == saw_escape)
+	      {
+		in_quote = !in_quote;
+	      }
+	    
+	    if ('\\' == m_input.m_line[elem] && false == saw_escape)
+	      {
+		saw_escape = true;
+	      }
+	    else
+	      {
+		saw_escape = false;
+	      }
+	    if (false == saw_escape && false == in_quote) { // CSA, 24-jul-99
+	      if ('[' == m_input.m_line[elem] && false == in_ccl)
+		in_ccl = true;
+	      if (']' == m_input.m_line[elem] && true == in_ccl)
+		in_ccl = false;
+	    }
+
+	    ++elem;
+	    if (elem >= m_input.m_line_read)
+	      {
+		/* End of line. */
+		break;
+	      }
+	  }
+	count_def = elem - start_def;
+	  
+	/* Check macro definition. */
+	if (0 == count_def) 
+	  {
+	    /* Nonexistent macro name. */
+	    CError.parse_error(CError.E_MACDEF,m_input.m_line_number);
+	  }
+
+	/* Debug checks. */
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(0 < count_def);
+	    CUtility.ASSERT(0 < count_name);
+	    CUtility.ASSERT(null != m_spec.m_macros);
+	  }
+
+	if (CUtility.OLD_DEBUG)
+	  {
+	    System.out.println("macro name \""
+			       + new String(m_input.m_line,start_name,count_name)
+			       + "\".");
+	    System.out.println("macro definition \""
+			       + new String(m_input.m_line,start_def,count_def)
+			       + "\".");
+	  }
+
+	/* Add macro name and definition to table. */
+	m_spec.m_macros.put(new String(m_input.m_line,start_name,count_name),
+			    new String(m_input.m_line,start_def,count_def));
+      }
+
+  /***************************************************************
+    Function: saveStates
+    Description: Takes state declaration and makes entries
+    for them in state hashtable in CSpec structure.
+    State declaration should be of the form:
+    %state name0[, name1, name2 ...]
+    (But commas are actually optional as long as there is 
+    white space in between them.)
+    **************************************************************/
+  private void saveStates
+    (
+     )
+      {
+	int start_state;
+	int count_state;
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	/* EOF found? */
+	if (m_input.m_eof_reached)
+	  {
+	    return;
+	  }
+
+	/* Debug checks. */
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT('%' == m_input.m_line[0]);
+	    CUtility.ASSERT('s' == m_input.m_line[1]);
+	    CUtility.ASSERT(m_input.m_line_index <= m_input.m_line_read);
+	    CUtility.ASSERT(0 <= m_input.m_line_index);
+	    CUtility.ASSERT(0 <= m_input.m_line_read);
+	  }
+
+	/* Blank line?  No states? */
+	if (m_input.m_line_index >= m_input.m_line_read)
+	  {
+	    return;
+	  }
+
+	while (m_input.m_line_index < m_input.m_line_read)
+	  {
+	    if (CUtility.OLD_DEBUG)
+	      {
+		System.out.println("line read " + m_input.m_line_read 
+				   + "\tline index = " + m_input.m_line_index);
+	      }
+
+	    /* Skip white space. */
+	    while (CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+	      {
+		++m_input.m_line_index;
+		if (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    /* No more states to be found. */
+		    return;
+		  }
+	      }
+	    
+	    /* Look for state name. */
+	    start_state = m_input.m_line_index;
+	    while (false == CUtility.isspace(m_input.m_line[m_input.m_line_index])
+		   && ',' != m_input.m_line[m_input.m_line_index])
+	      {
+		++m_input.m_line_index;
+		if (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    /* End of line and end of state name. */
+		    break;
+		  }
+	      }
+	    count_state = m_input.m_line_index - start_state;
+
+	    if (CUtility.OLD_DEBUG)
+	      {
+		System.out.println("State name \"" 
+				   + new String(m_input.m_line,start_state,count_state)
+				   + "\".");
+		System.out.println("Integer index \"" 
+				   + m_spec.m_states.size()
+				   + "\".");
+	      }
+
+	    /* Enter new state name, along with unique index. */
+	    m_spec.m_states.put(new String(m_input.m_line,start_state,count_state),
+				new Integer(m_spec.m_states.size()));
+	    
+	    /* Skip comma. */
+	    if (',' == m_input.m_line[m_input.m_line_index])
+	      {
+		++m_input.m_line_index;
+		if (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    /* End of line. */
+		    return;
+		  }
+	      }
+	  }
+      }
+
+  /********************************************************
+    Function: expandEscape
+    Description: Takes escape sequence and returns
+    corresponding character code.
+    *******************************************************/
+  private char expandEscape
+    (
+     )
+      {
+	char r;
+	
+	/* Debug checks. */
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(m_input.m_line_index < m_input.m_line_read);
+	    CUtility.ASSERT(0 < m_input.m_line_read);
+	    CUtility.ASSERT(0 <= m_input.m_line_index);
+	  }
+
+	if ('\\' != m_input.m_line[m_input.m_line_index])
+	  {
+	    ++m_input.m_line_index;
+	    return m_input.m_line[m_input.m_line_index - 1];
+	  }
+	else
+	  {
+	    boolean unicode_escape = false;
+	    ++m_input.m_line_index;
+	    switch (m_input.m_line[m_input.m_line_index])
+	      {
+	      case 'b':
+		++m_input.m_line_index;
+		return '\b';
+
+	      case 't':
+		++m_input.m_line_index;
+		return '\t';
+
+	      case 'n':
+		++m_input.m_line_index;
+		return '\n';
+
+	      case 'f':
+		++m_input.m_line_index;
+		return '\f';
+
+	      case 'r':
+		++m_input.m_line_index;
+		return '\r';
+
+	      case '^':
+		++m_input.m_line_index;
+		r=Character.toUpperCase(m_input.m_line[m_input.m_line_index]);
+		if (r<'@' || r>'Z') // non-fatal
+		    CError.parse_error(CError.E_BADCTRL,m_input.m_line_number);
+		r = (char) (r - '@');
+		++m_input.m_line_index;
+		return r;
+
+	      case 'u':
+		unicode_escape = true;
+	      case 'x':
+		++m_input.m_line_index;
+		r = 0;
+		for (int i=0; i<(unicode_escape?4:2); i++)
+		  if (CUtility.ishexdigit(m_input.m_line[m_input.m_line_index]))
+		    {
+		      r = (char) (r << 4);
+		      r = (char) (r | CUtility.hex2bin(m_input.m_line[m_input.m_line_index]));
+		      ++m_input.m_line_index;
+		    }
+		  else break;
+		
+		return r;
+		
+	      default:
+		if (false == CUtility.isoctdigit(m_input.m_line[m_input.m_line_index]))
+		  {
+		    r = m_input.m_line[m_input.m_line_index];
+		    ++m_input.m_line_index;
+		  }
+		else
+		  {
+		    r = 0;
+		    for (int i=0; i<3; i++)
+		      if (CUtility.isoctdigit(m_input.m_line[m_input.m_line_index]))
+			{
+			  r = (char) (r << 3);
+			  r = (char) (r | CUtility.oct2bin(m_input.m_line[m_input.m_line_index]));
+			  ++m_input.m_line_index;
+			}
+		      else break;
+		  }
+		return r;
+	      }
+	  }
+      }
+	
+  /********************************************************
+    Function: packAccept
+    Description: Packages and returns CAccept 
+    for action next in input stream.
+    *******************************************************/
+  CAccept packAccept
+    (
+     )
+      throws java.io.IOException
+      {
+	CAccept accept;
+	char action[];
+	int action_index;
+	int brackets;
+	boolean insinglequotes;
+	boolean indoublequotes;
+	boolean instarcomment;
+	boolean inslashcomment;
+	boolean escaped;
+	boolean slashed;
+
+	action = new char[BUFFER_SIZE];
+	action_index = 0;
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != this);
+	    CUtility.ASSERT(null != m_outstream);
+	    CUtility.ASSERT(null != m_input);
+	    CUtility.ASSERT(null != m_tokens);
+	    CUtility.ASSERT(null != m_spec);
+	  }
+
+	/* Get a new line, if needed. */
+	while (m_input.m_line_index >= m_input.m_line_read)
+	  {
+	    if (m_input.getLine())
+	      {
+		CError.parse_error(CError.E_EOF,m_input.m_line_number);
+		return null;
+	      }
+	  }
+	
+	/* Look for beginning of action. */
+	while (CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+	  {
+	    ++m_input.m_line_index;
+	    
+	    /* Get a new line, if needed. */
+	    while (m_input.m_line_index >= m_input.m_line_read)
+	      {
+		if (m_input.getLine())
+		  {
+		    CError.parse_error(CError.E_EOF,m_input.m_line_number);
+		    return null;
+		  }
+	      }
+	  }
+	
+	/* Look for brackets. */
+	if ('{' != m_input.m_line[m_input.m_line_index])
+	  {
+	    CError.parse_error(CError.E_BRACE,m_input.m_line_number); 
+	  }
+	
+	/* Copy new line into action buffer. */
+	brackets = 0;
+	insinglequotes = indoublequotes = inslashcomment = instarcomment =
+	escaped  = slashed = false;
+	while (true)
+	  {
+	    action[action_index] = m_input.m_line[m_input.m_line_index];
+
+	    /* Look for quotes. */
+	    if ((insinglequotes || indoublequotes) && escaped)
+		escaped=false; // only protects one char, but this is enough.
+	    else if ((insinglequotes || indoublequotes) &&
+		     '\\' == m_input.m_line[m_input.m_line_index])
+		escaped=true;
+	    else if (!(insinglequotes || inslashcomment || instarcomment) &&
+		     '\"' == m_input.m_line[m_input.m_line_index])
+		indoublequotes=!indoublequotes; // unescaped double quote.
+	    else if (!(indoublequotes || inslashcomment || instarcomment) &&
+		     '\'' == m_input.m_line[m_input.m_line_index])
+		insinglequotes=!insinglequotes; // unescaped single quote.
+	    /* Look for comments. */
+	    if (instarcomment) { // inside "/*" comment; look for "*/"
+		if (slashed && '/' == m_input.m_line[m_input.m_line_index])
+		    instarcomment = slashed = false;
+		else // note that inside a star comment, slashed means starred
+		    slashed = ('*' == m_input.m_line[m_input.m_line_index]);
+	    } else if (!inslashcomment && !insinglequotes && !indoublequotes) {
+	        // not in comment, look for /* or //
+		inslashcomment = 
+		    (slashed && '/' == m_input.m_line[m_input.m_line_index]);
+		instarcomment =
+		    (slashed && '*' == m_input.m_line[m_input.m_line_index]);
+		slashed = ('/' == m_input.m_line[m_input.m_line_index]);
+	    }
+
+	    /* Look for brackets. */
+	    if (!insinglequotes && !indoublequotes &&
+		!instarcomment && !inslashcomment) {
+	      if ('{' == m_input.m_line[m_input.m_line_index])
+		{
+		  ++brackets;
+		}
+	      else if ('}' == m_input.m_line[m_input.m_line_index])
+		{
+		  --brackets;
+		
+		  if (0 == brackets)
+		    {
+		      ++action_index;
+		      ++m_input.m_line_index;
+
+		      break;
+		    }
+		}
+	    }
+	    
+	    ++action_index;
+	    /* Double the buffer size, if needed. */
+	    if (action_index >= action.length)
+	      {
+		action = CUtility.doubleSize(action);
+	      }
+
+	    ++m_input.m_line_index;
+	    /* Get a new line, if needed. */
+	    while (m_input.m_line_index >= m_input.m_line_read)
+	      {
+		inslashcomment = slashed = false;
+		if (insinglequotes || indoublequotes) { // non-fatal
+		    CError.parse_error(CError.E_NEWLINE,m_input.m_line_number);
+		    insinglequotes = indoublequotes = false;
+		}
+		if (m_input.getLine())
+		  {
+		    CError.parse_error(CError.E_SYNTAX,m_input.m_line_number);
+		    return null;
+		  }
+	      }
+	  }
+	    
+	accept = new CAccept(action,action_index,m_input.m_line_number);
+
+	if (CUtility.DEBUG)
+	  {
+	    CUtility.ASSERT(null != accept);
+	  }
+
+	if (CUtility.DESCENT_DEBUG)
+	  {
+	    System.out.print("Accepting action:");
+	    System.out.println(new String(accept.m_action,0,accept.m_action_read));
+	  }
+
+	return accept;
+      }
+
+  /********************************************************
+    Function: advance
+    Description: Returns code for next token.
+    *******************************************************/
+  private boolean m_advance_stop = false;
+  int advance
+    (
+     )
+      throws java.io.IOException
+      {
+	boolean saw_escape = false;
+	Integer code;
+	
+	/*if (m_input.m_line_index > m_input.m_line_read) {
+	  System.out.println("m_input.m_line_index = " + m_input.m_line_index);
+	  System.out.println("m_input.m_line_read = " + m_input.m_line_read);
+	  CUtility.ASSERT(m_input.m_line_index <= m_input.m_line_read);
+	}*/
+
+	if (m_input.m_eof_reached)
+	  {
+	    /* EOF has already been reached,
+	       so return appropriate code. */
+
+	    m_spec.m_current_token = END_OF_INPUT;
+	    m_spec.m_lexeme = '\0';
+	    return m_spec.m_current_token;
+	  }
+
+	/* End of previous regular expression?
+	   Refill line buffer? */
+	if (EOS == m_spec.m_current_token
+	    /* ADDED */
+	    || m_input.m_line_index >= m_input.m_line_read)
+	    /* ADDED */
+	  {
+	    if (m_spec.m_in_quote)
+	      {
+		CError.parse_error(CError.E_SYNTAX,m_input.m_line_number);
+	      }
+	    
+	    while (true)
+	      {
+		if (false == m_advance_stop  
+		    || m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    if (m_input.getLine())
+		      {
+			/* EOF has already been reached,
+			   so return appropriate code. */
+			
+			m_spec.m_current_token = END_OF_INPUT;
+			m_spec.m_lexeme = '\0';
+			return m_spec.m_current_token;
+		      }
+		    m_input.m_line_index = 0;
+		  }
+		else
+		  {
+		    m_advance_stop = false;
+		  }
+
+		while (m_input.m_line_index < m_input.m_line_read
+		       && true == CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+		  {
+		    ++m_input.m_line_index;
+		  }
+		
+		if (m_input.m_line_index < m_input.m_line_read)
+		  {
+		    break;
+		  }
+	      }
+	  }
+	
+	if (CUtility.DEBUG) {
+	  CUtility.ASSERT(m_input.m_line_index <= m_input.m_line_read);
+	}
+
+	while (true)
+	  {
+	    if (false == m_spec.m_in_quote
+		&& '{' == m_input.m_line[m_input.m_line_index])
+	      {
+		if (false == expandMacro())
+		  {
+		    break;
+		  }
+	       
+		if (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    m_spec.m_current_token = EOS;
+		    m_spec.m_lexeme = '\0';
+		    return m_spec.m_current_token;
+		  }
+	      }
+	    else if ('\"' == m_input.m_line[m_input.m_line_index])
+	      {
+		m_spec.m_in_quote = !m_spec.m_in_quote;
+		++m_input.m_line_index;
+		
+		if (m_input.m_line_index >= m_input.m_line_read)
+		  {
+		    m_spec.m_current_token = EOS;
+		    m_spec.m_lexeme = '\0';
+		    return m_spec.m_current_token;
+		  }
+	      }
+	    else
+	      {
+		break;
+	      }
+	  }
+
+	if (m_input.m_line_index > m_input.m_line_read) {
+	  System.out.println("m_input.m_line_index = " + m_input.m_line_index);
+	  System.out.println("m_input.m_line_read = " + m_input.m_line_read);
+	  CUtility.ASSERT(m_input.m_line_index <= m_input.m_line_read);
+	}
+
+	/* Look for backslash, and corresponding 
+	   escape sequence. */
+	if ('\\' == m_input.m_line[m_input.m_line_index])
+	  {
+	    saw_escape = true;
+	  }
+	else
+	  {
+	    saw_escape = false;
+	  }
+
+	if (false == m_spec.m_in_quote)
+	  {
+	    if (false == m_spec.m_in_ccl &&
+		CUtility.isspace(m_input.m_line[m_input.m_line_index]))
+	      {
+		/* White space means the end of 
+		   the current regular expression. */
+
+		m_spec.m_current_token = EOS;
+		m_spec.m_lexeme = '\0';
+		return m_spec.m_current_token;
+	      }
+
+	    /* Process escape sequence, if needed. */
+	    if (saw_escape)
+	      {
+		m_spec.m_lexeme = expandEscape();
+	      }
+	    else
+	      {
+		m_spec.m_lexeme = m_input.m_line[m_input.m_line_index];
+		++m_input.m_line_index;
+	      }
+	  }
+	else
+	  {
+	    if (saw_escape 
+		&& (m_input.m_line_index + 1) < m_input.m_line_read
+		&& '\"' == m_input.m_line[m_input.m_line_index + 1])
+	      {
+		m_spec.m_lexeme = '\"';
+		m_input.m_line_index = m_input.m_line_index + 2;
+	      }
+	    else
+	      {
+		m_spec.m_lexeme = m_input.m_line[m_input.m_line_index];
+		++m_input.m_line_index;
+	      }
+	  }
+	
+	code = (Integer) m_tokens.get(new Character(m_spec.m_lexeme));
+	if (m_spec.m_in_quote || true == saw_escape)
+	  {
+	    m_spec.m_current_token = L;
+	  }
+	else
+	  {
+	    if (null == code)
+	      {
+		m_spec.m_current_token = L;
+	      }
+	    else
+	      {
+		m_spec.m_current_token = code.intValue();
+	      }
+	  }
+
+	if (CCL_START == m_spec.m_current_token) m_spec.m_in_ccl = true;
+	if (CCL_END   == m_spec.m_current_token) m_spec.m_in_ccl = false;
+
+	if (CUtility.FOODEBUG)
+	  {
+	    System.out.println("Lexeme: " + m_spec.m_lexeme
+			       + "\tToken: " + m_spec.m_current_token
+			       + "\tIndex: " + m_input.m_line_index);
+	  }
+
+	return m_spec.m_current_token;
+      }
+
+  /***************************************************************
+    Function: details
+    Description: High level debugging routine.
+    **************************************************************/
+  private void details
+    (
+     )
+      {
+	Enumeration names;
+	String name;
+	String def;
+	Enumeration states;
+	String state;
+	Integer index;
+	int elem;
+	int size;
+
+	System.out.println();
+	System.out.println("\t** Macros **");
+	names = m_spec.m_macros.keys();
+	while (names.hasMoreElements())
+	  {
+	    name = (String) names.nextElement();
+	    def = (String) m_spec.m_macros.get(name);
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(null != name);
+		CUtility.ASSERT(null != def);
+	      }
+
+	    System.out.println("Macro name \"" + name 
+			       + "\" has definition \"" 
+			       + def + "\".");
+	  }
+
+	System.out.println();
+	System.out.println("\t** States **");
+	states = m_spec.m_states.keys();
+	while (states.hasMoreElements())
+	  {
+	    state = (String) states.nextElement();
+	    index = (Integer) m_spec.m_states.get(state);
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(null != state);
+		CUtility.ASSERT(null != index);
+	      }
+
+	    System.out.println("State \"" + state 
+			       + "\" has identifying index " 
+			       + index.toString() + ".");
+	  }
+	    
+	System.out.println();
+	System.out.println("\t** Character Counting **");
+	if (false == m_spec.m_count_chars)
+	  {
+	    System.out.println("Character counting is off.");
+	  }
+	else
+	  {
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(m_spec.m_count_lines);
+	      }
+
+	    System.out.println("Character counting is on.");
+	  }
+
+	System.out.println();
+	System.out.println("\t** Line Counting **");
+	if (false == m_spec.m_count_lines)
+	  {
+	    System.out.println("Line counting is off.");
+	  }
+	else
+	  {
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(m_spec.m_count_lines);
+	      }
+
+	    System.out.println("Line counting is on.");
+	  }
+
+	System.out.println();
+	System.out.println("\t** Operating System Specificity **");
+	if (false == m_spec.m_unix)
+	  {
+	    System.out.println("Not generating UNIX-specific code.");
+	    System.out.println("(This means that \"\\r\\n\" is a "
+			       + "newline, rather than \"\\n\".)");
+	  }
+	else
+	  {
+	    System.out.println("Generating UNIX-specific code.");
+	    System.out.println("(This means that \"\\n\" is a " 
+			       + "newline, rather than \"\\r\\n\".)");
+	  }
+
+	System.out.println();
+	System.out.println("\t** Java CUP Compatibility **");
+	if (false == m_spec.m_cup_compatible)
+	  {
+	    System.out.println("Generating CUP compatible code.");
+	    System.out.println("(Scanner implements "
+			       + "java_cup.runtime.Scanner.)");
+	  }
+	else
+	  {
+	    System.out.println("Not generating CUP compatible code.");
+	  }
+	
+	if (CUtility.FOODEBUG) {
+	  if (null != m_spec.m_nfa_states && null != m_spec.m_nfa_start)
+	    {
+	      System.out.println();
+	      System.out.println("\t** NFA machine **");
+	      print_nfa();
+	  }
+	}
+
+	if (null != m_spec.m_dtrans_vector)
+	  {
+	    System.out.println();
+	    System.out.println("\t** DFA transition table **");
+	    /*print_header();*/
+	  }
+
+	/*if (null != m_spec.m_accept_vector && null != m_spec.m_anchor_array)
+	  {
+	    System.out.println();
+	    System.out.println("\t** Accept States and Anchor Vector **");
+	    print_accept();
+	  }*/
+      }
+
+  /***************************************************************
+    function: print_set
+    **************************************************************/
+  void print_set
+    (
+     Vector nfa_set
+     )
+      {
+	int size; 
+	int elem;
+	CNfa nfa;
+
+	size = nfa_set.size();
+
+	if (0 == size)
+	  {
+	    System.out.print("empty ");
+	  }
+	
+	for (elem = 0; elem < size; ++elem)
+	  {
+	    nfa = (CNfa) nfa_set.elementAt(elem);
+	    /*System.out.print(m_spec.m_nfa_states.indexOf(nfa) + " ");*/
+	    System.out.print(nfa.m_label + " ");
+	  }
+      }
+
+   /***************************************************************
+     Function: print_header
+     **************************************************************/
+  private void print_header
+    (
+     )
+      {
+	Enumeration states;
+	int i;
+	int j;
+	int chars_printed=0;
+	CDTrans dtrans;
+	int last_transition;
+	String str;
+	CAccept accept;
+	String state;
+	Integer index;
+
+	System.out.println("/*---------------------- DFA -----------------------");
+	
+	states = m_spec.m_states.keys();
+	while (states.hasMoreElements())
+	  {
+	    state = (String) states.nextElement();
+	    index = (Integer) m_spec.m_states.get(state);
+
+	    if (CUtility.DEBUG)
+	      {
+		CUtility.ASSERT(null != state);
+		CUtility.ASSERT(null != index);
+	      }
+
+	    System.out.println("State \"" + state 
+			       + "\" has identifying index " 
+			       + index.toString() + ".");
+
+	    i = index.intValue();
+	    if (CDTrans.F != m_spec.m_state_dtrans[i])
+	      {
+		System.out.println("\tStart index in transition table: "
+				   + m_spec.m_state_dtrans[i]);
+	      }
+	    else
+	      {
+		System.out.println("\tNo associated transition states.");
+	      }
+	  }
+
+	for (i = 0; i < m_spec.m_dtrans_vector.size(); ++i)
+	  {
+	    dtrans = (CDTrans) m_spec.m_dtrans_vector.elementAt(i);
+
+	    if (null == m_spec.m_accept_vector && null == m_spec.m_anchor_array)
+	      {
+		if (null == dtrans.m_accept)
+		  {
+		    System.out.print(" * State " + i + " [nonaccepting]");
+		  }
+		else
+		  {
+		    System.out.print(" * State " + i 
+				     + " [accepting, line "
+				     + dtrans.m_accept.m_line_number 
+				     + " <"
+				     + (new String(dtrans.m_accept.m_action,0,
+						   dtrans.m_accept.m_action_read))
+				     + ">]");
+		    if (CSpec.NONE != dtrans.m_anchor)
+		      {
+			System.out.print(" Anchor: "
+					 + ((0 != (dtrans.m_anchor & CSpec.START)) 
+					    ? "start " : "")
+					 + ((0 != (dtrans.m_anchor & CSpec.END)) 
+					    ? "end " : ""));
+		      }
+		  }
+	      }
+	    else
+	      {
+		accept = (CAccept) m_spec.m_accept_vector.elementAt(i);
+
+		if (null == accept)
+		  {
+		    System.out.print(" * State " + i + " [nonaccepting]");
+		  }
+		else
+		  {
+		    System.out.print(" * State " + i 
+				     + " [accepting, line "
+				     + accept.m_line_number 
+				     + " <"
+				     + (new String(accept.m_action,0,
+						   accept.m_action_read))
+				     + ">]");
+		    if (CSpec.NONE != m_spec.m_anchor_array[i])
+		      {
+			System.out.print(" Anchor: "
+					 + ((0 != (m_spec.m_anchor_array[i] & CSpec.START)) 
+					    ? "start " : "")
+					 + ((0 != (m_spec.m_anchor_array[i] & CSpec.END)) 
+					    ? "end " : ""));
+		      }
+		  }
+	      }
+
+	    last_transition = -1;
+	    for (j = 0; j < m_spec.m_dtrans_ncols; ++j)
+	      {
+		if (CDTrans.F != dtrans.m_dtrans[j])
+		  {
+		    if (last_transition != dtrans.m_dtrans[j])
+		      {
+			System.out.println();
+			System.out.print(" *    goto " + dtrans.m_dtrans[j]
+					 + " on ");
+			chars_printed = 0;
+		      }
+		    
+		    str = interp_int((int) j);
+		    System.out.print(str);
+				
+		    chars_printed = chars_printed + str.length(); 
+		    if (56 < chars_printed)
+		      {
+			System.out.println();
+			System.out.print(" *             ");
+			chars_printed = 0;
+		      }
+		    
+		    last_transition = dtrans.m_dtrans[j];
+		  }
+	      }
+	    System.out.println();
+	  }
+	System.out.println(" */");
+	System.out.println();
+      }
+}
+
+/*
+ * SparseBitSet 25-Jul-1999.
+ * C. Scott Ananian <cananian@alumni.princeton.edu>
+ *
+ * Re-implementation of the standard java.util.BitSet to support sparse
+ * sets, which we need to efficiently support unicode character classes.
+ */
+
+/**
+ * A set of bits. The set automatically grows as more bits are
+ * needed. 
+ *
+ * @version 	1.00, 25 Jul 1999
+ * @author C. Scott Ananian
+ */
+final class SparseBitSet implements Cloneable {
+    /** Sorted array of bit-block offsets. */
+    int  offs[];
+    /** Array of bit-blocks; each holding BITS bits. */
+    long bits[];
+    /** Number of blocks currently in use. */
+    int size;
+    /** log base 2 of BITS, for the identity: x/BITS == x >> LG_BITS */
+    static final private int LG_BITS = 6;
+    /** Number of bits in a block. */
+    static final private int BITS = 1<<LG_BITS;
+    /** BITS-1, using the identity: x % BITS == x & (BITS-1) */
+    static final private int BITS_M1 = BITS-1;
+
+    /**
+     * Creates an empty set.
+     */
+    public SparseBitSet() {
+	bits = new long[4];
+	offs = new int [4];
+	size = 0;
+    }
+
+    /**
+     * Creates an empty set with the specified size.
+     * @param nbits the size of the set
+     */
+    public SparseBitSet(int nbits) {
+	this();
+    }
+
+    /**
+     * Creates an empty set with the same size as the given set.
+     */
+    public SparseBitSet(SparseBitSet set) {
+	bits = new long[set.size];
+	offs = new int [set.size];
+	size = 0;
+    }
+
+    private void new_block(int bnum) {
+	new_block(bsearch(bnum), bnum);
+    }
+    private void new_block(int idx, int bnum) {
+	if (size==bits.length) { // resize
+	    long[] nbits = new long[size*3];
+	    int [] noffs = new int [size*3];
+	    System.arraycopy(bits, 0, nbits, 0, size);
+	    System.arraycopy(offs, 0, noffs, 0, size);
+	    bits = nbits;
+	    offs = noffs;
+	}
+	CUtility.ASSERT(size<bits.length);
+	insert_block(idx, bnum);
+    }
+    private void insert_block(int idx, int bnum) {
+	CUtility.ASSERT(idx<=size);
+	CUtility.ASSERT(idx==size || offs[idx]!=bnum);
+	System.arraycopy(bits, idx, bits, idx+1, size-idx);
+	System.arraycopy(offs, idx, offs, idx+1, size-idx);
+	offs[idx]=bnum;
+	bits[idx]=0; //clear them bits.
+	size++;
+    }
+    private int bsearch(int bnum) {
+	int l=0, r=size; // search interval is [l, r)
+	while (l<r) {
+	    int p = (l+r)/2;
+	    if (bnum<offs[p]) r=p;
+	    else if (bnum>offs[p]) l=p+1;
+	    else return p;
+	}
+	CUtility.ASSERT(l==r);
+	return l; // index at which the bnum *should* be, if it's not.
+    }
+	    
+    /**
+     * Sets a bit.
+     * @param bit the bit to be set
+     */
+    public void set(int bit) {
+	int bnum = bit >> LG_BITS;
+	int idx  = bsearch(bnum);
+	if (idx >= size || offs[idx]!=bnum)
+	    new_block(idx, bnum);
+	bits[idx] |= (1L << (bit & BITS_M1) );
+    }
+
+    /**
+     * Clears a bit.
+     * @param bit the bit to be cleared
+     */
+    public void clear(int bit) {
+	int bnum = bit >> LG_BITS;
+	int idx  = bsearch(bnum);
+	if (idx >= size || offs[idx]!=bnum)
+	    new_block(idx, bnum);
+	bits[idx] &= ~(1L << (bit & BITS_M1) );
+    }
+
+    /**
+     * Clears all bits.
+     */
+    public void clearAll() {
+	size = 0;
+    }
+
+    /**
+     * Gets a bit.
+     * @param bit the bit to be gotten
+     */
+    public boolean get(int bit) {
+	int bnum = bit >> LG_BITS;
+	int idx  = bsearch(bnum);
+	if (idx >= size || offs[idx]!=bnum)
+	    return false;
+	return 0 != ( bits[idx] & (1L << (bit & BITS_M1) ) );
+    }
+
+    /**
+     * Logically ANDs this bit set with the specified set of bits.
+     * @param set the bit set to be ANDed with
+     */
+    public void and(SparseBitSet set) {
+	binop(this, set, AND);
+    }
+
+    /**
+     * Logically ORs this bit set with the specified set of bits.
+     * @param set the bit set to be ORed with
+     */
+    public void or(SparseBitSet set) {
+	binop(this, set, OR);
+    }
+
+    /**
+     * Logically XORs this bit set with the specified set of bits.
+     * @param set the bit set to be XORed with
+     */
+    public void xor(SparseBitSet set) {
+	binop(this, set, XOR);
+    }
+
+    // BINARY OPERATION MACHINERY
+    private static interface BinOp {
+	public long op(long a, long b);
+    }
+    private static final BinOp AND = new BinOp() {
+	public final long op(long a, long b) { return a & b; }
+    };
+    private static final BinOp OR = new BinOp() {
+	public final long op(long a, long b) { return a | b; }
+    };
+    private static final BinOp XOR = new BinOp() {
+	public final long op(long a, long b) { return a ^ b; }
+    };
+    private static final void binop(SparseBitSet a, SparseBitSet b, BinOp op) {
+	int  nsize = a.size + b.size;
+	long[] nbits; 
+	int [] noffs;
+	int a_zero, a_size;
+	// be very clever and avoid allocating more memory if we can.
+	if (a.bits.length < nsize) { // oh well, have to make working space.
+	    nbits = new long[nsize];
+	    noffs = new int [nsize];
+	    a_zero  = 0; a_size = a.size;
+	} else { // reduce, reuse, recycle!
+	    nbits = a.bits;
+	    noffs = a.offs;
+	    a_zero = a.bits.length - a.size; a_size = a.bits.length;
+	    System.arraycopy(a.bits, 0, a.bits, a_zero, a.size);
+	    System.arraycopy(a.offs, 0, a.offs, a_zero, a.size);
+	}
+	// ok, crunch through and binop those sets!
+	nsize = 0;
+	for (int i=a_zero, j=0; i<a_size || j<b.size; ) {
+	    long nb; int no;
+	    if (i<a_size && (j>=b.size || a.offs[i] < b.offs[j])) {
+		nb = op.op(a.bits[i], 0);
+		no = a.offs[i];
+		i++;
+	    } else if (j<b.size && (i>=a_size || a.offs[i] > b.offs[j])) {
+		nb = op.op(0, b.bits[j]);
+		no = b.offs[j];
+		j++;
+	    } else { // equal keys; merge.
+		nb = op.op(a.bits[i], b.bits[j]);
+		no = a.offs[i];
+		i++; j++;
+	    }
+	    if (nb!=0) {
+		nbits[nsize] = nb;
+		noffs[nsize] = no;
+		nsize++;
+	    }
+	}
+	a.bits = nbits;
+	a.offs = noffs;
+	a.size = nsize;
+    }
+
+    /**
+     * Gets the hashcode.
+     */
+    public int hashCode() {
+	long h = 1234;
+	for (int i=0; i<size; i++)
+	    h ^= bits[i] * offs[i];
+	return (int)((h >> 32) ^ h);
+    }
+
+    /**
+     * Calculates and returns the set's size
+     */
+    public int size() {
+	return (size==0)?0:((1+offs[size-1]) << LG_BITS);
+    }
+
+    /**
+     * Compares this object against the specified object.
+     * @param obj the object to commpare with
+     * @return true if the objects are the same; false otherwise.
+     */
+    public boolean equals(Object obj) {
+	if ((obj != null) && (obj instanceof SparseBitSet))
+	    return equals(this, (SparseBitSet)obj); 
+	return false;
+    }
+    /**
+     * Compares two SparseBitSets for equality.
+     * @return true if the objects are the same; false otherwise.
+     */
+    public static boolean equals(SparseBitSet a, SparseBitSet b) {
+	for (int i=0, j=0; i<a.size || j<b.size; ) {
+	    if (i<a.size && (j>=b.size || a.offs[i] < b.offs[j])) {
+		if (a.bits[i++]!=0) return false;
+	    } else if (j<b.size && (i>=a.size || a.offs[i] > b.offs[j])) {
+		if (b.bits[j++]!=0) return false;
+	    } else { // equal keys
+		if (a.bits[i++]!=b.bits[j++]) return false;
+	    }
+	}
+	return true;
+    }
+
+    /**
+     * Clones the SparseBitSet.
+     */
+    public Object clone() {
+	try { 
+	    SparseBitSet set = (SparseBitSet)super.clone();
+	    set.bits = (long[]) bits.clone();
+	    set.offs = (int []) offs.clone();
+	    return set;
+	} catch (CloneNotSupportedException e) {
+	    // this shouldn't happen, since we are Cloneable
+	    throw new InternalError();
+	}
+    }
+
+    /**
+     * Return an <code>Enumeration</code> of <code>Integer</code>s
+     * which represent set bit indices in this SparseBitSet.
+     */
+    public Enumeration elements() {
+	return new Enumeration() {
+	    int idx=-1, bit=BITS;
+	    { advance(); }
+	    public boolean hasMoreElements() {
+		return (idx<size);
+	    }
+	    public Object nextElement() {
+		int r = bit + (offs[idx] << LG_BITS);
+		advance();
+		return new Integer(r);
+	    }
+	    private void advance() {
+		while (idx<size) {
+		    while (++bit<BITS)
+			if (0!=(bits[idx] & (1L<<bit)))
+			    return;
+		    idx++; bit=-1;
+		}
+	    }
+	};
+    }
+    /**
+     * Converts the SparseBitSet to a String.
+     */
+    public String toString() {
+	StringBuffer sb = new StringBuffer();
+	sb.append('{');
+	for (Enumeration e=elements(); e.hasMoreElements(); ) {
+	    if (sb.length() > 1) sb.append(", ");
+	    sb.append(e.nextElement());
+	}
+	sb.append('}');
+	return sb.toString();
+    }
+
+    /** Check validity. */
+    private boolean isValid() {
+	if (bits.length!=offs.length) return false;
+	if (size>bits.length) return false;
+	if (size!=0 && 0<=offs[0]) return false;
+	for (int i=1; i<size; i++)
+	    if (offs[i] < offs[i-1])
+		    return false;
+	return true;
+    }
+    /** Self-test. */
+    public static void main(String[] args) {
+	final int ITER = 500;
+	final int RANGE= 65536;
+	SparseBitSet a = new SparseBitSet();
+	CUtility.ASSERT(!a.get(0) && !a.get(1));
+	CUtility.ASSERT(!a.get(123329));
+	a.set(0); CUtility.ASSERT(a.get(0) && !a.get(1));
+	a.set(1); CUtility.ASSERT(a.get(0) && a.get(1));
+	a.clearAll();
+	CUtility.ASSERT(!a.get(0) && !a.get(1));
+	java.util.Random r = new java.util.Random();
+	java.util.Vector v = new java.util.Vector();
+	for (int n=0; n<ITER; n++) {
+	    int rr = ((r.nextInt()>>>1) % RANGE) << 1;
+	    a.set(rr); v.addElement(new Integer(rr));
+	    // check that all the numbers are there.
+	    CUtility.ASSERT(a.get(rr) && !a.get(rr+1) && !a.get(rr-1));
+	    for (int i=0; i<v.size(); i++)
+		CUtility.ASSERT(a.get(((Integer)v.elementAt(i)).intValue()));
+	}
+	SparseBitSet b = (SparseBitSet) a.clone();
+	CUtility.ASSERT(a.equals(b) && b.equals(a));
+	for (int n=0; n<ITER/2; n++) {
+	    int rr = (r.nextInt()>>>1) % v.size();
+	    int m = ((Integer)v.elementAt(rr)).intValue();
+	    b.clear(m); v.removeElementAt(rr);
+	    // check that numbers are removed properly.
+	    CUtility.ASSERT(!b.get(m));
+	}
+	CUtility.ASSERT(!a.equals(b));
+	SparseBitSet c = (SparseBitSet) a.clone();
+	SparseBitSet d = (SparseBitSet) a.clone();
+	c.and(a);
+	CUtility.ASSERT(c.equals(a) && a.equals(c));
+	c.xor(a);
+	CUtility.ASSERT(!c.equals(a) && c.size()==0);
+	d.or(b);
+	CUtility.ASSERT(d.equals(a) && !b.equals(d));
+	d.and(b);
+	CUtility.ASSERT(!d.equals(a) && b.equals(d));
+	d.xor(a);
+	CUtility.ASSERT(!d.equals(a) && !b.equals(d));
+	c.or(d); c.or(b);
+	CUtility.ASSERT(c.equals(a) && a.equals(c));
+	c = (SparseBitSet) d.clone();
+	c.and(b);
+	CUtility.ASSERT(c.size()==0);
+	System.out.println("Success.");
+    }
+}
+
+/************************************************************************
+  JLEX COPYRIGHT NOTICE, LICENSE AND DISCLAIMER.
+  
+  Copyright 1996 by Elliot Joel Berk
+  
+  Permission to use, copy, modify, and distribute this software and its
+  documentation for any purpose and without fee is hereby granted,
+  provided that the above copyright notice appear in all copies and that
+  both the copyright notice and this permission notice and warranty
+  disclaimer appear in supporting documentation, and that the name of
+  Elliot Joel Berk not be used in advertising or publicity pertaining 
+  to distribution of the software without specific, written prior permission.
+  
+  Elliot Joel Berk disclaims all warranties with regard to this software, 
+  including all implied warranties of merchantability and fitness.  In no event
+  shall Elliot Joel Berk be liable for any special, indirect or consequential
+  damages or any damages whatsoever resulting from loss of use, data or
+  profits, whether in an action of contract, negligence or other
+  tortious action, arising out of or in connection with the use or
+  performance of this software.
+  ***********************************************************************/
+// set emacs indentation
+// Local Variables:
+// c-basic-offset:2
+// End:
diff --git a/open-nars/com/googlecode/opennars/language/BooleanLiteral.java b/open-nars/com/googlecode/opennars/language/BooleanLiteral.java
new file mode 100644
index 0000000..b2c6c61
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/BooleanLiteral.java
@@ -0,0 +1,17 @@
+package com.googlecode.opennars.language;
+
+public class BooleanLiteral extends Literal {
+
+	private boolean truthval;
+
+	public BooleanLiteral(String name) {
+		super(name);
+		this.truthval = Boolean.parseBoolean(name);
+	}
+	
+	public BooleanLiteral(boolean tv) {
+		super(Boolean.toString(tv));
+		this.truthval = tv;
+	}
+
+}
diff --git a/open-nars/com/googlecode/opennars/language/Literal.java b/open-nars/com/googlecode/opennars/language/Literal.java
new file mode 100644
index 0000000..e9cee1d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/Literal.java
@@ -0,0 +1,12 @@
+package com.googlecode.opennars.language;
+
+public class Literal extends Term {
+
+	public Literal() {
+	}
+
+	public Literal(String name) {
+		super(name);
+	}
+
+}
diff --git a/open-nars/com/googlecode/opennars/language/NumericLiteral.java b/open-nars/com/googlecode/opennars/language/NumericLiteral.java
new file mode 100644
index 0000000..5fcf5a7
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/NumericLiteral.java
@@ -0,0 +1,34 @@
+package com.googlecode.opennars.language;
+
+public class NumericLiteral extends Literal {
+	
+	public enum TYPE {
+		INTEGER,
+		DOUBLE;
+	};
+	
+	private double num;
+	private TYPE type;
+
+	public NumericLiteral(String name) {
+		super(name);
+		this.num = Double.parseDouble(name);
+	}
+	
+	public NumericLiteral(int num) {
+		super(Integer.toString(num));
+		this.num = num;
+		this.type = TYPE.INTEGER;
+	}
+	
+	public NumericLiteral(double num) {
+		super(Double.toString(num));
+		this.num = num;
+		this.type = TYPE.DOUBLE;
+	}
+
+	public TYPE getType() {
+		return type;
+	}
+	
+}
diff --git a/open-nars/com/googlecode/opennars/language/StringLiteral.java b/open-nars/com/googlecode/opennars/language/StringLiteral.java
new file mode 100644
index 0000000..e881f5b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/StringLiteral.java
@@ -0,0 +1,9 @@
+package com.googlecode.opennars.language;
+
+public class StringLiteral extends Literal {
+
+	public StringLiteral(String string_) {
+		super(string_);
+	}
+
+}
diff --git a/open-nars/com/googlecode/opennars/language/Term.java b/open-nars/com/googlecode/opennars/language/Term.java
index 41413fe..96e4e33 100644
--- a/open-nars/com/googlecode/opennars/language/Term.java
+++ b/open-nars/com/googlecode/opennars/language/Term.java
@@ -26,6 +26,7 @@ import java.util.*;
 import com.googlecode.opennars.inference.SyllogisticRules;
 import com.googlecode.opennars.main.Memory;
 import com.googlecode.opennars.parser.Symbols;
+import com.googlecode.opennars.parser.TermVisitor;
 
 /**
  * Term is the basic component of Narsese, and the object of processing in NARS.
@@ -125,5 +126,17 @@ public class Term implements Cloneable, Comparable<Term> {
     
     public final boolean containQueryVariable() {                           // to be revised
         return (name.indexOf(Symbols.QUERY_VARIABLE_TAG) >= 0);
+    }
+    
+    /**
+     * Accept a visitor
+     * @param <R> Return type
+     * @param <A> Argument type
+     * @param v Visitor
+     * @param arg Argument
+     * @return an instance of the return type
+     */
+    public <R,A> R accept(TermVisitor<R,A> v, A arg) {
+    	return v.visit(this, arg);
     }
 }
diff --git a/open-nars/com/googlecode/opennars/language/URIRef.java b/open-nars/com/googlecode/opennars/language/URIRef.java
new file mode 100644
index 0000000..f88b24a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/language/URIRef.java
@@ -0,0 +1,39 @@
+package com.googlecode.opennars.language;
+
+import java.net.URI;
+
+public class URIRef extends Term {
+	
+	private URI uri;
+
+	public URIRef(URI uri2) {
+		super(uri2.toString().trim());
+		uri = uri2;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.googlecode.opennars.language.Term#getConstantName()
+	 */
+	@Override
+	public String getConstantName() {
+		return uri.toString().trim();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.googlecode.opennars.language.Term#getName()
+	 */
+	@Override
+	public String getName() {
+		return uri.toString().trim();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.googlecode.opennars.language.Term#clone()
+	 */
+	@Override
+	public Object clone() {
+		return new URIRef(uri);
+	}
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/main/Reasoner.java b/open-nars/com/googlecode/opennars/main/Reasoner.java
index 3bc63dd..99cda6a 100644
--- a/open-nars/com/googlecode/opennars/main/Reasoner.java
+++ b/open-nars/com/googlecode/opennars/main/Reasoner.java
@@ -43,7 +43,7 @@ public class Reasoner extends Observable implements Observer, Runnable {
 	 * @param parser
 	 */
 	public Reasoner(Parser parser) {
-		super();
+		this();
 		this.parser = parser;
 	}
 	
@@ -109,6 +109,14 @@ public class Reasoner extends Observable implements Observer, Runnable {
 		}
 	}
 	
+	/**
+	 * Tell the reasoner a task
+	 * @param task the task
+	 */
+	public synchronized void tellTask(Task task) {
+		inputQueue.add(task);
+	}
+	
 	/**
 	 * Tell the reasoner a sentence with the given budget for working with it
 	 * @param sent the sentence
diff --git a/open-nars/com/googlecode/opennars/parser/Parser.java b/open-nars/com/googlecode/opennars/parser/Parser.java
index 2589a36..6df8508 100644
--- a/open-nars/com/googlecode/opennars/parser/Parser.java
+++ b/open-nars/com/googlecode/opennars/parser/Parser.java
@@ -1,12 +1,15 @@
 package com.googlecode.opennars.parser;
 
+import java.util.List;
+
+import com.googlecode.opennars.entity.Sentence;
 import com.googlecode.opennars.entity.Task;
 import com.googlecode.opennars.main.Memory;
 
 public abstract class Parser extends Symbols {
 
 	/**
-	 * The only public (static) method of the class, called from Memory.inputTask.
+	 * Parses a given string into a (single) task.
 	 * @param buffer the single-line input String
 	 * @param memory the memory object doing the parsing
 	 * @return an input Task, or null if the input line cannot be parsed into a Task
@@ -14,4 +17,22 @@ public abstract class Parser extends Symbols {
 	 */
 	public abstract Task parseTask(String input, Memory memory) throws InvalidInputException;
 	
+	/**
+	 * Parses a given string into a (list of) tasks.
+	 * @param input
+	 * @param memory
+	 * @return a list of input Tasks, or an empty list if the input line cannot be parsed into a Task
+	 * @throws InvalidInputException
+	 */
+	public abstract List<Task> parseTasks(String input, Memory memory) throws InvalidInputException;
+	
+	/**
+	 * Serialises the sentence to this parser's format
+	 * @param task
+	 * @param memory
+	 * @return a string containing the serialised task
+	 */
+	public abstract String serialiseSentence(Sentence task, Memory memory);
+	
+	public abstract String serialiseSentences(List<Sentence> tasks, Memory memory);
 }
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/TermVisitor.java b/open-nars/com/googlecode/opennars/parser/TermVisitor.java
new file mode 100644
index 0000000..4ca3a8c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/TermVisitor.java
@@ -0,0 +1,49 @@
+package com.googlecode.opennars.parser;
+
+import com.googlecode.opennars.language.*;
+
+/**
+ * A visitor interface for terms in NARS to make it easier to serialise things
+ * @author jgeldart
+ *
+ * @param <R> The return type of this visitor
+ * @param <A> The argument type
+ */
+public interface TermVisitor<R, A> {
+	
+	R visit(BooleanLiteral p, A arg);
+	R visit(Conjunction p, A arg);
+	R visit(ConjunctionParallel p, A arg);
+	R visit(ConjunctionSequence p, A arg);
+	R visit(DifferenceExt p, A arg);
+	R visit(DifferenceInt p, A arg);
+	R visit(Disjunction p, A arg);
+	R visit(Equivalence p, A arg);
+	R visit(EquivalenceAfter p, A arg);
+	R visit(EquivalenceWhen p, A arg);
+	R visit(ImageExt p, A arg);
+	R visit(ImageInt p, A arg);
+	R visit(Implication p, A arg);
+	R visit(ImplicationAfter p, A arg);
+	R visit(ImplicationBefore p, A arg);
+	R visit(Inheritance p, A arg);
+	R visit(Instance p, A arg);
+	R visit(InstanceProperty p, A arg);
+	R visit(IntersectionExt p, A arg);
+	R visit(IntersectionInt p, A arg);
+	R visit(Negation p, A arg);
+	R visit(NumericLiteral p, A arg);
+	R visit(Product p, A arg);
+	R visit(Property p, A arg);
+	R visit(SetExt p, A arg);
+	R visit(SetInt p, A arg);
+	R visit(Similarity p, A arg);
+	R visit(TenseFuture p, A arg);
+	R visit(TensePast p, A arg);
+	R visit(TensePresent p, A arg);
+	R visit(StringLiteral p, A arg);
+	R visit(URIRef p, A arg);
+	R visit(Variable p, A arg);
+	R visit(Term p, A arg);
+	
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan.cf b/open-nars/com/googlecode/opennars/parser/loan/Loan.cf
new file mode 100644
index 0000000..97ab2d5
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan.cf
@@ -0,0 +1,94 @@
+-- LOAN, Non-Axiomatic Ontology Language, grammar
+-- Copyright (c) 2008 Joe Geldart
+
+entrypoints Document, Sentence ;
+
+DocBR.	Document ::= BaseRule [Sentence] ;
+Doc.	Document ::= [Sentence] ;
+
+BaseR.	BaseRule ::= "@base" URILit "." ;								-- The base URI for the document
+
+[].			[Sentence] ::= ;
+(:).		[Sentence] ::= Sentence [Sentence] ;
+
+SentPrefix.	Sentence ::= "@prefix" NSPrefix URILit "." ;				-- Declares a namespace prefix to be a certain URI
+SentImport. Sentence ::= "@import" URILit "." ;							-- Imports a given URL
+SentDelay.	Sentence ::= "@delay" Integer "." ;							-- Waits for a given number of cycles before continuing
+SentOp.		Sentence ::= "@operator" URIRef "." ;						-- Declares URI to be an operator (currently unused)
+
+SentJudge.	Sentence ::= Stm TruthValue "." ;							-- A judgement with a given truth-value
+SentQuest.	Sentence ::= Stm "?" ;										-- A question
+SentGoal.	Sentence ::= Stm  TruthValue "!" ;							-- A goal with a given utility
+
+StmImpl.	Stm  ::= Stm "==>" Stm1 ;									-- Implication
+StmEquiv.	Stm  ::= Stm "<=>" Stm1 ;									-- Equivalence
+StmImpPred. Stm  ::= Stm "=/>" Stm1 ;									-- Predictive implication
+StmImpRet.	Stm  ::= Stm "=\\>" Stm1 ;									-- Retrospective implication
+StmImpConc. Stm  ::= Stm "=|>" Stm1 ;									-- Concurrent implication
+StmEqvPred. Stm  ::= Stm "</>" Stm1 ;									-- Predictive equivalence
+StmEqvConc. Stm  ::= Stm "<|>" Stm1 ;									-- Concurrent equivalence
+StmConj.	Stm1 ::= Stm1 "&&" Stm2 ;									-- Conjunction
+StmDisj.	Stm1 ::= Stm1 "||" Stm2 ;									-- Disjunction
+StmPar.		Stm1 ::= Stm1 ";" Stm2 ;									-- Parallel conjunction
+StmSeq.		Stm1 ::= Stm1 "," Stm2 ;									-- Sequential conjunction
+StmNot.		Stm2 ::= "not" Stm3 ;										-- Negation
+StmPst.		Stm2 ::= "past" Stm3 ;										-- Past-tense operator
+StmPres.	Stm2 ::= "present" Stm3 ;									-- Present-tense operator
+StmFut.		Stm2 ::= "future" Stm3 ;									-- Future-tense operator
+StmInher.	Stm3 ::= Term "-->" Term ;									-- Inheritance
+StmSim.		Stm3 ::= Term "<->" Term ;									-- Similarity
+StmInst.	Stm3 ::= Term "}->" Term ;									-- Instance
+StmProp.	Stm3 ::= Term "--[" Term ;									-- Property
+StmInPp.	Stm3 ::= Term "}-[" Term ;									-- Instance-Property
+StmOp.		Stm3 ::= Term "(" [Term] ")" ;								-- Operation
+StmTrm.		Stm3 ::= Term ;												-- Bare term (name)
+
+coercions Stm 3 ;
+
+TrmExInt.	Term  ::= Term "&" Term1 ;									-- Extensional intersection
+TrmInInt.	Term  ::= Term "|" Term1 ;									-- Intensional intersection
+TrmExDif.	Term1 ::= Term1 "-" Term2 ;									-- Extensional difference
+TrmInDif.	Term1 ::= Term1 "~" Term2 ;									-- Intensional difference
+--TrmProd.	Term2 ::= Term2 "*" Term3 ;									-- Product
+--TrmProd.	Term2 ::= [Prod] ;
+TrmExImg.	Term2 ::= Term "extension" "(" [Term] "_|_" [Term] ")" ;	-- Extensional image
+TrmInImg.	Term2 ::= Term "intension" "(" [Term] "_|_" [Term] ")" ;	-- Intensional image
+TrmExSet.	Term3 ::= "{" [Term] "}" ;									-- Extensional set
+TrmInSet.	Term3 ::= "[" [Term] "]" ;									-- Intensional set
+TrmProd.	Term3 ::= "(" [Term] ")" ;
+TrmLit.		Term3 ::= Literal ;											-- Literal
+TrmStm.		Term3 ::= "(" Stm ")" ;										-- Statement
+
+coercions Term 3 ;
+
+separator Term "," ;
+
+-- Literals
+
+token URILit '<' (char - ["<>\"{}|\\`"])* '>' ;							-- A URI literal token
+
+separator Ident "," ;
+
+URIFul.		URIRef ::= URILit ;											-- A full URI reference (possibly relative)
+URICur.		URIRef ::= NSPrefix Ident ;									-- A CURIE
+
+LitQVar.	Literal ::= "?" Ident ;										-- A query variable with name
+LitQVarAn.	Literal ::= "?" ;											-- An anonymous query variable
+LitSVarD.	Literal ::= "#" Ident "(" [Ident] ")" ;						-- A dependent statement variable
+LitSVarI.	Literal ::= "#" Ident ;										-- An independent statement variable
+LitURI.		Literal ::= URIRef ;										-- A URI reference literal
+LitInt.		Literal ::= Integer ;										-- An integer literal
+LitDbl.		Literal ::= Double ;										-- A double literal
+LitString.	Literal ::= String ;										-- A string literal
+LitTrue.	Literal ::= "true" ;										-- A true boolean
+LitFalse.	Literal ::= "false" ;										-- A false boolean
+
+NSPrefix1.	NSPrefix ::= Ident ":" ;									-- A namespace prefix
+NSPrefix2.	NSPrefix ::= ":" ;											-- The default namespace prefix
+
+TruthE.		TruthValue ::= ;											-- The default truth value
+TruthF.		TruthValue ::= "%" Double "%" ;								-- Frequency only
+TruthFC.	TruthValue ::= "%" Double ";" Double "%" ;					-- A full truth value
+
+comment "/*" "*/" ;														-- Comments as in C++ or C#
+comment "//" ;
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan.pdf b/open-nars/com/googlecode/opennars/parser/loan/Loan.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4dfc3fd0c8b29e8cb551582ee94e77dbfa17b65b
GIT binary patch
literal 44023
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
bJe>pY$1}Q`){O-g7E4ynDJZB|x+v!#wS<1(

literal 0
HcmV?d00001

diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/AbstractVisitor.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/AbstractVisitor.java
new file mode 100644
index 0000000..3c96a36
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/AbstractVisitor.java
@@ -0,0 +1,110 @@
+package com.googlecode.opennars.parser.loan.Loan;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+/** BNFC-Generated Abstract Visitor */
+public class AbstractVisitor<R,A> implements AllVisitor<R,A> {
+/* Document */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.Document p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* BaseRule */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* Sentence */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* Stm */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm p, A arg) { return visitDefault(p, arg); }
+
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* Term */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg p, A arg) { return visitDefault(p, arg); }
+
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm p, A arg) { return visitDefault(p, arg); }
+
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.Term p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* URIRef */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* Literal */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* NSPrefix */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+/* TruthValue */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF p, A arg) { return visitDefault(p, arg); }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC p, A arg) { return visitDefault(p, arg); }
+    public R visitDefault(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue p, A arg) {
+      throw new IllegalArgumentException(this.getClass().getName() + ": " + p);
+    }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseR.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseR.java
new file mode 100644
index 0000000..7bca6f4
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseR.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class BaseR extends BaseRule {
+  public final String urilit_;
+
+  public BaseR(String p1) { urilit_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR x = (com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR)o;
+      return this.urilit_.equals(x.urilit_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.urilit_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseRule.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseRule.java
new file mode 100644
index 0000000..e6c49b7
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/BaseRule.java
@@ -0,0 +1,10 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class BaseRule implements java.io.Serializable {
+  public abstract <R,A> R accept(BaseRule.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Doc.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Doc.java
new file mode 100644
index 0000000..c9b22d1
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Doc.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class Doc extends Document {
+  public final ListSentence listsentence_;
+
+  public Doc(ListSentence p1) { listsentence_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Document.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.Doc) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.Doc x = (com.googlecode.opennars.parser.loan.Loan.Absyn.Doc)o;
+      return this.listsentence_.equals(x.listsentence_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.listsentence_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/DocBR.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/DocBR.java
new file mode 100644
index 0000000..8a135bb
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/DocBR.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class DocBR extends Document {
+  public final BaseRule baserule_;
+  public final ListSentence listsentence_;
+
+  public DocBR(BaseRule p1, ListSentence p2) { baserule_ = p1; listsentence_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Document.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR x = (com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR)o;
+      return this.baserule_.equals(x.baserule_) && this.listsentence_.equals(x.listsentence_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.baserule_.hashCode())+this.listsentence_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Document.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Document.java
new file mode 100644
index 0000000..0d84c9e
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Document.java
@@ -0,0 +1,11 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class Document implements java.io.Serializable {
+  public abstract <R,A> R accept(Document.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListIdent.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListIdent.java
new file mode 100644
index 0000000..e0c6d6d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListIdent.java
@@ -0,0 +1,4 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class ListIdent extends java.util.LinkedList<String> {
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListSentence.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListSentence.java
new file mode 100644
index 0000000..18bff3c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListSentence.java
@@ -0,0 +1,4 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class ListSentence extends java.util.LinkedList<Sentence> {
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListTerm.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListTerm.java
new file mode 100644
index 0000000..78cd90f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/ListTerm.java
@@ -0,0 +1,4 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class ListTerm extends java.util.LinkedList<Term> {
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitDbl.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitDbl.java
new file mode 100644
index 0000000..f992d21
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitDbl.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitDbl extends Literal {
+  public final Double double_;
+
+  public LitDbl(Double p1) { double_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl)o;
+      return this.double_.equals(x.double_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.double_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitFalse.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitFalse.java
new file mode 100644
index 0000000..3871bba
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitFalse.java
@@ -0,0 +1,22 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitFalse extends Literal {
+
+  public LitFalse() { }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse) {
+      return true;
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37;
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitInt.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitInt.java
new file mode 100644
index 0000000..155892a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitInt.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitInt extends Literal {
+  public final Integer integer_;
+
+  public LitInt(Integer p1) { integer_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt)o;
+      return this.integer_.equals(x.integer_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.integer_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVar.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVar.java
new file mode 100644
index 0000000..162a00a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVar.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitQVar extends Literal {
+  public final String ident_;
+
+  public LitQVar(String p1) { ident_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar)o;
+      return this.ident_.equals(x.ident_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.ident_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVarAn.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVarAn.java
new file mode 100644
index 0000000..80854bb
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitQVarAn.java
@@ -0,0 +1,22 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitQVarAn extends Literal {
+
+  public LitQVarAn() { }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn) {
+      return true;
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37;
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarD.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarD.java
new file mode 100644
index 0000000..9d561e0
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarD.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitSVarD extends Literal {
+  public final String ident_;
+  public final ListIdent listident_;
+
+  public LitSVarD(String p1, ListIdent p2) { ident_ = p1; listident_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD)o;
+      return this.ident_.equals(x.ident_) && this.listident_.equals(x.listident_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.ident_.hashCode())+this.listident_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarI.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarI.java
new file mode 100644
index 0000000..6782024
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitSVarI.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitSVarI extends Literal {
+  public final String ident_;
+
+  public LitSVarI(String p1) { ident_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI)o;
+      return this.ident_.equals(x.ident_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.ident_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitString.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitString.java
new file mode 100644
index 0000000..eb30f17
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitString.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitString extends Literal {
+  public final String string_;
+
+  public LitString(String p1) { string_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitString) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitString x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitString)o;
+      return this.string_.equals(x.string_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.string_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitTrue.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitTrue.java
new file mode 100644
index 0000000..5ebbb93
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitTrue.java
@@ -0,0 +1,22 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitTrue extends Literal {
+
+  public LitTrue() { }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue) {
+      return true;
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37;
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitURI.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitURI.java
new file mode 100644
index 0000000..c0fa8e9
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/LitURI.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class LitURI extends Literal {
+  public final URIRef uriref_;
+
+  public LitURI(URIRef p1) { uriref_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI x = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI)o;
+      return this.uriref_.equals(x.uriref_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.uriref_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Literal.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Literal.java
new file mode 100644
index 0000000..8475701
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Literal.java
@@ -0,0 +1,19 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class Literal implements java.io.Serializable {
+  public abstract <R,A> R accept(Literal.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix.java
new file mode 100644
index 0000000..cf6c96b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix.java
@@ -0,0 +1,11 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class NSPrefix implements java.io.Serializable {
+  public abstract <R,A> R accept(NSPrefix.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix1.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix1.java
new file mode 100644
index 0000000..7835025
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix1.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class NSPrefix1 extends NSPrefix {
+  public final String ident_;
+
+  public NSPrefix1(String p1) { ident_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 x = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1)o;
+      return this.ident_.equals(x.ident_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.ident_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix2.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix2.java
new file mode 100644
index 0000000..3ce2a9b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/NSPrefix2.java
@@ -0,0 +1,22 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class NSPrefix2 extends NSPrefix {
+
+  public NSPrefix2() { }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2) {
+      return true;
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37;
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentDelay.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentDelay.java
new file mode 100644
index 0000000..9456e9a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentDelay.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentDelay extends Sentence {
+  public final Integer integer_;
+
+  public SentDelay(Integer p1) { integer_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay)o;
+      return this.integer_.equals(x.integer_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.integer_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentGoal.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentGoal.java
new file mode 100644
index 0000000..5e0e24d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentGoal.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentGoal extends Sentence {
+  public final Stm stm_;
+  public final TruthValue truthvalue_;
+
+  public SentGoal(Stm p1, TruthValue p2) { stm_ = p1; truthvalue_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal)o;
+      return this.stm_.equals(x.stm_) && this.truthvalue_.equals(x.truthvalue_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_.hashCode())+this.truthvalue_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentImport.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentImport.java
new file mode 100644
index 0000000..856658a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentImport.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentImport extends Sentence {
+  public final String urilit_;
+
+  public SentImport(String p1) { urilit_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport)o;
+      return this.urilit_.equals(x.urilit_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.urilit_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentJudge.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentJudge.java
new file mode 100644
index 0000000..b7f164c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentJudge.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentJudge extends Sentence {
+  public final Stm stm_;
+  public final TruthValue truthvalue_;
+
+  public SentJudge(Stm p1, TruthValue p2) { stm_ = p1; truthvalue_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge)o;
+      return this.stm_.equals(x.stm_) && this.truthvalue_.equals(x.truthvalue_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_.hashCode())+this.truthvalue_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentOp.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentOp.java
new file mode 100644
index 0000000..6aad34c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentOp.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentOp extends Sentence {
+  public final URIRef uriref_;
+
+  public SentOp(URIRef p1) { uriref_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp)o;
+      return this.uriref_.equals(x.uriref_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.uriref_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentPrefix.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentPrefix.java
new file mode 100644
index 0000000..dfd20e8
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentPrefix.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentPrefix extends Sentence {
+  public final NSPrefix nsprefix_;
+  public final String urilit_;
+
+  public SentPrefix(NSPrefix p1, String p2) { nsprefix_ = p1; urilit_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix)o;
+      return this.nsprefix_.equals(x.nsprefix_) && this.urilit_.equals(x.urilit_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.nsprefix_.hashCode())+this.urilit_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentQuest.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentQuest.java
new file mode 100644
index 0000000..2bc8a86
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/SentQuest.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class SentQuest extends Sentence {
+  public final Stm stm_;
+
+  public SentQuest(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest x = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Sentence.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Sentence.java
new file mode 100644
index 0000000..044f903
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Sentence.java
@@ -0,0 +1,16 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class Sentence implements java.io.Serializable {
+  public abstract <R,A> R accept(Sentence.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Stm.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Stm.java
new file mode 100644
index 0000000..317da43
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Stm.java
@@ -0,0 +1,31 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class Stm implements java.io.Serializable {
+  public abstract <R,A> R accept(Stm.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmConj.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmConj.java
new file mode 100644
index 0000000..28f2a2f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmConj.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmConj extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmConj(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmDisj.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmDisj.java
new file mode 100644
index 0000000..b67ef97
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmDisj.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmDisj extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmDisj(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEquiv.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEquiv.java
new file mode 100644
index 0000000..c328f67
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEquiv.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmEquiv extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmEquiv(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvConc.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvConc.java
new file mode 100644
index 0000000..e15e79d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvConc.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmEqvConc extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmEqvConc(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvPred.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvPred.java
new file mode 100644
index 0000000..e2a6582
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmEqvPred.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmEqvPred extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmEqvPred(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmFut.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmFut.java
new file mode 100644
index 0000000..8c024d8
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmFut.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmFut extends Stm {
+  public final Stm stm_;
+
+  public StmFut(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpConc.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpConc.java
new file mode 100644
index 0000000..1c9d97a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpConc.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmImpConc extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmImpConc(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpPred.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpPred.java
new file mode 100644
index 0000000..5d79058
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpPred.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmImpPred extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmImpPred(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpRet.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpRet.java
new file mode 100644
index 0000000..b073a91
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpRet.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmImpRet extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmImpRet(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpl.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpl.java
new file mode 100644
index 0000000..b4f8fa1
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmImpl.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmImpl extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmImpl(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInPp.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInPp.java
new file mode 100644
index 0000000..9f4fea7
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInPp.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmInPp extends Stm {
+  public final Term term_1, term_2;
+
+  public StmInPp(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInher.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInher.java
new file mode 100644
index 0000000..e31ba04
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInher.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmInher extends Stm {
+  public final Term term_1, term_2;
+
+  public StmInher(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInst.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInst.java
new file mode 100644
index 0000000..98b1e77
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmInst.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmInst extends Stm {
+  public final Term term_1, term_2;
+
+  public StmInst(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmNot.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmNot.java
new file mode 100644
index 0000000..319ea6c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmNot.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmNot extends Stm {
+  public final Stm stm_;
+
+  public StmNot(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmOp.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmOp.java
new file mode 100644
index 0000000..cbaf68a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmOp.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmOp extends Stm {
+  public final Term term_;
+  public final ListTerm listterm_;
+
+  public StmOp(Term p1, ListTerm p2) { term_ = p1; listterm_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp)o;
+      return this.term_.equals(x.term_) && this.listterm_.equals(x.listterm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_.hashCode())+this.listterm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPar.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPar.java
new file mode 100644
index 0000000..1f45640
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPar.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmPar extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmPar(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPres.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPres.java
new file mode 100644
index 0000000..fa5ccb7
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPres.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmPres extends Stm {
+  public final Stm stm_;
+
+  public StmPres(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmProp.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmProp.java
new file mode 100644
index 0000000..3e028a3
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmProp.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmProp extends Stm {
+  public final Term term_1, term_2;
+
+  public StmProp(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPst.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPst.java
new file mode 100644
index 0000000..8edb148
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmPst.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmPst extends Stm {
+  public final Stm stm_;
+
+  public StmPst(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSeq.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSeq.java
new file mode 100644
index 0000000..55e1f8f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSeq.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmSeq extends Stm {
+  public final Stm stm_1, stm_2;
+
+  public StmSeq(Stm p1, Stm p2) { stm_1 = p1; stm_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq)o;
+      return this.stm_1.equals(x.stm_1) && this.stm_2.equals(x.stm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.stm_1.hashCode())+this.stm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSim.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSim.java
new file mode 100644
index 0000000..38f04c6
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmSim.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmSim extends Stm {
+  public final Term term_1, term_2;
+
+  public StmSim(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmTrm.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmTrm.java
new file mode 100644
index 0000000..f0adea0
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/StmTrm.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class StmTrm extends Stm {
+  public final Term term_;
+
+  public StmTrm(Term p1) { term_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm x = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm)o;
+      return this.term_.equals(x.term_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.term_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Term.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Term.java
new file mode 100644
index 0000000..2385b09
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/Term.java
@@ -0,0 +1,20 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class Term implements java.io.Serializable {
+  public abstract <R,A> R accept(Term.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExDif.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExDif.java
new file mode 100644
index 0000000..baacfce
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExDif.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmExDif extends Term {
+  public final Term term_1, term_2;
+
+  public TrmExDif(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExImg.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExImg.java
new file mode 100644
index 0000000..18f1049
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExImg.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmExImg extends Term {
+  public final Term term_;
+  public final ListTerm listterm_1, listterm_2;
+
+  public TrmExImg(Term p1, ListTerm p2, ListTerm p3) { term_ = p1; listterm_1 = p2; listterm_2 = p3; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg)o;
+      return this.term_.equals(x.term_) && this.listterm_1.equals(x.listterm_1) && this.listterm_2.equals(x.listterm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(37*(this.term_.hashCode())+this.listterm_1.hashCode())+this.listterm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExInt.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExInt.java
new file mode 100644
index 0000000..b761a71
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExInt.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmExInt extends Term {
+  public final Term term_1, term_2;
+
+  public TrmExInt(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExSet.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExSet.java
new file mode 100644
index 0000000..db98430
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmExSet.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmExSet extends Term {
+  public final ListTerm listterm_;
+
+  public TrmExSet(ListTerm p1) { listterm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet)o;
+      return this.listterm_.equals(x.listterm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.listterm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInDif.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInDif.java
new file mode 100644
index 0000000..21e646d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInDif.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmInDif extends Term {
+  public final Term term_1, term_2;
+
+  public TrmInDif(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInImg.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInImg.java
new file mode 100644
index 0000000..5169b6a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInImg.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmInImg extends Term {
+  public final Term term_;
+  public final ListTerm listterm_1, listterm_2;
+
+  public TrmInImg(Term p1, ListTerm p2, ListTerm p3) { term_ = p1; listterm_1 = p2; listterm_2 = p3; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg)o;
+      return this.term_.equals(x.term_) && this.listterm_1.equals(x.listterm_1) && this.listterm_2.equals(x.listterm_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(37*(this.term_.hashCode())+this.listterm_1.hashCode())+this.listterm_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInInt.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInInt.java
new file mode 100644
index 0000000..e59aa00
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInInt.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmInInt extends Term {
+  public final Term term_1, term_2;
+
+  public TrmInInt(Term p1, Term p2) { term_1 = p1; term_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt)o;
+      return this.term_1.equals(x.term_1) && this.term_2.equals(x.term_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.term_1.hashCode())+this.term_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInSet.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInSet.java
new file mode 100644
index 0000000..7d44432
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmInSet.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmInSet extends Term {
+  public final ListTerm listterm_;
+
+  public TrmInSet(ListTerm p1) { listterm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet)o;
+      return this.listterm_.equals(x.listterm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.listterm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmLit.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmLit.java
new file mode 100644
index 0000000..4ba0328
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmLit.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmLit extends Term {
+  public final Literal literal_;
+
+  public TrmLit(Literal p1) { literal_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit)o;
+      return this.literal_.equals(x.literal_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.literal_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmProd.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmProd.java
new file mode 100644
index 0000000..963b6fa
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmProd.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmProd extends Term {
+  public final ListTerm listterm_;
+
+  public TrmProd(ListTerm p1) { listterm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd)o;
+      return this.listterm_.equals(x.listterm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.listterm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmStm.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmStm.java
new file mode 100644
index 0000000..ffbb197
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TrmStm.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TrmStm extends Term {
+  public final Stm stm_;
+
+  public TrmStm(Stm p1) { stm_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm)o;
+      return this.stm_.equals(x.stm_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.stm_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthE.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthE.java
new file mode 100644
index 0000000..ded9a85
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthE.java
@@ -0,0 +1,22 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TruthE extends TruthValue {
+
+  public TruthE() { }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE) {
+      return true;
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37;
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthF.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthF.java
new file mode 100644
index 0000000..14333d2
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthF.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TruthF extends TruthValue {
+  public final Double double_;
+
+  public TruthF(Double p1) { double_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF)o;
+      return this.double_.equals(x.double_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.double_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthFC.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthFC.java
new file mode 100644
index 0000000..1af27e5
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthFC.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class TruthFC extends TruthValue {
+  public final Double double_1, double_2;
+
+  public TruthFC(Double p1, Double p2) { double_1 = p1; double_2 = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC x = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC)o;
+      return this.double_1.equals(x.double_1) && this.double_2.equals(x.double_2);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.double_1.hashCode())+this.double_2.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthValue.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthValue.java
new file mode 100644
index 0000000..951454f
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/TruthValue.java
@@ -0,0 +1,12 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class TruthValue implements java.io.Serializable {
+  public abstract <R,A> R accept(TruthValue.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URICur.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URICur.java
new file mode 100644
index 0000000..aa175d2
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URICur.java
@@ -0,0 +1,25 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class URICur extends URIRef {
+  public final NSPrefix nsprefix_;
+  public final String ident_;
+
+  public URICur(NSPrefix p1, String p2) { nsprefix_ = p1; ident_ = p2; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URICur) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.URICur x = (com.googlecode.opennars.parser.loan.Loan.Absyn.URICur)o;
+      return this.nsprefix_.equals(x.nsprefix_) && this.ident_.equals(x.ident_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return 37*(this.nsprefix_.hashCode())+this.ident_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIFul.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIFul.java
new file mode 100644
index 0000000..21a9e05
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIFul.java
@@ -0,0 +1,24 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public class URIFul extends URIRef {
+  public final String urilit_;
+
+  public URIFul(String p1) { urilit_ = p1; }
+
+  public <R,A> R accept(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef.Visitor<R,A> v, A arg) { return v.visit(this, arg); }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul) {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul x = (com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul)o;
+      return this.urilit_.equals(x.urilit_);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return this.urilit_.hashCode();
+  }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIRef.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIRef.java
new file mode 100644
index 0000000..4df8f5c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Absyn/URIRef.java
@@ -0,0 +1,11 @@
+package com.googlecode.opennars.parser.loan.Loan.Absyn; // Java Package generated by the BNF Converter.
+
+public abstract class URIRef implements java.io.Serializable {
+  public abstract <R,A> R accept(URIRef.Visitor<R,A> v, A arg);
+  public interface Visitor <R,A> {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul p, A arg);
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur p, A arg);
+
+  }
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/AllVisitor.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/AllVisitor.java
new file mode 100644
index 0000000..505a1a7
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/AllVisitor.java
@@ -0,0 +1,16 @@
+package com.googlecode.opennars.parser.loan.Loan;
+
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+
+/** BNFC-Generated All Visitor */
+public interface AllVisitor<R,A> extends
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Document.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix.Visitor<R,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue.Visitor<R,A>
+{}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/ComposVisitor.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/ComposVisitor.java
new file mode 100644
index 0000000..adce4b9
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/ComposVisitor.java
@@ -0,0 +1,452 @@
+package com.googlecode.opennars.parser.loan.Loan;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+/** BNFC-Generated Composition Visitor
+*/
+
+public class ComposVisitor<A> implements
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Document.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.Document,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Stm.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.Stm,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Term.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.Term,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.Literal.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.Literal,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix,A>,
+  com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue.Visitor<com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue,A>
+{
+/* Document */
+    public Document visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR p, A arg)
+    {
+      BaseRule baserule_ = p.baserule_.accept(this, arg);
+      ListSentence listsentence_ = new ListSentence();
+      for (Sentence x : p.listsentence_) {
+        listsentence_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR(baserule_, listsentence_);
+    }
+    public Document visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc p, A arg)
+    {
+      ListSentence listsentence_ = new ListSentence();
+      for (Sentence x : p.listsentence_) {
+        listsentence_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.Doc(listsentence_);
+    }
+
+/* BaseRule */
+    public BaseRule visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR p, A arg)
+    {
+      String urilit_ = p.urilit_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR(urilit_);
+    }
+
+/* Sentence */
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix p, A arg)
+    {
+      NSPrefix nsprefix_ = p.nsprefix_.accept(this, arg);
+      String urilit_ = p.urilit_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix(nsprefix_, urilit_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport p, A arg)
+    {
+      String urilit_ = p.urilit_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport(urilit_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay p, A arg)
+    {
+      Integer integer_ = p.integer_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay(integer_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp p, A arg)
+    {
+      URIRef uriref_ = p.uriref_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp(uriref_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+      TruthValue truthvalue_ = p.truthvalue_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge(stm_, truthvalue_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest(stm_);
+    }
+    public Sentence visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+      TruthValue truthvalue_ = p.truthvalue_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal(stm_, truthvalue_);
+    }
+
+/* Stm */
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq p, A arg)
+    {
+      Stm stm_1 = p.stm_1.accept(this, arg);
+      Stm stm_2 = p.stm_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq(stm_1, stm_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot(stm_);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst(stm_);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres(stm_);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut(stm_);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher(term_1, term_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim(term_1, term_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst(term_1, term_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp(term_1, term_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp(term_1, term_2);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp p, A arg)
+    {
+      Term term_ = p.term_.accept(this, arg);
+      ListTerm listterm_ = new ListTerm();
+      for (Term x : p.listterm_) {
+        listterm_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp(term_, listterm_);
+    }
+    public Stm visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm p, A arg)
+    {
+      Term term_ = p.term_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm(term_);
+    }
+
+/* Term */
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt(term_1, term_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt(term_1, term_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif(term_1, term_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif p, A arg)
+    {
+      Term term_1 = p.term_1.accept(this, arg);
+      Term term_2 = p.term_2.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif(term_1, term_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg p, A arg)
+    {
+      Term term_ = p.term_.accept(this, arg);
+      ListTerm listterm_1 = new ListTerm();
+      for (Term x : p.listterm_1) {
+        listterm_1.add(x.accept(this,arg));
+      }
+      ListTerm listterm_2 = new ListTerm();
+      for (Term x : p.listterm_2) {
+        listterm_2.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg(term_, listterm_1, listterm_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg p, A arg)
+    {
+      Term term_ = p.term_.accept(this, arg);
+      ListTerm listterm_1 = new ListTerm();
+      for (Term x : p.listterm_1) {
+        listterm_1.add(x.accept(this,arg));
+      }
+      ListTerm listterm_2 = new ListTerm();
+      for (Term x : p.listterm_2) {
+        listterm_2.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg(term_, listterm_1, listterm_2);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet p, A arg)
+    {
+      ListTerm listterm_ = new ListTerm();
+      for (Term x : p.listterm_) {
+        listterm_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet(listterm_);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet p, A arg)
+    {
+      ListTerm listterm_ = new ListTerm();
+      for (Term x : p.listterm_) {
+        listterm_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet(listterm_);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd p, A arg)
+    {
+      ListTerm listterm_ = new ListTerm();
+      for (Term x : p.listterm_) {
+        listterm_.add(x.accept(this,arg));
+      }
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd(listterm_);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit p, A arg)
+    {
+      Literal literal_ = p.literal_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit(literal_);
+    }
+    public Term visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm p, A arg)
+    {
+      Stm stm_ = p.stm_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm(stm_);
+    }
+
+/* URIRef */
+    public URIRef visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul p, A arg)
+    {
+      String urilit_ = p.urilit_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul(urilit_);
+    }
+    public URIRef visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur p, A arg)
+    {
+      NSPrefix nsprefix_ = p.nsprefix_.accept(this, arg);
+      String ident_ = p.ident_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.URICur(nsprefix_, ident_);
+    }
+
+/* Literal */
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar p, A arg)
+    {
+      String ident_ = p.ident_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar(ident_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn p, A arg)
+    {
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn();
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD p, A arg)
+    {
+      String ident_ = p.ident_;
+      ListIdent listident_ = p.listident_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD(ident_, listident_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI p, A arg)
+    {
+      String ident_ = p.ident_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI(ident_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI p, A arg)
+    {
+      URIRef uriref_ = p.uriref_.accept(this, arg);
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI(uriref_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt p, A arg)
+    {
+      Integer integer_ = p.integer_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt(integer_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl p, A arg)
+    {
+      Double double_ = p.double_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl(double_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString p, A arg)
+    {
+      String string_ = p.string_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitString(string_);
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue p, A arg)
+    {
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue();
+    }
+    public Literal visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse p, A arg)
+    {
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse();
+    }
+
+/* NSPrefix */
+    public NSPrefix visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 p, A arg)
+    {
+      String ident_ = p.ident_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1(ident_);
+    }
+    public NSPrefix visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 p, A arg)
+    {
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2();
+    }
+
+/* TruthValue */
+    public TruthValue visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE p, A arg)
+    {
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE();
+    }
+    public TruthValue visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF p, A arg)
+    {
+      Double double_ = p.double_;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF(double_);
+    }
+    public TruthValue visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC p, A arg)
+    {
+      Double double_1 = p.double_1;
+      Double double_2 = p.double_2;
+
+      return new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC(double_1, double_2);
+    }
+
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/FoldVisitor.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/FoldVisitor.java
new file mode 100644
index 0000000..1ce5116
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/FoldVisitor.java
@@ -0,0 +1,362 @@
+package com.googlecode.opennars.parser.loan.Loan;
+
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+/** BNFC-Generated Fold Visitor */
+public abstract class FoldVisitor<R,A> implements AllVisitor<R,A> {
+    public abstract R leaf(A arg);
+    public abstract R combine(R x, R y, A arg);
+
+/* Document */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.baserule_.accept(this, arg), r, arg);
+      for (Sentence x : p.listsentence_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc p, A arg) {
+      R r = leaf(arg);
+      for (Sentence x : p.listsentence_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+
+/* BaseRule */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+
+/* Sentence */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.nsprefix_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.uriref_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      r = combine(p.truthvalue_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      r = combine(p.truthvalue_.accept(this, arg), r, arg);
+      return r;
+    }
+
+/* Stm */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_1.accept(this, arg), r, arg);
+      r = combine(p.stm_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_.accept(this, arg), r, arg);
+      for (Term x : p.listterm_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_.accept(this, arg), r, arg);
+      return r;
+    }
+
+/* Term */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_1.accept(this, arg), r, arg);
+      r = combine(p.term_2.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_.accept(this, arg), r, arg);
+      for (Term x : p.listterm_1) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      for (Term x : p.listterm_2) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.term_.accept(this, arg), r, arg);
+      for (Term x : p.listterm_1) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      for (Term x : p.listterm_2) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet p, A arg) {
+      R r = leaf(arg);
+      for (Term x : p.listterm_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet p, A arg) {
+      R r = leaf(arg);
+      for (Term x : p.listterm_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd p, A arg) {
+      R r = leaf(arg);
+      for (Term x : p.listterm_) {
+        r = combine(x.accept(this,arg), r, arg);
+      }
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.literal_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.stm_.accept(this, arg), r, arg);
+      return r;
+    }
+
+/* URIRef */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.nsprefix_.accept(this, arg), r, arg);
+      return r;
+    }
+
+/* Literal */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI p, A arg) {
+      R r = leaf(arg);
+      r = combine(p.uriref_.accept(this, arg), r, arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+
+/* NSPrefix */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+
+/* TruthValue */
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC p, A arg) {
+      R r = leaf(arg);
+      return r;
+    }
+
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Loan.cup b/open-nars/com/googlecode/opennars/parser/loan/Loan/Loan.cup
new file mode 100644
index 0000000..5a2f448
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Loan.cup
@@ -0,0 +1,197 @@
+// -*- Java -*- This Cup file was machine-generated by BNFC
+package com.googlecode.opennars.parser.loan.Loan;
+
+parser code {:
+  public com.googlecode.opennars.parser.loan.Loan.Absyn.Document pDocument() throws Exception
+  {
+	java_cup.runtime.Symbol res = parse();
+	return (com.googlecode.opennars.parser.loan.Loan.Absyn.Document) res.value;
+  }
+
+public <B,A extends java.util.LinkedList<? super B>> A cons_(B x, A xs) { xs.addFirst(x); return xs; }
+
+public void syntax_error(java_cup.runtime.Symbol cur_token)
+{
+	report_error("Syntax Error, trying to recover and continue parse...", cur_token);
+}
+
+public void unrecovered_syntax_error(java_cup.runtime.Symbol cur_token) throws java.lang.Exception
+{
+	throw new Exception("Unrecoverable Syntax Error");
+}
+
+:}
+
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Document Document;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule BaseRule;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence ListSentence;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence Sentence;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Stm Stm;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Stm Stm1;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Stm Stm2;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Stm Stm3;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Term Term;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Term Term1;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Term Term2;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Term Term3;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm ListTerm;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent ListIdent;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef URIRef;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.Literal Literal;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix NSPrefix;
+nonterminal com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue TruthValue;
+
+terminal _SYMB_0;    //   @base
+terminal _SYMB_1;    //   .
+terminal _SYMB_2;    //   @prefix
+terminal _SYMB_3;    //   @import
+terminal _SYMB_4;    //   @delay
+terminal _SYMB_5;    //   @operator
+terminal _SYMB_6;    //   ?
+terminal _SYMB_7;    //   !
+terminal _SYMB_8;    //   ==>
+terminal _SYMB_9;    //   <=>
+terminal _SYMB_10;    //   =/>
+terminal _SYMB_11;    //   =\>
+terminal _SYMB_12;    //   =|>
+terminal _SYMB_13;    //   </>
+terminal _SYMB_14;    //   <|>
+terminal _SYMB_15;    //   &&
+terminal _SYMB_16;    //   ||
+terminal _SYMB_17;    //   ;
+terminal _SYMB_18;    //   ,
+terminal _SYMB_19;    //   -->
+terminal _SYMB_20;    //   <->
+terminal _SYMB_21;    //   }->
+terminal _SYMB_22;    //   --[
+terminal _SYMB_23;    //   }-[
+terminal _SYMB_24;    //   (
+terminal _SYMB_25;    //   )
+terminal _SYMB_26;    //   &
+terminal _SYMB_27;    //   |
+terminal _SYMB_28;    //   -
+terminal _SYMB_29;    //   ~
+terminal _SYMB_30;    //   _|_
+terminal _SYMB_31;    //   {
+terminal _SYMB_32;    //   }
+terminal _SYMB_33;    //   [
+terminal _SYMB_34;    //   ]
+terminal _SYMB_35;    //   #
+terminal _SYMB_36;    //   :
+terminal _SYMB_37;    //   %
+terminal _SYMB_38;    //   extension
+terminal _SYMB_39;    //   false
+terminal _SYMB_40;    //   future
+terminal _SYMB_41;    //   intension
+terminal _SYMB_42;    //   not
+terminal _SYMB_43;    //   past
+terminal _SYMB_44;    //   present
+terminal _SYMB_45;    //   true
+
+terminal String _STRING_;
+
+terminal Integer _INTEGER_;
+terminal Double _DOUBLE_;
+terminal String _IDENT_;
+
+terminal String URILit;
+
+
+start with Document;
+
+
+Document ::= BaseRule:p_1 ListSentence:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR(p_1,p_2); :} 
+  | ListSentence:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.Doc(p_1); :}
+;
+BaseRule ::= _SYMB_0 URILit:p_2 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR(p_2); :} 
+;
+ListSentence ::=  /* empty */  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence(); :} 
+  | ListSentence:p_1 Sentence:p_2  {: RESULT = p_1; p_1.addLast(p_2); :}
+;
+Sentence ::= _SYMB_2 NSPrefix:p_2 URILit:p_3 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix(p_2,p_3); :} 
+  | _SYMB_3 URILit:p_2 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport(p_2); :}
+  | _SYMB_4 _INTEGER_:p_2 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay(p_2); :}
+  | _SYMB_5 URIRef:p_2 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp(p_2); :}
+  | Stm:p_1 TruthValue:p_2 _SYMB_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge(p_1,p_2); :}
+  | Stm:p_1 _SYMB_6  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest(p_1); :}
+  | Stm:p_1 TruthValue:p_2 _SYMB_7  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal(p_1,p_2); :}
+;
+Stm ::= Stm:p_1 _SYMB_8 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl(p_1,p_3); :} 
+  | Stm:p_1 _SYMB_9 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv(p_1,p_3); :}
+  | Stm:p_1 _SYMB_10 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred(p_1,p_3); :}
+  | Stm:p_1 _SYMB_11 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet(p_1,p_3); :}
+  | Stm:p_1 _SYMB_12 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc(p_1,p_3); :}
+  | Stm:p_1 _SYMB_13 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred(p_1,p_3); :}
+  | Stm:p_1 _SYMB_14 Stm1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc(p_1,p_3); :}
+  | Stm1:p_1  {: RESULT = p_1; :}
+;
+Stm1 ::= Stm1:p_1 _SYMB_15 Stm2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj(p_1,p_3); :} 
+  | Stm1:p_1 _SYMB_16 Stm2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj(p_1,p_3); :}
+  | Stm1:p_1 _SYMB_17 Stm2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar(p_1,p_3); :}
+  | Stm1:p_1 _SYMB_18 Stm2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq(p_1,p_3); :}
+  | Stm2:p_1  {: RESULT = p_1; :}
+;
+Stm2 ::= _SYMB_42 Stm3:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot(p_2); :} 
+  | _SYMB_43 Stm3:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst(p_2); :}
+  | _SYMB_44 Stm3:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres(p_2); :}
+  | _SYMB_40 Stm3:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut(p_2); :}
+  | Stm3:p_1  {: RESULT = p_1; :}
+;
+Stm3 ::= Term:p_1 _SYMB_19 Term:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher(p_1,p_3); :} 
+  | Term:p_1 _SYMB_20 Term:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim(p_1,p_3); :}
+  | Term:p_1 _SYMB_21 Term:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst(p_1,p_3); :}
+  | Term:p_1 _SYMB_22 Term:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp(p_1,p_3); :}
+  | Term:p_1 _SYMB_23 Term:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp(p_1,p_3); :}
+  | Term:p_1 _SYMB_24 ListTerm:p_3 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp(p_1,p_3); :}
+  | Term:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm(p_1); :}
+  | _SYMB_24 Stm:p_2 _SYMB_25  {: RESULT = p_2; :}
+;
+Term ::= Term:p_1 _SYMB_26 Term1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt(p_1,p_3); :} 
+  | Term:p_1 _SYMB_27 Term1:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt(p_1,p_3); :}
+  | Term1:p_1  {: RESULT = p_1; :}
+;
+Term1 ::= Term1:p_1 _SYMB_28 Term2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif(p_1,p_3); :} 
+  | Term1:p_1 _SYMB_29 Term2:p_3  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif(p_1,p_3); :}
+  | Term2:p_1  {: RESULT = p_1; :}
+;
+Term2 ::= Term:p_1 _SYMB_38 _SYMB_24 ListTerm:p_4 _SYMB_30 ListTerm:p_6 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg(p_1,p_4,p_6); :} 
+  | Term:p_1 _SYMB_41 _SYMB_24 ListTerm:p_4 _SYMB_30 ListTerm:p_6 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg(p_1,p_4,p_6); :}
+  | Term3:p_1  {: RESULT = p_1; :}
+;
+Term3 ::= _SYMB_31 ListTerm:p_2 _SYMB_32  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet(p_2); :} 
+  | _SYMB_33 ListTerm:p_2 _SYMB_34  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet(p_2); :}
+  | _SYMB_24 ListTerm:p_2 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd(p_2); :}
+  | Literal:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit(p_1); :}
+  | _SYMB_24 Stm:p_2 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm(p_2); :}
+  | _SYMB_24 Term:p_2 _SYMB_25  {: RESULT = p_2; :}
+;
+ListTerm ::=  /* empty */  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm(); :} 
+  | Term:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm(); RESULT.addLast(p_1); :}
+  | Term:p_1 _SYMB_18 ListTerm:p_3  {: RESULT = p_3; p_3.addFirst(p_1); :}
+;
+ListIdent ::=  /* empty */  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent(); :} 
+  | _IDENT_:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent(); RESULT.addLast(p_1); :}
+  | _IDENT_:p_1 _SYMB_18 ListIdent:p_3  {: RESULT = p_3; p_3.addFirst(p_1); :}
+;
+URIRef ::= URILit:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul(p_1); :} 
+  | NSPrefix:p_1 _IDENT_:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.URICur(p_1,p_2); :}
+;
+Literal ::= _SYMB_6 _IDENT_:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar(p_2); :} 
+  | _SYMB_6  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn(); :}
+  | _SYMB_35 _IDENT_:p_2 _SYMB_24 ListIdent:p_4 _SYMB_25  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD(p_2,p_4); :}
+  | _SYMB_35 _IDENT_:p_2  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI(p_2); :}
+  | URIRef:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI(p_1); :}
+  | _INTEGER_:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt(p_1); :}
+  | _DOUBLE_:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl(p_1); :}
+  | _STRING_:p_1  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitString(p_1); :}
+  | _SYMB_45  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue(); :}
+  | _SYMB_39  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse(); :}
+;
+NSPrefix ::= _IDENT_:p_1 _SYMB_36  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1(p_1); :} 
+  | _SYMB_36  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2(); :}
+;
+TruthValue ::=  /* empty */  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE(); :} 
+  | _SYMB_37 _DOUBLE_:p_2 _SYMB_37  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF(p_2); :}
+  | _SYMB_37 _DOUBLE_:p_2 _SYMB_17 _DOUBLE_:p_4 _SYMB_37  {: RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC(p_2,p_4); :}
+;
+
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/PrettyPrinter.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/PrettyPrinter.java
new file mode 100644
index 0000000..0bb7940
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/PrettyPrinter.java
@@ -0,0 +1,1458 @@
+package com.googlecode.opennars.parser.loan.Loan;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+
+public class PrettyPrinter
+{
+  //For certain applications increasing the initial size of the buffer may improve performance.
+  private static final int INITIAL_BUFFER_SIZE = 128;
+  //You may wish to change the parentheses used in precedence.
+  private static final String _L_PAREN = new String("(");
+  private static final String _R_PAREN = new String(")");
+  //You may wish to change render
+  private static void render(String s)
+  {
+    if (s.equals("{"))
+    {
+       buf_.append("\n");
+       indent();
+       buf_.append(s);
+       _n_ = _n_ + 2;
+       buf_.append("\n");
+       indent();
+    }
+    else if (s.equals("(") || s.equals("["))
+       buf_.append(s);
+    else if (s.equals(")") || s.equals("]"))
+    {
+       backup();
+       buf_.append(s);
+       buf_.append(" ");
+    }
+    else if (s.equals("}"))
+    {
+       _n_ = _n_ - 2;
+       backup();
+       backup();
+       buf_.append(s);
+       buf_.append("\n");
+       indent();
+    }
+    else if (s.equals(","))
+    {
+       backup();
+       buf_.append(s);
+       buf_.append(" ");
+    }
+    else if (s.equals(";"))
+    {
+       backup();
+       buf_.append(s);
+       buf_.append("\n");
+       indent();
+    }
+    else if (s.equals("")) return;
+    else
+    {
+       buf_.append(s);
+       buf_.append(" ");
+    }
+  }
+
+
+  //  print and show methods are defined for each category.
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.Document foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.Document foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.Term foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.Term foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String print(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue foo)
+  {
+    pp(foo, 0);
+    trim();
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  public static String show(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue foo)
+  {
+    sh(foo);
+    String temp = buf_.toString();
+    buf_.delete(0,buf_.length());
+    return temp;
+  }
+  /***   You shouldn't need to change anything beyond this point.   ***/
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.Document foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR _docbr = (com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_docbr.baserule_, 0);
+       pp(_docbr.listsentence_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.Doc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.Doc _doc = (com.googlecode.opennars.parser.loan.Loan.Absyn.Doc) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_doc.listsentence_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR _baser = (com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("@base");
+       pp(_baser.urilit_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence foo, int _i_)
+  {
+     for (java.util.Iterator<Sentence> it = foo.iterator(); it.hasNext();)
+     {
+       pp(it.next(), 0);
+       if (it.hasNext()) {
+         render("");
+       } else {
+         render("");
+       }
+     }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix _sentprefix = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("@prefix");
+       pp(_sentprefix.nsprefix_, 0);
+       pp(_sentprefix.urilit_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport _sentimport = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("@import");
+       pp(_sentimport.urilit_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay _sentdelay = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("@delay");
+       pp(_sentdelay.integer_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp _sentop = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("@operator");
+       pp(_sentop.uriref_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge _sentjudge = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_sentjudge.stm_, 0);
+       pp(_sentjudge.truthvalue_, 0);
+       render(".");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest _sentquest = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_sentquest.stm_, 0);
+       render("?");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal _sentgoal = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_sentgoal.stm_, 0);
+       pp(_sentgoal.truthvalue_, 0);
+       render("!");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl _stmimpl = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmimpl.stm_1, 0);
+       render("==>");
+       pp(_stmimpl.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv _stmequiv = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmequiv.stm_1, 0);
+       render("<=>");
+       pp(_stmequiv.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred _stmimppred = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmimppred.stm_1, 0);
+       render("=/>");
+       pp(_stmimppred.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet _stmimpret = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmimpret.stm_1, 0);
+       render("=\\>");
+       pp(_stmimpret.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc _stmimpconc = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmimpconc.stm_1, 0);
+       render("=|>");
+       pp(_stmimpconc.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred _stmeqvpred = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmeqvpred.stm_1, 0);
+       render("</>");
+       pp(_stmeqvpred.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc _stmeqvconc = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_stmeqvconc.stm_1, 0);
+       render("<|>");
+       pp(_stmeqvconc.stm_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj _stmconj = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_stmconj.stm_1, 1);
+       render("&&");
+       pp(_stmconj.stm_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj _stmdisj = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_stmdisj.stm_1, 1);
+       render("||");
+       pp(_stmdisj.stm_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar _stmpar = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_stmpar.stm_1, 1);
+       render(";");
+       pp(_stmpar.stm_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq _stmseq = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_stmseq.stm_1, 1);
+       render(",");
+       pp(_stmseq.stm_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot _stmnot = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       render("not");
+       pp(_stmnot.stm_, 3);
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst _stmpst = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       render("past");
+       pp(_stmpst.stm_, 3);
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres _stmpres = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       render("present");
+       pp(_stmpres.stm_, 3);
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut _stmfut = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       render("future");
+       pp(_stmfut.stm_, 3);
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher _stminher = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stminher.term_1, 0);
+       render("-->");
+       pp(_stminher.term_2, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim _stmsim = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stmsim.term_1, 0);
+       render("<->");
+       pp(_stmsim.term_2, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst _stminst = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stminst.term_1, 0);
+       render("}->");
+       pp(_stminst.term_2, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp _stmprop = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stmprop.term_1, 0);
+       render("--[");
+       pp(_stmprop.term_2, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp _stminpp = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stminpp.term_1, 0);
+       render("}-[");
+       pp(_stminpp.term_2, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp _stmop = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stmop.term_, 0);
+       render("(");
+       pp(_stmop.listterm_, 0);
+       render(")");
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm _stmtrm = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_stmtrm.term_, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.Term foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt _trmexint = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_trmexint.term_1, 0);
+       render("&");
+       pp(_trmexint.term_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt _trminint = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_trminint.term_1, 0);
+       render("|");
+       pp(_trminint.term_2, 1);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif _trmexdif = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_trmexdif.term_1, 1);
+       render("-");
+       pp(_trmexdif.term_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif _trmindif = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif) foo;
+       if (_i_ > 1) render(_L_PAREN);
+       pp(_trmindif.term_1, 1);
+       render("~");
+       pp(_trmindif.term_2, 2);
+       if (_i_ > 1) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg _trmeximg = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       pp(_trmeximg.term_, 0);
+       render("extension");
+       render("(");
+       pp(_trmeximg.listterm_1, 0);
+       render("_|_");
+       pp(_trmeximg.listterm_2, 0);
+       render(")");
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg _trminimg = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg) foo;
+       if (_i_ > 2) render(_L_PAREN);
+       pp(_trminimg.term_, 0);
+       render("intension");
+       render("(");
+       pp(_trminimg.listterm_1, 0);
+       render("_|_");
+       pp(_trminimg.listterm_2, 0);
+       render(")");
+       if (_i_ > 2) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet _trmexset = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       render("{");
+       pp(_trmexset.listterm_, 0);
+       render("}");
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet _trminset = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       render("[");
+       pp(_trminset.listterm_, 0);
+       render("]");
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd _trmprod = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       render("(");
+       pp(_trmprod.listterm_, 0);
+       render(")");
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit _trmlit = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       pp(_trmlit.literal_, 0);
+       if (_i_ > 3) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm _trmstm = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm) foo;
+       if (_i_ > 3) render(_L_PAREN);
+       render("(");
+       pp(_trmstm.stm_, 0);
+       render(")");
+       if (_i_ > 3) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm foo, int _i_)
+  {
+     for (java.util.Iterator<Term> it = foo.iterator(); it.hasNext();)
+     {
+       pp(it.next(), 0);
+       if (it.hasNext()) {
+         render(",");
+       } else {
+         render("");
+       }
+     }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent foo, int _i_)
+  {
+     for (java.util.Iterator<String> it = foo.iterator(); it.hasNext();)
+     {
+       pp(it.next(), 0);
+       if (it.hasNext()) {
+         render(",");
+       } else {
+         render("");
+       }
+     }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul _uriful = (com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_uriful.urilit_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URICur)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.URICur _uricur = (com.googlecode.opennars.parser.loan.Loan.Absyn.URICur) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_uricur.nsprefix_, 0);
+       pp(_uricur.ident_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar _litqvar = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("?");
+       pp(_litqvar.ident_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn _litqvaran = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("?");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD _litsvard = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("#");
+       pp(_litsvard.ident_, 0);
+       render("(");
+       pp(_litsvard.listident_, 0);
+       render(")");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI _litsvari = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("#");
+       pp(_litsvari.ident_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI _lituri = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_lituri.uriref_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt _litint = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_litint.integer_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl _litdbl = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_litdbl.double_, 0);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitString)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitString _litstring = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitString) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       printQuoted(_litstring.string_);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue _littrue = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("true");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse _litfalse = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("false");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 _nsprefix1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       pp(_nsprefix1.ident_, 0);
+       render(":");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 _nsprefix2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render(":");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+  private static void pp(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue foo, int _i_)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE _truthe = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF _truthf = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("%");
+       pp(_truthf.double_, 0);
+       render("%");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+    else     if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC _truthfc = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC) foo;
+       if (_i_ > 0) render(_L_PAREN);
+       render("%");
+       pp(_truthfc.double_1, 0);
+       render(";");
+       pp(_truthfc.double_2, 0);
+       render("%");
+       if (_i_ > 0) render(_R_PAREN);
+    }
+  }
+
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.Document foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR _docbr = (com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR) foo;
+       render("(");
+       render("DocBR");
+       sh(_docbr.baserule_);
+       render("[");
+       sh(_docbr.listsentence_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.Doc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.Doc _doc = (com.googlecode.opennars.parser.loan.Loan.Absyn.Doc) foo;
+       render("(");
+       render("Doc");
+       render("[");
+       sh(_doc.listsentence_);
+       render("]");
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR _baser = (com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR) foo;
+       render("(");
+       render("BaseR");
+       sh(_baser.urilit_);
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence foo)
+  {
+     for (java.util.Iterator<Sentence> it = foo.iterator(); it.hasNext();)
+     {
+       sh(it.next());
+       if (it.hasNext())
+         render(",");
+     }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix _sentprefix = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix) foo;
+       render("(");
+       render("SentPrefix");
+       sh(_sentprefix.nsprefix_);
+       sh(_sentprefix.urilit_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport _sentimport = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport) foo;
+       render("(");
+       render("SentImport");
+       sh(_sentimport.urilit_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay _sentdelay = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay) foo;
+       render("(");
+       render("SentDelay");
+       sh(_sentdelay.integer_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp _sentop = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp) foo;
+       render("(");
+       render("SentOp");
+       sh(_sentop.uriref_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge _sentjudge = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge) foo;
+       render("(");
+       render("SentJudge");
+       sh(_sentjudge.stm_);
+       sh(_sentjudge.truthvalue_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest _sentquest = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest) foo;
+       render("(");
+       render("SentQuest");
+       sh(_sentquest.stm_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal _sentgoal = (com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal) foo;
+       render("(");
+       render("SentGoal");
+       sh(_sentgoal.stm_);
+       sh(_sentgoal.truthvalue_);
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.Stm foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl _stmimpl = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl) foo;
+       render("(");
+       render("StmImpl");
+       sh(_stmimpl.stm_1);
+       sh(_stmimpl.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv _stmequiv = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv) foo;
+       render("(");
+       render("StmEquiv");
+       sh(_stmequiv.stm_1);
+       sh(_stmequiv.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred _stmimppred = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred) foo;
+       render("(");
+       render("StmImpPred");
+       sh(_stmimppred.stm_1);
+       sh(_stmimppred.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet _stmimpret = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet) foo;
+       render("(");
+       render("StmImpRet");
+       sh(_stmimpret.stm_1);
+       sh(_stmimpret.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc _stmimpconc = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc) foo;
+       render("(");
+       render("StmImpConc");
+       sh(_stmimpconc.stm_1);
+       sh(_stmimpconc.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred _stmeqvpred = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred) foo;
+       render("(");
+       render("StmEqvPred");
+       sh(_stmeqvpred.stm_1);
+       sh(_stmeqvpred.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc _stmeqvconc = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc) foo;
+       render("(");
+       render("StmEqvConc");
+       sh(_stmeqvconc.stm_1);
+       sh(_stmeqvconc.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj _stmconj = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj) foo;
+       render("(");
+       render("StmConj");
+       sh(_stmconj.stm_1);
+       sh(_stmconj.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj _stmdisj = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj) foo;
+       render("(");
+       render("StmDisj");
+       sh(_stmdisj.stm_1);
+       sh(_stmdisj.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar _stmpar = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar) foo;
+       render("(");
+       render("StmPar");
+       sh(_stmpar.stm_1);
+       sh(_stmpar.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq _stmseq = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq) foo;
+       render("(");
+       render("StmSeq");
+       sh(_stmseq.stm_1);
+       sh(_stmseq.stm_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot _stmnot = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot) foo;
+       render("(");
+       render("StmNot");
+       sh(_stmnot.stm_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst _stmpst = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst) foo;
+       render("(");
+       render("StmPst");
+       sh(_stmpst.stm_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres _stmpres = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres) foo;
+       render("(");
+       render("StmPres");
+       sh(_stmpres.stm_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut _stmfut = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut) foo;
+       render("(");
+       render("StmFut");
+       sh(_stmfut.stm_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher _stminher = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher) foo;
+       render("(");
+       render("StmInher");
+       sh(_stminher.term_1);
+       sh(_stminher.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim _stmsim = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim) foo;
+       render("(");
+       render("StmSim");
+       sh(_stmsim.term_1);
+       sh(_stmsim.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst _stminst = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst) foo;
+       render("(");
+       render("StmInst");
+       sh(_stminst.term_1);
+       sh(_stminst.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp _stmprop = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp) foo;
+       render("(");
+       render("StmProp");
+       sh(_stmprop.term_1);
+       sh(_stmprop.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp _stminpp = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp) foo;
+       render("(");
+       render("StmInPp");
+       sh(_stminpp.term_1);
+       sh(_stminpp.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp _stmop = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp) foo;
+       render("(");
+       render("StmOp");
+       sh(_stmop.term_);
+       render("[");
+       sh(_stmop.listterm_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm _stmtrm = (com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm) foo;
+       render("(");
+       render("StmTrm");
+       sh(_stmtrm.term_);
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.Term foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt _trmexint = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt) foo;
+       render("(");
+       render("TrmExInt");
+       sh(_trmexint.term_1);
+       sh(_trmexint.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt _trminint = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt) foo;
+       render("(");
+       render("TrmInInt");
+       sh(_trminint.term_1);
+       sh(_trminint.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif _trmexdif = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif) foo;
+       render("(");
+       render("TrmExDif");
+       sh(_trmexdif.term_1);
+       sh(_trmexdif.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif _trmindif = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif) foo;
+       render("(");
+       render("TrmInDif");
+       sh(_trmindif.term_1);
+       sh(_trmindif.term_2);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg _trmeximg = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg) foo;
+       render("(");
+       render("TrmExImg");
+       sh(_trmeximg.term_);
+       render("[");
+       sh(_trmeximg.listterm_1);
+       render("]");
+       render("[");
+       sh(_trmeximg.listterm_2);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg _trminimg = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg) foo;
+       render("(");
+       render("TrmInImg");
+       sh(_trminimg.term_);
+       render("[");
+       sh(_trminimg.listterm_1);
+       render("]");
+       render("[");
+       sh(_trminimg.listterm_2);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet _trmexset = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet) foo;
+       render("(");
+       render("TrmExSet");
+       render("[");
+       sh(_trmexset.listterm_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet _trminset = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet) foo;
+       render("(");
+       render("TrmInSet");
+       render("[");
+       sh(_trminset.listterm_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd _trmprod = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd) foo;
+       render("(");
+       render("TrmProd");
+       render("[");
+       sh(_trmprod.listterm_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit _trmlit = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit) foo;
+       render("(");
+       render("TrmLit");
+       sh(_trmlit.literal_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm _trmstm = (com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm) foo;
+       render("(");
+       render("TrmStm");
+       sh(_trmstm.stm_);
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm foo)
+  {
+     for (java.util.Iterator<Term> it = foo.iterator(); it.hasNext();)
+     {
+       sh(it.next());
+       if (it.hasNext())
+         render(",");
+     }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent foo)
+  {
+     for (java.util.Iterator<String> it = foo.iterator(); it.hasNext();)
+     {
+       sh(it.next());
+       if (it.hasNext())
+         render(",");
+     }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul _uriful = (com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul) foo;
+       render("(");
+       render("URIFul");
+       sh(_uriful.urilit_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.URICur)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.URICur _uricur = (com.googlecode.opennars.parser.loan.Loan.Absyn.URICur) foo;
+       render("(");
+       render("URICur");
+       sh(_uricur.nsprefix_);
+       sh(_uricur.ident_);
+       render(")");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.Literal foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar _litqvar = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar) foo;
+       render("(");
+       render("LitQVar");
+       sh(_litqvar.ident_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn _litqvaran = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn) foo;
+       render("LitQVarAn");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD _litsvard = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD) foo;
+       render("(");
+       render("LitSVarD");
+       sh(_litsvard.ident_);
+       render("[");
+       sh(_litsvard.listident_);
+       render("]");
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI _litsvari = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI) foo;
+       render("(");
+       render("LitSVarI");
+       sh(_litsvari.ident_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI _lituri = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI) foo;
+       render("(");
+       render("LitURI");
+       sh(_lituri.uriref_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt _litint = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt) foo;
+       render("(");
+       render("LitInt");
+       sh(_litint.integer_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl _litdbl = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl) foo;
+       render("(");
+       render("LitDbl");
+       sh(_litdbl.double_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitString)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitString _litstring = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitString) foo;
+       render("(");
+       render("LitString");
+       sh(_litstring.string_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue _littrue = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue) foo;
+       render("LitTrue");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse _litfalse = (com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse) foo;
+       render("LitFalse");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 _nsprefix1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1) foo;
+       render("(");
+       render("NSPrefix1");
+       sh(_nsprefix1.ident_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 _nsprefix2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2) foo;
+       render("NSPrefix2");
+    }
+  }
+
+  private static void sh(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue foo)
+  {
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE _truthe = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE) foo;
+       render("TruthE");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF _truthf = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF) foo;
+       render("(");
+       render("TruthF");
+       sh(_truthf.double_);
+       render(")");
+    }
+    if (foo instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC)
+    {
+       com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC _truthfc = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC) foo;
+       render("(");
+       render("TruthFC");
+       sh(_truthfc.double_1);
+       sh(_truthfc.double_2);
+       render(")");
+    }
+  }
+
+
+  private static void pp(Integer n, int _i_) { buf_.append(n); buf_.append(" "); }
+  private static void pp(Double d, int _i_) { buf_.append(d); buf_.append(" "); }
+  private static void pp(String s, int _i_) { buf_.append(s); buf_.append(" "); }
+  private static void pp(Character c, int _i_) { buf_.append("'" + c.toString() + "'"); buf_.append(" "); }
+  private static void sh(Integer n) { render(n.toString()); }
+  private static void sh(Double d) { render(d.toString()); }
+  private static void sh(Character c) { render(c.toString()); }
+  private static void sh(String s) { printQuoted(s); }
+  private static void printQuoted(String s) { render("\"" + s + "\""); }
+  private static void indent()
+  {
+    int n = _n_;
+    while (n > 0)
+    {
+      buf_.append(" ");
+      n--;
+    }
+  }
+  private static void backup()
+  {
+     if (buf_.charAt(buf_.length() - 1) == ' ') {
+      buf_.setLength(buf_.length() - 1);
+    }
+  }
+  private static void trim()
+  {
+     while (buf_.length() > 0 && buf_.charAt(0) == ' ')
+        buf_.deleteCharAt(0); 
+    while (buf_.length() > 0 && buf_.charAt(buf_.length()-1) == ' ')
+        buf_.deleteCharAt(buf_.length()-1);
+  }
+  private static int _n_ = 0;
+  private static StringBuilder buf_ = new StringBuilder(INITIAL_BUFFER_SIZE);
+}
+
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Test.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Test.java
new file mode 100644
index 0000000..72587a8
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Test.java
@@ -0,0 +1,48 @@
+package com.googlecode.opennars.parser.loan.Loan;
+import java_cup.runtime.*;
+import com.googlecode.opennars.parser.loan.Loan.*;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+import java.io.*;
+
+public class Test
+{
+  public static void main(String args[]) throws Exception
+  {
+    Yylex l = null;
+    parser p;
+    try
+    {
+      if (args.length == 0) l = new Yylex(System.in);
+      else l = new Yylex(new FileReader(args[0]));
+    }
+    catch(FileNotFoundException e)
+    {
+     System.err.println("Error: File not found: " + args[0]);
+     System.exit(1);
+    }
+    p = new parser(l);
+    /* The default parser is the first-defined entry point. */
+    /* You may want to change this. Other options are: */
+    /* pSentence */
+    try
+    {
+      com.googlecode.opennars.parser.loan.Loan.Absyn.Document parse_tree = p.pDocument();
+      System.out.println();
+      System.out.println("Parse Succesful!");
+      System.out.println();
+      System.out.println("[Abstract Syntax]");
+      System.out.println();
+      System.out.println(PrettyPrinter.show(parse_tree));
+      System.out.println();
+      System.out.println("[Linearized Tree]");
+      System.out.println();
+      System.out.println(PrettyPrinter.print(parse_tree));
+    }
+    catch(Throwable e)
+    {
+      System.err.println("At line " + String.valueOf(l.line_num()) + ", near \"" + l.buff() + "\" :");
+      System.err.println("     " + e.getMessage());
+      System.exit(1);
+    }
+  }
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/VisitSkel.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/VisitSkel.java
new file mode 100644
index 0000000..9b8392c
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/VisitSkel.java
@@ -0,0 +1,566 @@
+package com.googlecode.opennars.parser.loan.Loan;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.*;
+/*** BNFC-Generated Visitor Design Pattern Skeleton. ***/
+/* This implements the common visitor design pattern.
+   Tests show it to be slightly less efficient than the
+   instanceof method, but easier to use. 
+   Replace the R and A parameters with the desired return
+   and context types.*/
+
+public class VisitSkel
+{
+  public class DocumentVisitor<R,A> implements Document.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR p, A arg)
+    {
+      /* Code For DocBR Goes Here */
+
+      p.baserule_.accept(new BaseRuleVisitor<R,A>(), arg);
+      for (Sentence x : p.listsentence_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc p, A arg)
+    {
+      /* Code For Doc Goes Here */
+
+      for (Sentence x : p.listsentence_) {
+      }
+
+      return null;
+    }
+
+  }
+  public class BaseRuleVisitor<R,A> implements BaseRule.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR p, A arg)
+    {
+      /* Code For BaseR Goes Here */
+
+      //p.urilit_;
+
+      return null;
+    }
+
+  }
+  public class SentenceVisitor<R,A> implements Sentence.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix p, A arg)
+    {
+      /* Code For SentPrefix Goes Here */
+
+      p.nsprefix_.accept(new NSPrefixVisitor<R,A>(), arg);
+      //p.urilit_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport p, A arg)
+    {
+      /* Code For SentImport Goes Here */
+
+      //p.urilit_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay p, A arg)
+    {
+      /* Code For SentDelay Goes Here */
+
+      //p.integer_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp p, A arg)
+    {
+      /* Code For SentOp Goes Here */
+
+      p.uriref_.accept(new URIRefVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge p, A arg)
+    {
+      /* Code For SentJudge Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+      p.truthvalue_.accept(new TruthValueVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest p, A arg)
+    {
+      /* Code For SentQuest Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal p, A arg)
+    {
+      /* Code For SentGoal Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+      p.truthvalue_.accept(new TruthValueVisitor<R,A>(), arg);
+
+      return null;
+    }
+
+  }
+  public class StmVisitor<R,A> implements Stm.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl p, A arg)
+    {
+      /* Code For StmImpl Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv p, A arg)
+    {
+      /* Code For StmEquiv Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred p, A arg)
+    {
+      /* Code For StmImpPred Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet p, A arg)
+    {
+      /* Code For StmImpRet Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc p, A arg)
+    {
+      /* Code For StmImpConc Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred p, A arg)
+    {
+      /* Code For StmEqvPred Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc p, A arg)
+    {
+      /* Code For StmEqvConc Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj p, A arg)
+    {
+      /* Code For StmConj Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj p, A arg)
+    {
+      /* Code For StmDisj Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar p, A arg)
+    {
+      /* Code For StmPar Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq p, A arg)
+    {
+      /* Code For StmSeq Goes Here */
+
+      p.stm_1.accept(new StmVisitor<R,A>(), arg);
+      p.stm_2.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot p, A arg)
+    {
+      /* Code For StmNot Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst p, A arg)
+    {
+      /* Code For StmPst Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres p, A arg)
+    {
+      /* Code For StmPres Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut p, A arg)
+    {
+      /* Code For StmFut Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher p, A arg)
+    {
+      /* Code For StmInher Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim p, A arg)
+    {
+      /* Code For StmSim Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst p, A arg)
+    {
+      /* Code For StmInst Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp p, A arg)
+    {
+      /* Code For StmProp Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp p, A arg)
+    {
+      /* Code For StmInPp Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp p, A arg)
+    {
+      /* Code For StmOp Goes Here */
+
+      p.term_.accept(new TermVisitor<R,A>(), arg);
+      for (Term x : p.listterm_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm p, A arg)
+    {
+      /* Code For StmTrm Goes Here */
+
+      p.term_.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+
+  }
+  public class TermVisitor<R,A> implements Term.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt p, A arg)
+    {
+      /* Code For TrmExInt Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt p, A arg)
+    {
+      /* Code For TrmInInt Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif p, A arg)
+    {
+      /* Code For TrmExDif Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif p, A arg)
+    {
+      /* Code For TrmInDif Goes Here */
+
+      p.term_1.accept(new TermVisitor<R,A>(), arg);
+      p.term_2.accept(new TermVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg p, A arg)
+    {
+      /* Code For TrmExImg Goes Here */
+
+      p.term_.accept(new TermVisitor<R,A>(), arg);
+      for (Term x : p.listterm_1) {
+      }
+      for (Term x : p.listterm_2) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg p, A arg)
+    {
+      /* Code For TrmInImg Goes Here */
+
+      p.term_.accept(new TermVisitor<R,A>(), arg);
+      for (Term x : p.listterm_1) {
+      }
+      for (Term x : p.listterm_2) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet p, A arg)
+    {
+      /* Code For TrmExSet Goes Here */
+
+      for (Term x : p.listterm_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet p, A arg)
+    {
+      /* Code For TrmInSet Goes Here */
+
+      for (Term x : p.listterm_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd p, A arg)
+    {
+      /* Code For TrmProd Goes Here */
+
+      for (Term x : p.listterm_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit p, A arg)
+    {
+      /* Code For TrmLit Goes Here */
+
+      p.literal_.accept(new LiteralVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm p, A arg)
+    {
+      /* Code For TrmStm Goes Here */
+
+      p.stm_.accept(new StmVisitor<R,A>(), arg);
+
+      return null;
+    }
+
+  }
+  public class URIRefVisitor<R,A> implements URIRef.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul p, A arg)
+    {
+      /* Code For URIFul Goes Here */
+
+      //p.urilit_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur p, A arg)
+    {
+      /* Code For URICur Goes Here */
+
+      p.nsprefix_.accept(new NSPrefixVisitor<R,A>(), arg);
+      //p.ident_;
+
+      return null;
+    }
+
+  }
+  public class LiteralVisitor<R,A> implements Literal.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar p, A arg)
+    {
+      /* Code For LitQVar Goes Here */
+
+      //p.ident_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn p, A arg)
+    {
+      /* Code For LitQVarAn Goes Here */
+
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD p, A arg)
+    {
+      /* Code For LitSVarD Goes Here */
+
+      //p.ident_;
+      for (String x : p.listident_) {
+      }
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI p, A arg)
+    {
+      /* Code For LitSVarI Goes Here */
+
+      //p.ident_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI p, A arg)
+    {
+      /* Code For LitURI Goes Here */
+
+      p.uriref_.accept(new URIRefVisitor<R,A>(), arg);
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt p, A arg)
+    {
+      /* Code For LitInt Goes Here */
+
+      //p.integer_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl p, A arg)
+    {
+      /* Code For LitDbl Goes Here */
+
+      //p.double_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString p, A arg)
+    {
+      /* Code For LitString Goes Here */
+
+      //p.string_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue p, A arg)
+    {
+      /* Code For LitTrue Goes Here */
+
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse p, A arg)
+    {
+      /* Code For LitFalse Goes Here */
+
+
+      return null;
+    }
+
+  }
+  public class NSPrefixVisitor<R,A> implements NSPrefix.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1 p, A arg)
+    {
+      /* Code For NSPrefix1 Goes Here */
+
+      //p.ident_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2 p, A arg)
+    {
+      /* Code For NSPrefix2 Goes Here */
+
+
+      return null;
+    }
+
+  }
+  public class TruthValueVisitor<R,A> implements TruthValue.Visitor<R,A>
+  {
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE p, A arg)
+    {
+      /* Code For TruthE Goes Here */
+
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF p, A arg)
+    {
+      /* Code For TruthF Goes Here */
+
+      //p.double_;
+
+      return null;
+    }
+    public R visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC p, A arg)
+    {
+      /* Code For TruthFC Goes Here */
+
+      //p.double_1;
+      //p.double_2;
+
+      return null;
+    }
+
+  }
+}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex b/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex
new file mode 100644
index 0000000..26b5a5b
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex
@@ -0,0 +1,96 @@
+// This JLex file was machine-generated by the BNF converter
+package com.googlecode.opennars.parser.loan.Loan;
+
+import java_cup.runtime.*;
+%%
+%cup
+%unicode
+%line
+%public
+%{
+  String pstring = new String();
+  public int line_num() { return (yyline+1); }
+  public String buff() { return new String(yy_buffer,yy_buffer_index,10).trim(); }
+%}
+LETTER = ({CAPITAL}|{SMALL})
+CAPITAL = [A-Z\xC0-\xD6\xD8-\xDE]
+SMALL = [a-z\xDF-\xF6\xF8-\xFF]
+DIGIT = [0-9]
+IDENT = ({LETTER}|{DIGIT}|['_])
+%state COMMENT
+%state CHAR
+%state CHARESC
+%state CHAREND
+%state STRING
+%state ESCAPED
+%%
+<YYINITIAL>@base { return new Symbol(sym._SYMB_0); }
+<YYINITIAL>\. { return new Symbol(sym._SYMB_1); }
+<YYINITIAL>@prefix { return new Symbol(sym._SYMB_2); }
+<YYINITIAL>@import { return new Symbol(sym._SYMB_3); }
+<YYINITIAL>@delay { return new Symbol(sym._SYMB_4); }
+<YYINITIAL>@operator { return new Symbol(sym._SYMB_5); }
+<YYINITIAL>\? { return new Symbol(sym._SYMB_6); }
+<YYINITIAL>! { return new Symbol(sym._SYMB_7); }
+<YYINITIAL>==> { return new Symbol(sym._SYMB_8); }
+<YYINITIAL><=> { return new Symbol(sym._SYMB_9); }
+<YYINITIAL>=/> { return new Symbol(sym._SYMB_10); }
+<YYINITIAL>=\\> { return new Symbol(sym._SYMB_11); }
+<YYINITIAL>=\|> { return new Symbol(sym._SYMB_12); }
+<YYINITIAL></> { return new Symbol(sym._SYMB_13); }
+<YYINITIAL><\|> { return new Symbol(sym._SYMB_14); }
+<YYINITIAL>&& { return new Symbol(sym._SYMB_15); }
+<YYINITIAL>\|\| { return new Symbol(sym._SYMB_16); }
+<YYINITIAL>; { return new Symbol(sym._SYMB_17); }
+<YYINITIAL>, { return new Symbol(sym._SYMB_18); }
+<YYINITIAL>--> { return new Symbol(sym._SYMB_19); }
+<YYINITIAL><-> { return new Symbol(sym._SYMB_20); }
+<YYINITIAL>\}-> { return new Symbol(sym._SYMB_21); }
+<YYINITIAL>--\[ { return new Symbol(sym._SYMB_22); }
+<YYINITIAL>\}-\[ { return new Symbol(sym._SYMB_23); }
+<YYINITIAL>\( { return new Symbol(sym._SYMB_24); }
+<YYINITIAL>\) { return new Symbol(sym._SYMB_25); }
+<YYINITIAL>& { return new Symbol(sym._SYMB_26); }
+<YYINITIAL>\| { return new Symbol(sym._SYMB_27); }
+<YYINITIAL>- { return new Symbol(sym._SYMB_28); }
+<YYINITIAL>~ { return new Symbol(sym._SYMB_29); }
+<YYINITIAL>_\|_ { return new Symbol(sym._SYMB_30); }
+<YYINITIAL>\{ { return new Symbol(sym._SYMB_31); }
+<YYINITIAL>\} { return new Symbol(sym._SYMB_32); }
+<YYINITIAL>\[ { return new Symbol(sym._SYMB_33); }
+<YYINITIAL>\] { return new Symbol(sym._SYMB_34); }
+<YYINITIAL># { return new Symbol(sym._SYMB_35); }
+<YYINITIAL>: { return new Symbol(sym._SYMB_36); }
+<YYINITIAL>% { return new Symbol(sym._SYMB_37); }
+<YYINITIAL>extension { return new Symbol(sym._SYMB_38); }
+<YYINITIAL>false { return new Symbol(sym._SYMB_39); }
+<YYINITIAL>future { return new Symbol(sym._SYMB_40); }
+<YYINITIAL>intension { return new Symbol(sym._SYMB_41); }
+<YYINITIAL>not { return new Symbol(sym._SYMB_42); }
+<YYINITIAL>past { return new Symbol(sym._SYMB_43); }
+<YYINITIAL>present { return new Symbol(sym._SYMB_44); }
+<YYINITIAL>true { return new Symbol(sym._SYMB_45); }
+<YYINITIAL>"//"[^\n]*\n { /* BNFC single-line comment */ }
+<YYINITIAL>"/*" { yybegin(COMMENT); }
+<COMMENT>"*/" { yybegin(YYINITIAL); }
+<COMMENT>. { }
+<COMMENT>[\n] { }
+
+
+<YYINITIAL><[^<>\"\{\}\|\\`]*> { return new Symbol(sym.URILit, yytext().intern()); }
+
+<YYINITIAL>"\"" { yybegin(STRING); }
+<STRING>\\ { yybegin(ESCAPED); }
+<STRING>\" { String foo = pstring; pstring = new String(); yybegin(YYINITIAL); return new Symbol(sym._STRING_, foo.intern()); }
+<STRING>.  { pstring += yytext(); }
+<ESCAPED>n { pstring +=  "\n"; yybegin(STRING); }
+<ESCAPED>\" { pstring += "\""; yybegin(STRING); }
+<ESCAPED>\\ { pstring += "\\"; yybegin(STRING); }
+<ESCAPED>t  { pstring += "\t"; yybegin(STRING); }
+<ESCAPED>.  { pstring += yytext(); yybegin(STRING); }
+
+
+<YYINITIAL>{DIGIT}+"."{DIGIT}+("e"(\-)?{DIGIT}+)? { return new Symbol(sym._DOUBLE_, new Double(yytext())); }
+<YYINITIAL>{DIGIT}+ { return new Symbol(sym._INTEGER_, new Integer(yytext())); }
+<YYINITIAL>{LETTER}{IDENT}* { return new Symbol(sym._IDENT_, yytext().intern()); }
+<YYINITIAL>[ \t\r\n\f] { /* ignore white space. */ }
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex.java
new file mode 100644
index 0000000..bc6b050
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/Yylex.java
@@ -0,0 +1,915 @@
+// This JLex file was machine-generated by the BNF converter
+package com.googlecode.opennars.parser.loan.Loan;
+import java_cup.runtime.*;
+
+
+public class Yylex implements java_cup.runtime.Scanner {
+	private final int YY_BUFFER_SIZE = 512;
+	private final int YY_F = -1;
+	private final int YY_NO_STATE = -1;
+	private final int YY_NOT_ACCEPT = 0;
+	private final int YY_START = 1;
+	private final int YY_END = 2;
+	private final int YY_NO_ANCHOR = 4;
+	private final int YY_BOL = 65536;
+	private final int YY_EOF = 65537;
+
+  String pstring = new String();
+  public int line_num() { return (yyline+1); }
+  public String buff() { return new String(yy_buffer,yy_buffer_index,10).trim(); }
+	private java.io.BufferedReader yy_reader;
+	private int yy_buffer_index;
+	private int yy_buffer_read;
+	private int yy_buffer_start;
+	private int yy_buffer_end;
+	private char yy_buffer[];
+	private int yyline;
+	private boolean yy_at_bol;
+	private int yy_lexical_state;
+
+	public Yylex (java.io.Reader reader) {
+		this ();
+		if (null == reader) {
+			throw (new Error("Error: Bad input stream initializer."));
+		}
+		yy_reader = new java.io.BufferedReader(reader);
+	}
+
+	public Yylex (java.io.InputStream instream) {
+		this ();
+		if (null == instream) {
+			throw (new Error("Error: Bad input stream initializer."));
+		}
+		yy_reader = new java.io.BufferedReader(new java.io.InputStreamReader(instream));
+	}
+
+	private Yylex () {
+		yy_buffer = new char[YY_BUFFER_SIZE];
+		yy_buffer_read = 0;
+		yy_buffer_index = 0;
+		yy_buffer_start = 0;
+		yy_buffer_end = 0;
+		yyline = 0;
+		yy_at_bol = true;
+		yy_lexical_state = YYINITIAL;
+	}
+
+	private boolean yy_eof_done = false;
+	private final int STRING = 5;
+	private final int ESCAPED = 6;
+	private final int YYINITIAL = 0;
+	private final int COMMENT = 1;
+	private final int CHAREND = 4;
+	private final int CHARESC = 3;
+	private final int CHAR = 2;
+	private final int yy_state_dtrans[] = {
+		0,
+		117,
+		118,
+		118,
+		118,
+		119,
+		120
+	};
+	private void yybegin (int state) {
+		yy_lexical_state = state;
+	}
+	private int yy_advance ()
+		throws java.io.IOException {
+		int next_read;
+		int i;
+		int j;
+
+		if (yy_buffer_index < yy_buffer_read) {
+			return yy_buffer[yy_buffer_index++];
+		}
+
+		if (0 != yy_buffer_start) {
+			i = yy_buffer_start;
+			j = 0;
+			while (i < yy_buffer_read) {
+				yy_buffer[j] = yy_buffer[i];
+				++i;
+				++j;
+			}
+			yy_buffer_end = yy_buffer_end - yy_buffer_start;
+			yy_buffer_start = 0;
+			yy_buffer_read = j;
+			yy_buffer_index = j;
+			next_read = yy_reader.read(yy_buffer,
+					yy_buffer_read,
+					yy_buffer.length - yy_buffer_read);
+			if (-1 == next_read) {
+				return YY_EOF;
+			}
+			yy_buffer_read = yy_buffer_read + next_read;
+		}
+
+		while (yy_buffer_index >= yy_buffer_read) {
+			if (yy_buffer_index >= yy_buffer.length) {
+				yy_buffer = yy_double(yy_buffer);
+			}
+			next_read = yy_reader.read(yy_buffer,
+					yy_buffer_read,
+					yy_buffer.length - yy_buffer_read);
+			if (-1 == next_read) {
+				return YY_EOF;
+			}
+			yy_buffer_read = yy_buffer_read + next_read;
+		}
+		return yy_buffer[yy_buffer_index++];
+	}
+	private void yy_move_end () {
+		if (yy_buffer_end > yy_buffer_start &&
+		    '\n' == yy_buffer[yy_buffer_end-1])
+			yy_buffer_end--;
+		if (yy_buffer_end > yy_buffer_start &&
+		    '\r' == yy_buffer[yy_buffer_end-1])
+			yy_buffer_end--;
+	}
+	private boolean yy_last_was_cr=false;
+	private void yy_mark_start () {
+		int i;
+		for (i = yy_buffer_start; i < yy_buffer_index; ++i) {
+			if ('\n' == yy_buffer[i] && !yy_last_was_cr) {
+				++yyline;
+			}
+			if ('\r' == yy_buffer[i]) {
+				++yyline;
+				yy_last_was_cr=true;
+			} else yy_last_was_cr=false;
+		}
+		yy_buffer_start = yy_buffer_index;
+	}
+	private void yy_mark_end () {
+		yy_buffer_end = yy_buffer_index;
+	}
+	private void yy_to_mark () {
+		yy_buffer_index = yy_buffer_end;
+		yy_at_bol = (yy_buffer_end > yy_buffer_start) &&
+		            ('\r' == yy_buffer[yy_buffer_end-1] ||
+		             '\n' == yy_buffer[yy_buffer_end-1] ||
+		             2028/*LS*/ == yy_buffer[yy_buffer_end-1] ||
+		             2029/*PS*/ == yy_buffer[yy_buffer_end-1]);
+	}
+	private java.lang.String yytext () {
+		return (new java.lang.String(yy_buffer,
+			yy_buffer_start,
+			yy_buffer_end - yy_buffer_start));
+	}
+	private int yylength () {
+		return yy_buffer_end - yy_buffer_start;
+	}
+	private char[] yy_double (char buf[]) {
+		int i;
+		char newbuf[];
+		newbuf = new char[2*buf.length];
+		for (i = 0; i < buf.length; ++i) {
+			newbuf[i] = buf[i];
+		}
+		return newbuf;
+	}
+	private final int YY_E_INTERNAL = 0;
+	private final int YY_E_MATCH = 1;
+	private java.lang.String yy_error_string[] = {
+		"Error: Internal error.\n",
+		"Error: Unmatched input.\n"
+	};
+	private void yy_error (int code,boolean fatal) {
+		java.lang.System.out.print(yy_error_string[code]);
+		java.lang.System.out.flush();
+		if (fatal) {
+			throw new Error("Fatal Error.\n");
+		}
+	}
+	private int[][] unpackFromString(int size1, int size2, String st) {
+		int colonIndex = -1;
+		String lengthString;
+		int sequenceLength = 0;
+		int sequenceInteger = 0;
+
+		int commaIndex;
+		String workString;
+
+		int res[][] = new int[size1][size2];
+		for (int i= 0; i < size1; i++) {
+			for (int j= 0; j < size2; j++) {
+				if (sequenceLength != 0) {
+					res[i][j] = sequenceInteger;
+					sequenceLength--;
+					continue;
+				}
+				commaIndex = st.indexOf(',');
+				workString = (commaIndex==-1) ? st :
+					st.substring(0, commaIndex);
+				st = st.substring(commaIndex+1);
+				colonIndex = workString.indexOf(':');
+				if (colonIndex == -1) {
+					res[i][j]=Integer.parseInt(workString);
+					continue;
+				}
+				lengthString =
+					workString.substring(colonIndex+1);
+				sequenceLength=Integer.parseInt(lengthString);
+				workString=workString.substring(0,colonIndex);
+				sequenceInteger=Integer.parseInt(workString);
+				res[i][j] = sequenceInteger;
+				sequenceLength--;
+			}
+		}
+		return res;
+	}
+	private int yy_acpt[] = {
+		/* 0 */ YY_NOT_ACCEPT,
+		/* 1 */ YY_NO_ANCHOR,
+		/* 2 */ YY_NO_ANCHOR,
+		/* 3 */ YY_NO_ANCHOR,
+		/* 4 */ YY_NO_ANCHOR,
+		/* 5 */ YY_NO_ANCHOR,
+		/* 6 */ YY_NO_ANCHOR,
+		/* 7 */ YY_NO_ANCHOR,
+		/* 8 */ YY_NO_ANCHOR,
+		/* 9 */ YY_NO_ANCHOR,
+		/* 10 */ YY_NO_ANCHOR,
+		/* 11 */ YY_NO_ANCHOR,
+		/* 12 */ YY_NO_ANCHOR,
+		/* 13 */ YY_NO_ANCHOR,
+		/* 14 */ YY_NO_ANCHOR,
+		/* 15 */ YY_NO_ANCHOR,
+		/* 16 */ YY_NO_ANCHOR,
+		/* 17 */ YY_NO_ANCHOR,
+		/* 18 */ YY_NO_ANCHOR,
+		/* 19 */ YY_NO_ANCHOR,
+		/* 20 */ YY_NO_ANCHOR,
+		/* 21 */ YY_NO_ANCHOR,
+		/* 22 */ YY_NO_ANCHOR,
+		/* 23 */ YY_NO_ANCHOR,
+		/* 24 */ YY_NO_ANCHOR,
+		/* 25 */ YY_NO_ANCHOR,
+		/* 26 */ YY_NO_ANCHOR,
+		/* 27 */ YY_NO_ANCHOR,
+		/* 28 */ YY_NO_ANCHOR,
+		/* 29 */ YY_NO_ANCHOR,
+		/* 30 */ YY_NO_ANCHOR,
+		/* 31 */ YY_NO_ANCHOR,
+		/* 32 */ YY_NO_ANCHOR,
+		/* 33 */ YY_NO_ANCHOR,
+		/* 34 */ YY_NO_ANCHOR,
+		/* 35 */ YY_NO_ANCHOR,
+		/* 36 */ YY_NO_ANCHOR,
+		/* 37 */ YY_NO_ANCHOR,
+		/* 38 */ YY_NO_ANCHOR,
+		/* 39 */ YY_NO_ANCHOR,
+		/* 40 */ YY_NO_ANCHOR,
+		/* 41 */ YY_NO_ANCHOR,
+		/* 42 */ YY_NO_ANCHOR,
+		/* 43 */ YY_NO_ANCHOR,
+		/* 44 */ YY_NO_ANCHOR,
+		/* 45 */ YY_NO_ANCHOR,
+		/* 46 */ YY_NO_ANCHOR,
+		/* 47 */ YY_NO_ANCHOR,
+		/* 48 */ YY_NO_ANCHOR,
+		/* 49 */ YY_NO_ANCHOR,
+		/* 50 */ YY_NO_ANCHOR,
+		/* 51 */ YY_NO_ANCHOR,
+		/* 52 */ YY_NO_ANCHOR,
+		/* 53 */ YY_NO_ANCHOR,
+		/* 54 */ YY_NO_ANCHOR,
+		/* 55 */ YY_NO_ANCHOR,
+		/* 56 */ YY_NO_ANCHOR,
+		/* 57 */ YY_NO_ANCHOR,
+		/* 58 */ YY_NO_ANCHOR,
+		/* 59 */ YY_NO_ANCHOR,
+		/* 60 */ YY_NO_ANCHOR,
+		/* 61 */ YY_NO_ANCHOR,
+		/* 62 */ YY_NO_ANCHOR,
+		/* 63 */ YY_NO_ANCHOR,
+		/* 64 */ YY_NO_ANCHOR,
+		/* 65 */ YY_NO_ANCHOR,
+		/* 66 */ YY_NO_ANCHOR,
+		/* 67 */ YY_NOT_ACCEPT,
+		/* 68 */ YY_NO_ANCHOR,
+		/* 69 */ YY_NO_ANCHOR,
+		/* 70 */ YY_NO_ANCHOR,
+		/* 71 */ YY_NOT_ACCEPT,
+		/* 72 */ YY_NO_ANCHOR,
+		/* 73 */ YY_NOT_ACCEPT,
+		/* 74 */ YY_NO_ANCHOR,
+		/* 75 */ YY_NOT_ACCEPT,
+		/* 76 */ YY_NO_ANCHOR,
+		/* 77 */ YY_NOT_ACCEPT,
+		/* 78 */ YY_NO_ANCHOR,
+		/* 79 */ YY_NOT_ACCEPT,
+		/* 80 */ YY_NO_ANCHOR,
+		/* 81 */ YY_NOT_ACCEPT,
+		/* 82 */ YY_NO_ANCHOR,
+		/* 83 */ YY_NOT_ACCEPT,
+		/* 84 */ YY_NO_ANCHOR,
+		/* 85 */ YY_NOT_ACCEPT,
+		/* 86 */ YY_NOT_ACCEPT,
+		/* 87 */ YY_NOT_ACCEPT,
+		/* 88 */ YY_NOT_ACCEPT,
+		/* 89 */ YY_NOT_ACCEPT,
+		/* 90 */ YY_NOT_ACCEPT,
+		/* 91 */ YY_NOT_ACCEPT,
+		/* 92 */ YY_NOT_ACCEPT,
+		/* 93 */ YY_NOT_ACCEPT,
+		/* 94 */ YY_NOT_ACCEPT,
+		/* 95 */ YY_NOT_ACCEPT,
+		/* 96 */ YY_NOT_ACCEPT,
+		/* 97 */ YY_NOT_ACCEPT,
+		/* 98 */ YY_NOT_ACCEPT,
+		/* 99 */ YY_NOT_ACCEPT,
+		/* 100 */ YY_NOT_ACCEPT,
+		/* 101 */ YY_NOT_ACCEPT,
+		/* 102 */ YY_NOT_ACCEPT,
+		/* 103 */ YY_NOT_ACCEPT,
+		/* 104 */ YY_NOT_ACCEPT,
+		/* 105 */ YY_NOT_ACCEPT,
+		/* 106 */ YY_NOT_ACCEPT,
+		/* 107 */ YY_NOT_ACCEPT,
+		/* 108 */ YY_NOT_ACCEPT,
+		/* 109 */ YY_NOT_ACCEPT,
+		/* 110 */ YY_NOT_ACCEPT,
+		/* 111 */ YY_NOT_ACCEPT,
+		/* 112 */ YY_NOT_ACCEPT,
+		/* 113 */ YY_NOT_ACCEPT,
+		/* 114 */ YY_NOT_ACCEPT,
+		/* 115 */ YY_NOT_ACCEPT,
+		/* 116 */ YY_NOT_ACCEPT,
+		/* 117 */ YY_NOT_ACCEPT,
+		/* 118 */ YY_NOT_ACCEPT,
+		/* 119 */ YY_NOT_ACCEPT,
+		/* 120 */ YY_NOT_ACCEPT,
+		/* 121 */ YY_NO_ANCHOR,
+		/* 122 */ YY_NOT_ACCEPT,
+		/* 123 */ YY_NOT_ACCEPT,
+		/* 124 */ YY_NOT_ACCEPT,
+		/* 125 */ YY_NOT_ACCEPT,
+		/* 126 */ YY_NO_ANCHOR,
+		/* 127 */ YY_NOT_ACCEPT,
+		/* 128 */ YY_NO_ANCHOR,
+		/* 129 */ YY_NO_ANCHOR,
+		/* 130 */ YY_NO_ANCHOR,
+		/* 131 */ YY_NO_ANCHOR,
+		/* 132 */ YY_NO_ANCHOR,
+		/* 133 */ YY_NO_ANCHOR,
+		/* 134 */ YY_NO_ANCHOR,
+		/* 135 */ YY_NO_ANCHOR,
+		/* 136 */ YY_NO_ANCHOR,
+		/* 137 */ YY_NO_ANCHOR,
+		/* 138 */ YY_NO_ANCHOR,
+		/* 139 */ YY_NO_ANCHOR,
+		/* 140 */ YY_NO_ANCHOR,
+		/* 141 */ YY_NO_ANCHOR,
+		/* 142 */ YY_NO_ANCHOR,
+		/* 143 */ YY_NO_ANCHOR,
+		/* 144 */ YY_NO_ANCHOR,
+		/* 145 */ YY_NO_ANCHOR,
+		/* 146 */ YY_NO_ANCHOR,
+		/* 147 */ YY_NO_ANCHOR,
+		/* 148 */ YY_NO_ANCHOR,
+		/* 149 */ YY_NO_ANCHOR,
+		/* 150 */ YY_NO_ANCHOR,
+		/* 151 */ YY_NO_ANCHOR,
+		/* 152 */ YY_NO_ANCHOR,
+		/* 153 */ YY_NO_ANCHOR,
+		/* 154 */ YY_NO_ANCHOR
+	};
+	private int yy_cmap[] = unpackFromString(1,65538,
+"47:9,52,44,47,52,43,47:18,52,19,48,38,47,40,26,51,32,33,45,47,28,29,6,23,49" +
+":10,39,27,22,20,21,18,1,50:26,31,24,37,47,35,46,3,2,50,15,5,9,50:2,10,50:2," +
+"16,12,41,13,7,50,8,4,14,42,50:2,11,17,50,36,25,30,34,47:65,50:23,47,50:31,4" +
+"7,50:8,47:65280,0:2")[0];
+
+	private int yy_rmap[] = unpackFromString(1,155,
+"0,1,2,1:3,3,4,1:2,5,6,1:11,7,1:18,2,8,2:2,1,2,1,2,1:2,2,1,2:2,1:11,9,10,11," +
+"12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36," +
+"37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,11,53,54,55,56,57,58,59,60," +
+"61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85," +
+"86,87,88,89,90,91,92,93,94,95")[0];
+
+	private int yy_nxt[][] = unpackFromString(96,53,
+"1,67,2:3,153,3,134,2,141,154,2:3,135,2:3,4,5,71,-1,73,75,-1,6,7,8,9,10,11,1" +
+"2,13,14,15,77,16,17,18,19,20,121,2,21:2,-1:3,22,23,2,-1,21,-1:55,2:4,-1,2:1" +
+"1,-1:17,2,-1:5,2:2,-1:6,2:3,-1:26,26,-1:53,27,-1:55,97,-1:52,98,-1:29,100,-" +
+"1:42,23,-1:8,108,-1:43,43,-1:5,79,-1:4,81,-1:2,83,-1:2,85,-1,86,-1:39,2:4,-" +
+"1,2:7,42,2:3,-1:17,2,-1:5,2:2,-1:6,2:3,-1:50,69,-1:26,58,-1:49,87,-1:2,88,8" +
+"9,90,-1:29,2:4,-1,2:7,44,2:3,-1:17,2,-1:5,2:2,-1:6,2:3,-1:2,91:19,92,24,-1," +
+"93,-1,94,91:3,95,-1,91:5,-1,91:9,-1,91,-1,91:4,-1:2,2:3,45,-1,2:11,-1:17,2," +
+"-1:5,2:2,-1:6,2:3,-1:24,96,-1:21,25,-1:9,2:3,47,-1,2:11,-1:17,2,-1:5,2:2,-1" +
+":6,2:3,-1:26,99,-1:29,2:3,49,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:4,101,-1:" +
+"51,2:4,-1,2:7,52,2:3,-1:17,2,-1:5,2:2,-1:6,2:3,-1:9,123,-1:46,2:4,-1,2:11,-" +
+"1:17,2,-1:5,54,2,-1:6,2:3,-1:13,122,-1:42,2:4,-1,2:11,-1:17,2,-1:5,55,2,-1:" +
+"6,2:3,-1:8,127,-1:50,102,-1:68,28,-1:52,29,-1:52,30,-1:52,31,-1:32,91:20,24" +
+",-1,91,-1:2,91:4,-1,91:5,-1,91:9,-1,91,-1,91:4,-1,91:20,32,-1,91,-1:2,91:4," +
+"-1,91:5,-1,91:9,-1,91,-1,91:4,-1,91:20,33,-1,91,-1:2,91:4,-1,91:5,-1,91:9,-" +
+"1,91,-1,91:4,-1:21,34,-1:32,91:20,35,-1,91,-1:2,91:4,-1,91:5,-1,91:9,-1,91," +
+"-1,91:4,-1,96:43,36,96:8,-1:21,37,-1:9,38,-1:42,39,-1:9,40,-1:56,41,-1:66,4" +
+"3,-1:7,103,-1:64,107,-1:41,46,-1:56,109,-1:56,124,-1:47,125,-1:47,110,-1:78" +
+",111,-1:19,69,-1:13,112,-1:59,48,-1:46,50,-1:55,51,-1:52,115,-1:51,116,-1:4" +
+"7,53,-1:44,1,56:42,-1,57,70,56:7,1,-1:52,1,59:23,60,59:18,-1:2,59:3,61,59:4" +
+",1,62:13,63,62:9,64,62:16,65,62,-1:2,62:3,66,62:4,-1:2,2:4,-1,2:6,68,2:4,-1" +
+":17,2,-1:5,2:2,-1:6,2:3,-1:8,105,-1:50,104,-1:55,113,-1:47,114,-1:51,2:2,72" +
+",2,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:6,106,-1:49,2:4,-1,2:11,-1:17,2,-1:" +
+"5,2,74,-1:6,2:3,-1:3,2:2,76,2,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1" +
+",2,78,2:9,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:11,-1:17,2,-1:5,80,2,-1:6" +
+",2:3,-1:3,2:4,-1,2:6,82,2:4,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:6,84,2:" +
+"4,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2,126,2:2,-1,2,146,2:9,-1:17,2,-1:5,2:2,-1" +
+":6,2:3,-1:3,2:4,-1,2,128,2:9,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:9,129," +
+"2,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:11,-1:17,2,-1:5,2,130,-1:6,2:3,-1" +
+":3,2:3,131,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:3,132,2:7,-1:17," +
+"2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:3,133,2:7,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3," +
+"2,136,2:2,-1,2:11,-1:17,2,-1:5,2,142,-1:6,2:3,-1:3,2:4,-1,2:7,137,2:3,-1:17" +
+",2,-1:5,2:2,-1:6,2:3,-1:3,2:2,138,2,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3," +
+"2:2,139,2,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:2,140,2,-1,2:11,-1:17,2," +
+"-1:5,2:2,-1:6,2:3,-1:3,2:3,143,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-" +
+"1,2:11,-1:17,2,-1:5,144,2,-1:6,2:3,-1:3,2:4,-1,2:11,-1:17,2,-1:5,145,2,-1:6" +
+",2:3,-1:3,2:3,147,-1,2:11,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:3,148,-1,2:11,-1" +
+":17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:7,149,2:3,-1:17,2,-1:5,2:2,-1:6,2:3,-" +
+"1:3,2:4,-1,2:7,150,2:3,-1:17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:4,151,2:6,-1" +
+":17,2,-1:5,2:2,-1:6,2:3,-1:3,2:4,-1,2:11,-1:17,2,-1:5,152,2,-1:6,2:3,-1");
+
+	public java_cup.runtime.Symbol next_token ()
+		throws java.io.IOException {
+		int yy_lookahead;
+		int yy_anchor = YY_NO_ANCHOR;
+		int yy_state = yy_state_dtrans[yy_lexical_state];
+		int yy_next_state = YY_NO_STATE;
+		int yy_last_accept_state = YY_NO_STATE;
+		boolean yy_initial = true;
+		int yy_this_accept;
+
+		yy_mark_start();
+		yy_this_accept = yy_acpt[yy_state];
+		if (YY_NOT_ACCEPT != yy_this_accept) {
+			yy_last_accept_state = yy_state;
+			yy_mark_end();
+		}
+		while (true) {
+			if (yy_initial && yy_at_bol) yy_lookahead = YY_BOL;
+			else yy_lookahead = yy_advance();
+			yy_next_state = YY_F;
+			yy_next_state = yy_nxt[yy_rmap[yy_state]][yy_cmap[yy_lookahead]];
+			if (YY_EOF == yy_lookahead && true == yy_initial) {
+				return null;
+			}
+			if (YY_F != yy_next_state) {
+				yy_state = yy_next_state;
+				yy_initial = false;
+				yy_this_accept = yy_acpt[yy_state];
+				if (YY_NOT_ACCEPT != yy_this_accept) {
+					yy_last_accept_state = yy_state;
+					yy_mark_end();
+				}
+			}
+			else {
+				if (YY_NO_STATE == yy_last_accept_state) {
+					throw (new Error("Lexical Error: Unmatched Input."));
+				}
+				else {
+					yy_anchor = yy_acpt[yy_last_accept_state];
+					if (0 != (YY_END & yy_anchor)) {
+						yy_move_end();
+					}
+					yy_to_mark();
+					switch (yy_last_accept_state) {
+					case 1:
+						
+					case -2:
+						break;
+					case 2:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -3:
+						break;
+					case 3:
+						{ return new Symbol(sym._SYMB_1); }
+					case -4:
+						break;
+					case 4:
+						{ return new Symbol(sym._SYMB_6); }
+					case -5:
+						break;
+					case 5:
+						{ return new Symbol(sym._SYMB_7); }
+					case -6:
+						break;
+					case 6:
+						{ return new Symbol(sym._SYMB_27); }
+					case -7:
+						break;
+					case 7:
+						{ return new Symbol(sym._SYMB_26); }
+					case -8:
+						break;
+					case 8:
+						{ return new Symbol(sym._SYMB_17); }
+					case -9:
+						break;
+					case 9:
+						{ return new Symbol(sym._SYMB_18); }
+					case -10:
+						break;
+					case 10:
+						{ return new Symbol(sym._SYMB_28); }
+					case -11:
+						break;
+					case 11:
+						{ return new Symbol(sym._SYMB_32); }
+					case -12:
+						break;
+					case 12:
+						{ return new Symbol(sym._SYMB_33); }
+					case -13:
+						break;
+					case 13:
+						{ return new Symbol(sym._SYMB_24); }
+					case -14:
+						break;
+					case 14:
+						{ return new Symbol(sym._SYMB_25); }
+					case -15:
+						break;
+					case 15:
+						{ return new Symbol(sym._SYMB_29); }
+					case -16:
+						break;
+					case 16:
+						{ return new Symbol(sym._SYMB_31); }
+					case -17:
+						break;
+					case 17:
+						{ return new Symbol(sym._SYMB_34); }
+					case -18:
+						break;
+					case 18:
+						{ return new Symbol(sym._SYMB_35); }
+					case -19:
+						break;
+					case 19:
+						{ return new Symbol(sym._SYMB_36); }
+					case -20:
+						break;
+					case 20:
+						{ return new Symbol(sym._SYMB_37); }
+					case -21:
+						break;
+					case 21:
+						{ /* ignore white space. */ }
+					case -22:
+						break;
+					case 22:
+						{ yybegin(STRING); }
+					case -23:
+						break;
+					case 23:
+						{ return new Symbol(sym._INTEGER_, new Integer(yytext())); }
+					case -24:
+						break;
+					case 24:
+						{ return new Symbol(sym.URILit, yytext().intern()); }
+					case -25:
+						break;
+					case 25:
+						{ yybegin(COMMENT); }
+					case -26:
+						break;
+					case 26:
+						{ return new Symbol(sym._SYMB_16); }
+					case -27:
+						break;
+					case 27:
+						{ return new Symbol(sym._SYMB_15); }
+					case -28:
+						break;
+					case 28:
+						{ return new Symbol(sym._SYMB_8); }
+					case -29:
+						break;
+					case 29:
+						{ return new Symbol(sym._SYMB_10); }
+					case -30:
+						break;
+					case 30:
+						{ return new Symbol(sym._SYMB_11); }
+					case -31:
+						break;
+					case 31:
+						{ return new Symbol(sym._SYMB_12); }
+					case -32:
+						break;
+					case 32:
+						{ return new Symbol(sym._SYMB_9); }
+					case -33:
+						break;
+					case 33:
+						{ return new Symbol(sym._SYMB_13); }
+					case -34:
+						break;
+					case 34:
+						{ return new Symbol(sym._SYMB_14); }
+					case -35:
+						break;
+					case 35:
+						{ return new Symbol(sym._SYMB_20); }
+					case -36:
+						break;
+					case 36:
+						{ /* BNFC single-line comment */ }
+					case -37:
+						break;
+					case 37:
+						{ return new Symbol(sym._SYMB_19); }
+					case -38:
+						break;
+					case 38:
+						{ return new Symbol(sym._SYMB_22); }
+					case -39:
+						break;
+					case 39:
+						{ return new Symbol(sym._SYMB_21); }
+					case -40:
+						break;
+					case 40:
+						{ return new Symbol(sym._SYMB_23); }
+					case -41:
+						break;
+					case 41:
+						{ return new Symbol(sym._SYMB_30); }
+					case -42:
+						break;
+					case 42:
+						{ return new Symbol(sym._SYMB_42); }
+					case -43:
+						break;
+					case 43:
+						{ return new Symbol(sym._DOUBLE_, new Double(yytext())); }
+					case -44:
+						break;
+					case 44:
+						{ return new Symbol(sym._SYMB_43); }
+					case -45:
+						break;
+					case 45:
+						{ return new Symbol(sym._SYMB_45); }
+					case -46:
+						break;
+					case 46:
+						{ return new Symbol(sym._SYMB_0); }
+					case -47:
+						break;
+					case 47:
+						{ return new Symbol(sym._SYMB_39); }
+					case -48:
+						break;
+					case 48:
+						{ return new Symbol(sym._SYMB_4); }
+					case -49:
+						break;
+					case 49:
+						{ return new Symbol(sym._SYMB_40); }
+					case -50:
+						break;
+					case 50:
+						{ return new Symbol(sym._SYMB_2); }
+					case -51:
+						break;
+					case 51:
+						{ return new Symbol(sym._SYMB_3); }
+					case -52:
+						break;
+					case 52:
+						{ return new Symbol(sym._SYMB_44); }
+					case -53:
+						break;
+					case 53:
+						{ return new Symbol(sym._SYMB_5); }
+					case -54:
+						break;
+					case 54:
+						{ return new Symbol(sym._SYMB_38); }
+					case -55:
+						break;
+					case 55:
+						{ return new Symbol(sym._SYMB_41); }
+					case -56:
+						break;
+					case 56:
+						{ }
+					case -57:
+						break;
+					case 57:
+						{ }
+					case -58:
+						break;
+					case 58:
+						{ yybegin(YYINITIAL); }
+					case -59:
+						break;
+					case 59:
+						{ pstring += yytext(); }
+					case -60:
+						break;
+					case 60:
+						{ yybegin(ESCAPED); }
+					case -61:
+						break;
+					case 61:
+						{ String foo = pstring; pstring = new String(); yybegin(YYINITIAL); return new Symbol(sym._STRING_, foo.intern()); }
+					case -62:
+						break;
+					case 62:
+						{ pstring += yytext(); yybegin(STRING); }
+					case -63:
+						break;
+					case 63:
+						{ pstring += "\t"; yybegin(STRING); }
+					case -64:
+						break;
+					case 64:
+						{ pstring += "\\"; yybegin(STRING); }
+					case -65:
+						break;
+					case 65:
+						{ pstring +=  "\n"; yybegin(STRING); }
+					case -66:
+						break;
+					case 66:
+						{ pstring += "\""; yybegin(STRING); }
+					case -67:
+						break;
+					case 68:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -68:
+						break;
+					case 69:
+						{ return new Symbol(sym._DOUBLE_, new Double(yytext())); }
+					case -69:
+						break;
+					case 70:
+						{ }
+					case -70:
+						break;
+					case 72:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -71:
+						break;
+					case 74:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -72:
+						break;
+					case 76:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -73:
+						break;
+					case 78:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -74:
+						break;
+					case 80:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -75:
+						break;
+					case 82:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -76:
+						break;
+					case 84:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -77:
+						break;
+					case 121:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -78:
+						break;
+					case 126:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -79:
+						break;
+					case 128:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -80:
+						break;
+					case 129:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -81:
+						break;
+					case 130:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -82:
+						break;
+					case 131:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -83:
+						break;
+					case 132:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -84:
+						break;
+					case 133:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -85:
+						break;
+					case 134:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -86:
+						break;
+					case 135:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -87:
+						break;
+					case 136:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -88:
+						break;
+					case 137:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -89:
+						break;
+					case 138:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -90:
+						break;
+					case 139:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -91:
+						break;
+					case 140:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -92:
+						break;
+					case 141:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -93:
+						break;
+					case 142:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -94:
+						break;
+					case 143:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -95:
+						break;
+					case 144:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -96:
+						break;
+					case 145:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -97:
+						break;
+					case 146:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -98:
+						break;
+					case 147:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -99:
+						break;
+					case 148:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -100:
+						break;
+					case 149:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -101:
+						break;
+					case 150:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -102:
+						break;
+					case 151:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -103:
+						break;
+					case 152:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -104:
+						break;
+					case 153:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -105:
+						break;
+					case 154:
+						{ return new Symbol(sym._IDENT_, yytext().intern()); }
+					case -106:
+						break;
+					default:
+						yy_error(YY_E_INTERNAL,false);
+					case -1:
+					}
+					yy_initial = true;
+					yy_state = yy_state_dtrans[yy_lexical_state];
+					yy_next_state = YY_NO_STATE;
+					yy_last_accept_state = YY_NO_STATE;
+					yy_mark_start();
+					yy_this_accept = yy_acpt[yy_state];
+					if (YY_NOT_ACCEPT != yy_this_accept) {
+						yy_last_accept_state = yy_state;
+						yy_mark_end();
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/parser.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/parser.java
new file mode 100644
index 0000000..961061d
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/parser.java
@@ -0,0 +1,1433 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Fri Apr 04 05:03:03 BST 2008
+//----------------------------------------------------
+
+package com.googlecode.opennars.parser.loan.Loan;
+
+
+/** CUP v0.10k generated parser.
+  * @version Fri Apr 04 05:03:03 BST 2008
+  */
+public class parser extends java_cup.runtime.lr_parser {
+
+  /** Default constructor. */
+  public parser() {super();}
+
+  /** Constructor which sets the default scanner. */
+  public parser(java_cup.runtime.Scanner s) {super(s);}
+
+  /** Production table. */
+  protected static final short _production_table[][] = 
+    unpackFromStrings(new String[] {
+    "\000\115\000\002\002\004\000\002\003\004\000\002\003" +
+    "\003\000\002\004\005\000\002\005\002\000\002\005\004" +
+    "\000\002\006\006\000\002\006\005\000\002\006\005\000" +
+    "\002\006\005\000\002\006\005\000\002\006\004\000\002" +
+    "\006\005\000\002\007\005\000\002\007\005\000\002\007" +
+    "\005\000\002\007\005\000\002\007\005\000\002\007\005" +
+    "\000\002\007\005\000\002\007\003\000\002\010\005\000" +
+    "\002\010\005\000\002\010\005\000\002\010\005\000\002" +
+    "\010\003\000\002\011\004\000\002\011\004\000\002\011" +
+    "\004\000\002\011\004\000\002\011\003\000\002\012\005" +
+    "\000\002\012\005\000\002\012\005\000\002\012\005\000" +
+    "\002\012\005\000\002\012\006\000\002\012\003\000\002" +
+    "\012\005\000\002\013\005\000\002\013\005\000\002\013" +
+    "\003\000\002\014\005\000\002\014\005\000\002\014\003" +
+    "\000\002\015\011\000\002\015\011\000\002\015\003\000" +
+    "\002\016\005\000\002\016\005\000\002\016\005\000\002" +
+    "\016\003\000\002\016\005\000\002\016\005\000\002\017" +
+    "\002\000\002\017\003\000\002\017\005\000\002\020\002" +
+    "\000\002\020\003\000\002\020\005\000\002\021\003\000" +
+    "\002\021\004\000\002\022\004\000\002\022\003\000\002" +
+    "\022\007\000\002\022\004\000\002\022\003\000\002\022" +
+    "\003\000\002\022\003\000\002\022\003\000\002\022\003" +
+    "\000\002\022\003\000\002\023\004\000\002\023\003\000" +
+    "\002\024\002\000\002\024\005\000\002\024\007" });
+
+  /** Access to production table. */
+  public short[][] production_table() {return _production_table;}
+
+  /** Parse-action table. */
+  protected static final short[][] _action_table = 
+    unpackFromStrings(new String[] {
+    "\000\223\000\060\002\ufffd\004\006\006\ufffd\007\ufffd\010" +
+    "\ufffd\011\ufffd\012\ufffd\034\ufffd\043\ufffd\045\ufffd\047\ufffd" +
+    "\050\ufffd\053\ufffd\054\ufffd\056\ufffd\057\ufffd\060\ufffd\061" +
+    "\ufffd\062\ufffd\063\ufffd\064\ufffd\065\ufffd\066\ufffd\001\002" +
+    "\000\056\002\ufffd\006\ufffd\007\ufffd\010\ufffd\011\ufffd\012" +
+    "\ufffd\034\ufffd\043\ufffd\045\ufffd\047\ufffd\050\ufffd\053\ufffd" +
+    "\054\ufffd\056\ufffd\057\ufffd\060\ufffd\061\ufffd\062\ufffd\063" +
+    "\ufffd\064\ufffd\065\ufffd\066\ufffd\001\002\000\004\002\224" +
+    "\001\002\000\004\066\222\001\002\000\056\002\uffff\006" +
+    "\040\007\035\010\033\011\032\012\031\034\041\043\020" +
+    "\045\014\047\012\050\011\053\045\054\030\056\026\057" +
+    "\025\060\024\061\023\062\013\063\010\064\022\065\017" +
+    "\066\016\001\002\000\100\005\uffbe\012\uffbe\013\uffbe\014" +
+    "\uffbe\015\uffbe\016\uffbe\017\uffbe\020\uffbe\021\uffbe\022\uffbe" +
+    "\023\uffbe\024\uffbe\025\uffbe\026\uffbe\027\uffbe\030\uffbe\031" +
+    "\uffbe\032\uffbe\033\uffbe\034\uffbe\035\uffbe\036\uffbe\037\uffbe" +
+    "\040\uffbe\041\uffbe\042\uffbe\044\uffbe\046\uffbe\051\uffbe\052" +
+    "\uffbe\055\uffbe\001\002\000\006\065\uffb8\066\uffb8\001\002" +
+    "\000\004\065\213\001\002\000\100\005\uffbc\012\uffbc\013" +
+    "\uffbc\014\uffbc\015\uffbc\016\uffbc\017\uffbc\020\uffbc\021\uffbc" +
+    "\022\uffbc\023\uffbc\024\uffbc\025\uffbc\026\uffbc\027\uffbc\030" +
+    "\uffbc\031\uffbc\032\uffbc\033\uffbc\034\uffbc\035\uffbc\036\uffbc" +
+    "\037\uffbc\040\uffbc\041\uffbc\042\uffbc\044\uffbc\046\uffbc\051" +
+    "\uffbc\052\uffbc\055\uffbc\001\002\000\036\012\031\034\053" +
+    "\043\020\045\014\046\uffcb\047\012\050\011\053\045\061" +
+    "\023\062\013\063\010\064\022\065\017\066\016\001\002" +
+    "\000\030\005\uffb7\012\177\013\uffb7\014\126\015\124\016" +
+    "\123\017\132\020\131\021\130\022\125\051\201\001\002" +
+    "\000\100\005\uffc5\012\uffc5\013\uffc5\014\uffc5\015\uffc5\016" +
+    "\uffc5\017\uffc5\020\uffc5\021\uffc5\022\uffc5\023\uffc5\024\uffc5" +
+    "\025\uffc5\026\uffc5\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033" +
+    "\uffc5\034\uffc5\035\uffc5\036\uffc5\037\uffc5\040\uffc5\041\uffc5" +
+    "\042\uffc5\044\uffc5\046\uffc5\051\uffc5\052\uffc5\055\uffc5\001" +
+    "\002\000\004\050\176\001\002\000\036\012\031\034\053" +
+    "\043\020\044\uffcb\045\014\047\012\050\011\053\045\061" +
+    "\023\062\013\063\010\064\022\065\017\066\016\001\002" +
+    "\000\100\005\uffbf\012\uffbf\013\uffbf\014\uffbf\015\uffbf\016" +
+    "\uffbf\017\uffbf\020\uffbf\021\uffbf\022\uffbf\023\uffbf\024\uffbf" +
+    "\025\uffbf\026\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf\033" +
+    "\uffbf\034\uffbf\035\uffbf\036\uffbf\037\uffbf\040\uffbf\041\uffbf" +
+    "\042\uffbf\044\uffbf\046\uffbf\051\uffbf\052\uffbf\055\uffbf\001" +
+    "\002\000\100\005\uffbd\012\uffbd\013\uffbd\014\uffbd\015\uffbd" +
+    "\016\uffbd\017\uffbd\020\uffbd\021\uffbd\022\uffbd\023\uffbd\024" +
+    "\uffbd\025\uffbd\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd" +
+    "\033\uffbd\034\uffbd\035\uffbd\036\uffbd\037\uffbd\040\uffbd\041" +
+    "\uffbd\042\uffbd\044\uffbd\046\uffbd\051\uffbd\052\uffbd\055\uffbd" +
+    "\001\002\000\100\005\uffbb\012\uffbb\013\uffbb\014\uffbb\015" +
+    "\uffbb\016\uffbb\017\uffbb\020\uffbb\021\uffbb\022\uffbb\023\uffbb" +
+    "\024\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb\032" +
+    "\uffbb\033\uffbb\034\uffbb\035\uffbb\036\uffbb\037\uffbb\040\uffbb" +
+    "\041\uffbb\042\uffbb\044\uffbb\046\uffbb\051\uffbb\052\uffbb\055" +
+    "\uffbb\001\002\000\034\012\031\034\041\043\020\045\014" +
+    "\047\012\050\011\053\045\061\023\062\013\063\010\064" +
+    "\022\065\017\066\016\001\002\000\034\012\031\034\041" +
+    "\043\020\045\014\047\012\050\011\053\045\061\023\062" +
+    "\013\063\010\064\022\065\017\066\016\001\002\000\034" +
+    "\012\031\034\041\043\020\045\014\047\012\050\011\053" +
+    "\045\061\023\062\013\063\010\064\022\065\017\066\016" +
+    "\001\002\000\056\002\ufffc\006\ufffc\007\ufffc\010\ufffc\011" +
+    "\ufffc\012\ufffc\034\ufffc\043\ufffc\045\ufffc\047\ufffc\050\ufffc" +
+    "\053\ufffc\054\ufffc\056\ufffc\057\ufffc\060\ufffc\061\ufffc\062" +
+    "\ufffc\063\ufffc\064\ufffc\065\ufffc\066\ufffc\001\002\000\034" +
+    "\012\031\034\041\043\020\045\014\047\012\050\011\053" +
+    "\045\061\023\062\013\063\010\064\022\065\017\066\016" +
+    "\001\002\000\102\005\uffc2\012\uffc2\013\uffc2\014\uffc2\015" +
+    "\uffc2\016\uffc2\017\uffc2\020\uffc2\021\uffc2\022\uffc2\023\uffc2" +
+    "\024\uffc2\025\uffc2\026\uffc2\027\uffc2\030\uffc2\031\uffc2\032" +
+    "\uffc2\033\uffc2\034\uffc2\035\uffc2\036\uffc2\037\uffc2\040\uffc2" +
+    "\041\uffc2\042\uffc2\044\uffc2\046\uffc2\051\uffc2\052\uffc2\055" +
+    "\uffc2\065\167\001\002\000\010\050\011\065\017\066\016" +
+    "\001\002\000\004\063\163\001\002\000\042\005\uffe3\012" +
+    "\uffe3\013\uffe3\014\uffe3\015\uffe3\016\uffe3\017\uffe3\020\uffe3" +
+    "\021\uffe3\022\uffe3\023\uffe3\024\uffe3\025\uffe3\026\uffe3\035" +
+    "\uffe3\051\uffe3\001\002\000\004\066\161\001\002\000\042" +
+    "\005\uffe8\012\uffe8\013\uffe8\014\uffe8\015\uffe8\016\uffe8\017" +
+    "\uffe8\020\uffe8\021\uffe8\022\uffe8\023\uffe8\024\uffe8\025\uffe8" +
+    "\026\uffe8\035\uffe8\051\uffe8\001\002\000\042\005\uffed\012" +
+    "\uffed\013\uffed\014\uffed\015\uffed\016\uffed\017\uffed\020\uffed" +
+    "\021\uffed\022\uffed\023\137\024\136\025\135\026\134\035" +
+    "\uffed\051\uffed\001\002\000\006\050\011\065\017\001\002" +
+    "\000\046\012\031\034\041\035\uffcb\043\020\045\014\047" +
+    "\012\050\011\053\045\054\030\056\026\057\025\060\024" +
+    "\061\023\062\013\063\010\064\022\065\017\066\016\001" +
+    "\002\000\004\065\153\001\002\000\066\005\uffdc\012\uffdc" +
+    "\013\uffdc\014\uffdc\015\uffdc\016\uffdc\017\uffdc\020\uffdc\021" +
+    "\uffdc\022\uffdc\023\uffdc\024\uffdc\025\uffdc\026\uffdc\027\110" +
+    "\030\112\031\111\032\107\033\106\034\105\035\uffdc\036" +
+    "\060\037\057\051\uffdc\052\061\055\056\001\002\000\100" +
+    "\005\uffce\012\uffce\013\uffce\014\uffce\015\uffce\016\uffce\017" +
+    "\uffce\020\uffce\021\uffce\022\uffce\023\uffce\024\uffce\025\uffce" +
+    "\026\uffce\027\uffce\030\uffce\031\uffce\032\uffce\033\uffce\034" +
+    "\uffce\035\uffce\036\uffce\037\uffce\040\uffce\041\uffce\042\uffce" +
+    "\044\uffce\046\uffce\051\uffce\052\uffce\055\uffce\001\002\000" +
+    "\100\005\uffba\012\uffba\013\uffba\014\uffba\015\uffba\016\uffba" +
+    "\017\uffba\020\uffba\021\uffba\022\uffba\023\uffba\024\uffba\025" +
+    "\uffba\026\uffba\027\uffba\030\uffba\031\uffba\032\uffba\033\uffba" +
+    "\034\uffba\035\uffba\036\uffba\037\uffba\040\uffba\041\uffba\042" +
+    "\uffba\044\uffba\046\uffba\051\uffba\052\uffba\055\uffba\001\002" +
+    "\000\100\005\uffd2\012\uffd2\013\uffd2\014\uffd2\015\uffd2\016" +
+    "\uffd2\017\uffd2\020\uffd2\021\uffd2\022\uffd2\023\uffd2\024\uffd2" +
+    "\025\uffd2\026\uffd2\027\uffd2\030\uffd2\031\uffd2\032\uffd2\033" +
+    "\uffd2\034\uffd2\035\uffd2\036\uffd2\037\uffd2\040\uffd2\041\uffd2" +
+    "\042\uffd2\044\uffd2\046\uffd2\051\uffd2\052\uffd2\055\uffd2\001" +
+    "\002\000\100\005\uffd5\012\uffd5\013\uffd5\014\uffd5\015\uffd5" +
+    "\016\uffd5\017\uffd5\020\uffd5\021\uffd5\022\uffd5\023\uffd5\024" +
+    "\uffd5\025\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5\032\uffd5" +
+    "\033\uffd5\034\uffd5\035\uffd5\036\uffd5\037\uffd5\040\uffd5\041" +
+    "\uffd5\042\uffd5\044\uffd5\046\uffd5\051\uffd5\052\uffd5\055\uffd5" +
+    "\001\002\000\100\005\uffd8\012\uffd8\013\uffd8\014\uffd8\015" +
+    "\uffd8\016\uffd8\017\uffd8\020\uffd8\021\uffd8\022\uffd8\023\uffd8" +
+    "\024\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031\uffd8\032" +
+    "\uffd8\033\uffd8\034\uffd8\035\uffd8\036\uffd8\037\uffd8\040\052" +
+    "\041\051\042\uffd8\044\uffd8\046\uffd8\051\uffd8\052\uffd8\055" +
+    "\uffd8\001\002\000\034\012\031\034\053\043\020\045\014" +
+    "\047\012\050\011\053\045\061\023\062\013\063\010\064" +
+    "\022\065\017\066\016\001\002\000\034\012\031\034\053" +
+    "\043\020\045\014\047\012\050\011\053\045\061\023\062" +
+    "\013\063\010\064\022\065\017\066\016\001\002\000\046" +
+    "\012\031\034\041\035\uffcb\043\020\045\014\047\012\050" +
+    "\011\053\045\054\030\056\026\057\025\060\024\061\023" +
+    "\062\013\063\010\064\022\065\017\066\016\001\002\000" +
+    "\012\036\060\037\057\052\061\055\056\001\002\000\100" +
+    "\005\uffd7\012\uffd7\013\uffd7\014\uffd7\015\uffd7\016\uffd7\017" +
+    "\uffd7\020\uffd7\021\uffd7\022\uffd7\023\uffd7\024\uffd7\025\uffd7" +
+    "\026\uffd7\027\uffd7\030\uffd7\031\uffd7\032\uffd7\033\uffd7\034" +
+    "\uffd7\035\uffd7\036\uffd7\037\uffd7\040\uffd7\041\uffd7\042\uffd7" +
+    "\044\uffd7\046\uffd7\051\uffd7\052\uffd7\055\uffd7\001\002\000" +
+    "\004\034\074\001\002\000\034\012\031\034\053\043\020" +
+    "\045\014\047\012\050\011\053\045\061\023\062\013\063" +
+    "\010\064\022\065\017\066\016\001\002\000\034\012\031" +
+    "\034\053\043\020\045\014\047\012\050\011\053\045\061" +
+    "\023\062\013\063\010\064\022\065\017\066\016\001\002" +
+    "\000\004\034\062\001\002\000\036\012\031\034\053\042" +
+    "\uffcb\043\020\045\014\047\012\050\011\053\045\061\023" +
+    "\062\013\063\010\064\022\065\017\066\016\001\002\000" +
+    "\004\042\067\001\002\000\024\026\065\035\uffca\036\060" +
+    "\037\057\042\uffca\044\uffca\046\uffca\052\061\055\056\001" +
+    "\002\000\044\012\031\034\053\035\uffcb\042\uffcb\043\020" +
+    "\044\uffcb\045\014\046\uffcb\047\012\050\011\053\045\061" +
+    "\023\062\013\063\010\064\022\065\017\066\016\001\002" +
+    "\000\012\035\uffc9\042\uffc9\044\uffc9\046\uffc9\001\002\000" +
+    "\036\012\031\034\053\035\uffcb\043\020\045\014\047\012" +
+    "\050\011\053\045\061\023\062\013\063\010\064\022\065" +
+    "\017\066\016\001\002\000\004\035\071\001\002\000\100" +
+    "\005\uffd4\012\uffd4\013\uffd4\014\uffd4\015\uffd4\016\uffd4\017" +
+    "\uffd4\020\uffd4\021\uffd4\022\uffd4\023\uffd4\024\uffd4\025\uffd4" +
+    "\026\uffd4\027\uffd4\030\uffd4\031\uffd4\032\uffd4\033\uffd4\034" +
+    "\uffd4\035\uffd4\036\uffd4\037\uffd4\040\uffd4\041\uffd4\042\uffd4" +
+    "\044\uffd4\046\uffd4\051\uffd4\052\uffd4\055\uffd4\001\002\000" +
+    "\100\005\uffda\012\uffda\013\uffda\014\uffda\015\uffda\016\uffda" +
+    "\017\uffda\020\uffda\021\uffda\022\uffda\023\uffda\024\uffda\025" +
+    "\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda\033\uffda" +
+    "\034\uffda\035\uffda\036\uffda\037\uffda\040\052\041\051\042" +
+    "\uffda\044\uffda\046\uffda\051\uffda\052\uffda\055\uffda\001\002" +
+    "\000\100\005\uffd9\012\uffd9\013\uffd9\014\uffd9\015\uffd9\016" +
+    "\uffd9\017\uffd9\020\uffd9\021\uffd9\022\uffd9\023\uffd9\024\uffd9" +
+    "\025\uffd9\026\uffd9\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033" +
+    "\uffd9\034\uffd9\035\uffd9\036\uffd9\037\uffd9\040\052\041\051" +
+    "\042\uffd9\044\uffd9\046\uffd9\051\uffd9\052\uffd9\055\uffd9\001" +
+    "\002\000\036\012\031\034\053\042\uffcb\043\020\045\014" +
+    "\047\012\050\011\053\045\061\023\062\013\063\010\064" +
+    "\022\065\017\066\016\001\002\000\004\042\076\001\002" +
+    "\000\036\012\031\034\053\035\uffcb\043\020\045\014\047" +
+    "\012\050\011\053\045\061\023\062\013\063\010\064\022" +
+    "\065\017\066\016\001\002\000\004\035\100\001\002\000" +
+    "\100\005\uffd3\012\uffd3\013\uffd3\014\uffd3\015\uffd3\016\uffd3" +
+    "\017\uffd3\020\uffd3\021\uffd3\022\uffd3\023\uffd3\024\uffd3\025" +
+    "\uffd3\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3" +
+    "\034\uffd3\035\uffd3\036\uffd3\037\uffd3\040\uffd3\041\uffd3\042" +
+    "\uffd3\044\uffd3\046\uffd3\051\uffd3\052\uffd3\055\uffd3\001\002" +
+    "\000\022\014\126\015\124\016\123\017\132\020\131\021" +
+    "\130\022\125\035\127\001\002\000\004\035\122\001\002" +
+    "\000\056\014\uffdc\015\uffdc\016\uffdc\017\uffdc\020\uffdc\021" +
+    "\uffdc\022\uffdc\023\uffdc\024\uffdc\025\uffdc\026\065\027\110" +
+    "\030\112\031\111\032\107\033\106\034\105\035\104\036" +
+    "\060\037\057\052\061\055\056\001\002\000\100\005\uffcc" +
+    "\012\uffcc\013\uffcc\014\uffcc\015\uffcc\016\uffcc\017\uffcc\020" +
+    "\uffcc\021\uffcc\022\uffcc\023\uffcc\024\uffcc\025\uffcc\026\uffcc" +
+    "\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033\uffcc\034\uffcc\035" +
+    "\uffcc\036\uffcc\037\uffcc\040\uffcc\041\uffcc\042\uffcc\044\uffcc" +
+    "\046\uffcc\051\uffcc\052\uffcc\055\uffcc\001\002\000\036\012" +
+    "\031\034\053\035\uffcb\043\020\045\014\047\012\050\011" +
+    "\053\045\061\023\062\013\063\010\064\022\065\017\066" +
+    "\016\001\002\000\034\012\031\034\053\043\020\045\014" +
+    "\047\012\050\011\053\045\061\023\062\013\063\010\064" +
+    "\022\065\017\066\016\001\002\000\034\012\031\034\053" +
+    "\043\020\045\014\047\012\050\011\053\045\061\023\062" +
+    "\013\063\010\064\022\065\017\066\016\001\002\000\034" +
+    "\012\031\034\053\043\020\045\014\047\012\050\011\053" +
+    "\045\061\023\062\013\063\010\064\022\065\017\066\016" +
+    "\001\002\000\034\012\031\034\053\043\020\045\014\047" +
+    "\012\050\011\053\045\061\023\062\013\063\010\064\022" +
+    "\065\017\066\016\001\002\000\034\012\031\034\053\043" +
+    "\020\045\014\047\012\050\011\053\045\061\023\062\013" +
+    "\063\010\064\022\065\017\066\016\001\002\000\052\005" +
+    "\uffe1\012\uffe1\013\uffe1\014\uffe1\015\uffe1\016\uffe1\017\uffe1" +
+    "\020\uffe1\021\uffe1\022\uffe1\023\uffe1\024\uffe1\025\uffe1\026" +
+    "\uffe1\035\uffe1\036\060\037\057\051\uffe1\052\061\055\056" +
+    "\001\002\000\052\005\uffe0\012\uffe0\013\uffe0\014\uffe0\015" +
+    "\uffe0\016\uffe0\017\uffe0\020\uffe0\021\uffe0\022\uffe0\023\uffe0" +
+    "\024\uffe0\025\uffe0\026\uffe0\035\uffe0\036\060\037\057\051" +
+    "\uffe0\052\061\055\056\001\002\000\052\005\uffe2\012\uffe2" +
+    "\013\uffe2\014\uffe2\015\uffe2\016\uffe2\017\uffe2\020\uffe2\021" +
+    "\uffe2\022\uffe2\023\uffe2\024\uffe2\025\uffe2\026\uffe2\035\uffe2" +
+    "\036\060\037\057\051\uffe2\052\061\055\056\001\002\000" +
+    "\052\005\uffdf\012\uffdf\013\uffdf\014\uffdf\015\uffdf\016\uffdf" +
+    "\017\uffdf\020\uffdf\021\uffdf\022\uffdf\023\uffdf\024\uffdf\025" +
+    "\uffdf\026\uffdf\035\uffdf\036\060\037\057\051\uffdf\052\061" +
+    "\055\056\001\002\000\052\005\uffde\012\uffde\013\uffde\014" +
+    "\uffde\015\uffde\016\uffde\017\uffde\020\uffde\021\uffde\022\uffde" +
+    "\023\uffde\024\uffde\025\uffde\026\uffde\035\uffde\036\060\037" +
+    "\057\051\uffde\052\061\055\056\001\002\000\004\035\121" +
+    "\001\002\000\042\005\uffdd\012\uffdd\013\uffdd\014\uffdd\015" +
+    "\uffdd\016\uffdd\017\uffdd\020\uffdd\021\uffdd\022\uffdd\023\uffdd" +
+    "\024\uffdd\025\uffdd\026\uffdd\035\uffdd\051\uffdd\001\002\000" +
+    "\100\005\uffcf\012\uffcf\013\uffcf\014\uffcf\015\uffcf\016\uffcf" +
+    "\017\uffcf\020\uffcf\021\uffcf\022\uffcf\023\uffcf\024\uffcf\025" +
+    "\uffcf\026\uffcf\027\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf" +
+    "\034\uffcf\035\uffcf\036\uffcf\037\uffcf\040\uffcf\041\uffcf\042" +
+    "\uffcf\044\uffcf\046\uffcf\051\uffcf\052\uffcf\055\uffcf\001\002" +
+    "\000\044\012\031\034\041\043\020\045\014\047\012\050" +
+    "\011\053\045\054\030\056\026\057\025\060\024\061\023" +
+    "\062\013\063\010\064\022\065\017\066\016\001\002\000" +
+    "\044\012\031\034\041\043\020\045\014\047\012\050\011" +
+    "\053\045\054\030\056\026\057\025\060\024\061\023\062" +
+    "\013\063\010\064\022\065\017\066\016\001\002\000\044" +
+    "\012\031\034\041\043\020\045\014\047\012\050\011\053" +
+    "\045\054\030\056\026\057\025\060\024\061\023\062\013" +
+    "\063\010\064\022\065\017\066\016\001\002\000\044\012" +
+    "\031\034\041\043\020\045\014\047\012\050\011\053\045" +
+    "\054\030\056\026\057\025\060\024\061\023\062\013\063" +
+    "\010\064\022\065\017\066\016\001\002\000\100\005\uffcd" +
+    "\012\uffcd\013\uffcd\014\uffcd\015\uffcd\016\uffcd\017\uffcd\020" +
+    "\uffcd\021\uffcd\022\uffcd\023\uffcd\024\uffcd\025\uffcd\026\uffcd" +
+    "\027\uffcd\030\uffcd\031\uffcd\032\uffcd\033\uffcd\034\uffcd\035" +
+    "\uffcd\036\uffcd\037\uffcd\040\uffcd\041\uffcd\042\uffcd\044\uffcd" +
+    "\046\uffcd\051\uffcd\052\uffcd\055\uffcd\001\002\000\044\012" +
+    "\031\034\041\043\020\045\014\047\012\050\011\053\045" +
+    "\054\030\056\026\057\025\060\024\061\023\062\013\063" +
+    "\010\064\022\065\017\066\016\001\002\000\044\012\031" +
+    "\034\041\043\020\045\014\047\012\050\011\053\045\054" +
+    "\030\056\026\057\025\060\024\061\023\062\013\063\010" +
+    "\064\022\065\017\066\016\001\002\000\044\012\031\034" +
+    "\041\043\020\045\014\047\012\050\011\053\045\054\030" +
+    "\056\026\057\025\060\024\061\023\062\013\063\010\064" +
+    "\022\065\017\066\016\001\002\000\042\005\ufff1\012\ufff1" +
+    "\013\ufff1\014\ufff1\015\ufff1\016\ufff1\017\ufff1\020\ufff1\021" +
+    "\ufff1\022\ufff1\023\137\024\136\025\135\026\134\035\ufff1" +
+    "\051\ufff1\001\002\000\044\012\031\034\041\043\020\045" +
+    "\014\047\012\050\011\053\045\054\030\056\026\057\025" +
+    "\060\024\061\023\062\013\063\010\064\022\065\017\066" +
+    "\016\001\002\000\044\012\031\034\041\043\020\045\014" +
+    "\047\012\050\011\053\045\054\030\056\026\057\025\060" +
+    "\024\061\023\062\013\063\010\064\022\065\017\066\016" +
+    "\001\002\000\044\012\031\034\041\043\020\045\014\047" +
+    "\012\050\011\053\045\054\030\056\026\057\025\060\024" +
+    "\061\023\062\013\063\010\064\022\065\017\066\016\001" +
+    "\002\000\044\012\031\034\041\043\020\045\014\047\012" +
+    "\050\011\053\045\054\030\056\026\057\025\060\024\061" +
+    "\023\062\013\063\010\064\022\065\017\066\016\001\002" +
+    "\000\042\005\uffec\012\uffec\013\uffec\014\uffec\015\uffec\016" +
+    "\uffec\017\uffec\020\uffec\021\uffec\022\uffec\023\uffec\024\uffec" +
+    "\025\uffec\026\uffec\035\uffec\051\uffec\001\002\000\042\005" +
+    "\uffeb\012\uffeb\013\uffeb\014\uffeb\015\uffeb\016\uffeb\017\uffeb" +
+    "\020\uffeb\021\uffeb\022\uffeb\023\uffeb\024\uffeb\025\uffeb\026" +
+    "\uffeb\035\uffeb\051\uffeb\001\002\000\042\005\uffea\012\uffea" +
+    "\013\uffea\014\uffea\015\uffea\016\uffea\017\uffea\020\uffea\021" +
+    "\uffea\022\uffea\023\uffea\024\uffea\025\uffea\026\uffea\035\uffea" +
+    "\051\uffea\001\002\000\042\005\uffe9\012\uffe9\013\uffe9\014" +
+    "\uffe9\015\uffe9\016\uffe9\017\uffe9\020\uffe9\021\uffe9\022\uffe9" +
+    "\023\uffe9\024\uffe9\025\uffe9\026\uffe9\035\uffe9\051\uffe9\001" +
+    "\002\000\042\005\ufff0\012\ufff0\013\ufff0\014\ufff0\015\ufff0" +
+    "\016\ufff0\017\ufff0\020\ufff0\021\ufff0\022\ufff0\023\137\024" +
+    "\136\025\135\026\134\035\ufff0\051\ufff0\001\002\000\042" +
+    "\005\uffef\012\uffef\013\uffef\014\uffef\015\uffef\016\uffef\017" +
+    "\uffef\020\uffef\021\uffef\022\uffef\023\137\024\136\025\135" +
+    "\026\134\035\uffef\051\uffef\001\002\000\042\005\ufff4\012" +
+    "\ufff4\013\ufff4\014\ufff4\015\ufff4\016\ufff4\017\ufff4\020\ufff4" +
+    "\021\ufff4\022\ufff4\023\137\024\136\025\135\026\134\035" +
+    "\ufff4\051\ufff4\001\002\000\042\005\uffee\012\uffee\013\uffee" +
+    "\014\uffee\015\uffee\016\uffee\017\uffee\020\uffee\021\uffee\022" +
+    "\uffee\023\137\024\136\025\135\026\134\035\uffee\051\uffee" +
+    "\001\002\000\042\005\ufff3\012\ufff3\013\ufff3\014\ufff3\015" +
+    "\ufff3\016\ufff3\017\ufff3\020\ufff3\021\ufff3\022\ufff3\023\137" +
+    "\024\136\025\135\026\134\035\ufff3\051\ufff3\001\002\000" +
+    "\042\005\ufff2\012\ufff2\013\ufff2\014\ufff2\015\ufff2\016\ufff2" +
+    "\017\ufff2\020\ufff2\021\ufff2\022\ufff2\023\137\024\136\025" +
+    "\135\026\134\035\ufff2\051\ufff2\001\002\000\100\005\uffd6" +
+    "\012\uffd6\013\uffd6\014\uffd6\015\uffd6\016\uffd6\017\uffd6\020" +
+    "\uffd6\021\uffd6\022\uffd6\023\uffd6\024\uffd6\025\uffd6\026\uffd6" +
+    "\027\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6\034\uffd6\035" +
+    "\uffd6\036\uffd6\037\uffd6\040\uffd6\041\uffd6\042\uffd6\044\uffd6" +
+    "\046\uffd6\051\uffd6\052\uffd6\055\uffd6\001\002\000\100\005" +
+    "\uffc4\012\uffc4\013\uffc4\014\uffc4\015\uffc4\016\uffc4\017\uffc4" +
+    "\020\uffc4\021\uffc4\022\uffc4\023\uffc4\024\uffc4\025\uffc4\026" +
+    "\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4\033\uffc4\034\uffc4" +
+    "\035\uffc4\036\uffc4\037\uffc4\040\uffc4\041\uffc4\042\uffc4\044" +
+    "\uffc4\046\uffc4\051\uffc4\052\uffc4\055\uffc4\001\002\000\022" +
+    "\014\126\015\124\016\123\017\132\020\131\021\130\022" +
+    "\125\035\155\001\002\000\072\005\uffdb\012\uffdb\013\uffdb" +
+    "\014\uffdb\015\uffdb\016\uffdb\017\uffdb\020\uffdb\021\uffdb\022" +
+    "\uffdb\023\uffdb\024\uffdb\025\uffdb\026\uffdb\027\uffcd\030\uffcd" +
+    "\031\uffcd\032\uffcd\033\uffcd\034\uffcd\035\uffdb\036\uffcd\037" +
+    "\uffcd\040\uffcd\041\uffcd\051\uffdb\052\uffcd\055\uffcd\001\002" +
+    "\000\004\066\157\001\002\000\004\005\160\001\002\000" +
+    "\056\002\ufffb\006\ufffb\007\ufffb\010\ufffb\011\ufffb\012\ufffb" +
+    "\034\ufffb\043\ufffb\045\ufffb\047\ufffb\050\ufffb\053\ufffb\054" +
+    "\ufffb\056\ufffb\057\ufffb\060\ufffb\061\ufffb\062\ufffb\063\ufffb" +
+    "\064\ufffb\065\ufffb\066\ufffb\001\002\000\004\005\162\001" +
+    "\002\000\056\002\ufffa\006\ufffa\007\ufffa\010\ufffa\011\ufffa" +
+    "\012\ufffa\034\ufffa\043\ufffa\045\ufffa\047\ufffa\050\ufffa\053" +
+    "\ufffa\054\ufffa\056\ufffa\057\ufffa\060\ufffa\061\ufffa\062\ufffa" +
+    "\063\ufffa\064\ufffa\065\ufffa\066\ufffa\001\002\000\004\005" +
+    "\164\001\002\000\056\002\ufff9\006\ufff9\007\ufff9\010\ufff9" +
+    "\011\ufff9\012\ufff9\034\ufff9\043\ufff9\045\ufff9\047\ufff9\050" +
+    "\ufff9\053\ufff9\054\ufff9\056\ufff9\057\ufff9\060\ufff9\061\ufff9" +
+    "\062\ufff9\063\ufff9\064\ufff9\065\ufff9\066\ufff9\001\002\000" +
+    "\004\005\166\001\002\000\056\002\ufff8\006\ufff8\007\ufff8" +
+    "\010\ufff8\011\ufff8\012\ufff8\034\ufff8\043\ufff8\045\ufff8\047" +
+    "\ufff8\050\ufff8\053\ufff8\054\ufff8\056\ufff8\057\ufff8\060\ufff8" +
+    "\061\ufff8\062\ufff8\063\ufff8\064\ufff8\065\ufff8\066\ufff8\001" +
+    "\002\000\100\005\uffc3\012\uffc3\013\uffc3\014\uffc3\015\uffc3" +
+    "\016\uffc3\017\uffc3\020\uffc3\021\uffc3\022\uffc3\023\uffc3\024" +
+    "\uffc3\025\uffc3\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3" +
+    "\033\uffc3\034\uffc3\035\uffc3\036\uffc3\037\uffc3\040\uffc3\041" +
+    "\uffc3\042\uffc3\044\uffc3\046\uffc3\051\uffc3\052\uffc3\055\uffc3" +
+    "\001\002\000\042\005\uffe4\012\uffe4\013\uffe4\014\uffe4\015" +
+    "\uffe4\016\uffe4\017\uffe4\020\uffe4\021\uffe4\022\uffe4\023\uffe4" +
+    "\024\uffe4\025\uffe4\026\uffe4\035\uffe4\051\uffe4\001\002\000" +
+    "\042\005\uffe7\012\uffe7\013\uffe7\014\uffe7\015\uffe7\016\uffe7" +
+    "\017\uffe7\020\uffe7\021\uffe7\022\uffe7\023\uffe7\024\uffe7\025" +
+    "\uffe7\026\uffe7\035\uffe7\051\uffe7\001\002\000\042\005\uffe6" +
+    "\012\uffe6\013\uffe6\014\uffe6\015\uffe6\016\uffe6\017\uffe6\020" +
+    "\uffe6\021\uffe6\022\uffe6\023\uffe6\024\uffe6\025\uffe6\026\uffe6" +
+    "\035\uffe6\051\uffe6\001\002\000\042\005\uffe5\012\uffe5\013" +
+    "\uffe5\014\uffe5\015\uffe5\016\uffe5\017\uffe5\020\uffe5\021\uffe5" +
+    "\022\uffe5\023\uffe5\024\uffe5\025\uffe5\026\uffe5\035\uffe5\051" +
+    "\uffe5\001\002\000\004\044\175\001\002\000\100\005\uffd1" +
+    "\012\uffd1\013\uffd1\014\uffd1\015\uffd1\016\uffd1\017\uffd1\020" +
+    "\uffd1\021\uffd1\022\uffd1\023\uffd1\024\uffd1\025\uffd1\026\uffd1" +
+    "\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1\034\uffd1\035" +
+    "\uffd1\036\uffd1\037\uffd1\040\uffd1\041\uffd1\042\uffd1\044\uffd1" +
+    "\046\uffd1\051\uffd1\052\uffd1\055\uffd1\001\002\000\006\065" +
+    "\uffb9\066\uffb9\001\002\000\056\002\ufff6\006\ufff6\007\ufff6" +
+    "\010\ufff6\011\ufff6\012\ufff6\034\ufff6\043\ufff6\045\ufff6\047" +
+    "\ufff6\050\ufff6\053\ufff6\054\ufff6\056\ufff6\057\ufff6\060\ufff6" +
+    "\061\ufff6\062\ufff6\063\ufff6\064\ufff6\065\ufff6\066\ufff6\001" +
+    "\002\000\006\005\207\013\210\001\002\000\004\064\202" +
+    "\001\002\000\006\025\203\051\204\001\002\000\004\064" +
+    "\205\001\002\000\006\005\uffb6\013\uffb6\001\002\000\004" +
+    "\051\206\001\002\000\006\005\uffb5\013\uffb5\001\002\000" +
+    "\056\002\ufff7\006\ufff7\007\ufff7\010\ufff7\011\ufff7\012\ufff7" +
+    "\034\ufff7\043\ufff7\045\ufff7\047\ufff7\050\ufff7\053\ufff7\054" +
+    "\ufff7\056\ufff7\057\ufff7\060\ufff7\061\ufff7\062\ufff7\063\ufff7" +
+    "\064\ufff7\065\ufff7\066\ufff7\001\002\000\056\002\ufff5\006" +
+    "\ufff5\007\ufff5\010\ufff5\011\ufff5\012\ufff5\034\ufff5\043\ufff5" +
+    "\045\ufff5\047\ufff5\050\ufff5\053\ufff5\054\ufff5\056\ufff5\057" +
+    "\ufff5\060\ufff5\061\ufff5\062\ufff5\063\ufff5\064\ufff5\065\ufff5" +
+    "\066\ufff5\001\002\000\004\046\212\001\002\000\100\005" +
+    "\uffd0\012\uffd0\013\uffd0\014\uffd0\015\uffd0\016\uffd0\017\uffd0" +
+    "\020\uffd0\021\uffd0\022\uffd0\023\uffd0\024\uffd0\025\uffd0\026" +
+    "\uffd0\027\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\034\uffd0" +
+    "\035\uffd0\036\uffd0\037\uffd0\040\uffd0\041\uffd0\042\uffd0\044" +
+    "\uffd0\046\uffd0\051\uffd0\052\uffd0\055\uffd0\001\002\000\100" +
+    "\005\uffc0\012\uffc0\013\uffc0\014\uffc0\015\uffc0\016\uffc0\017" +
+    "\uffc0\020\uffc0\021\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0" +
+    "\026\uffc0\027\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\034" +
+    "\214\035\uffc0\036\uffc0\037\uffc0\040\uffc0\041\uffc0\042\uffc0" +
+    "\044\uffc0\046\uffc0\051\uffc0\052\uffc0\055\uffc0\001\002\000" +
+    "\006\035\uffc8\065\216\001\002\000\004\035\221\001\002" +
+    "\000\006\026\217\035\uffc7\001\002\000\006\035\uffc8\065" +
+    "\216\001\002\000\004\035\uffc6\001\002\000\100\005\uffc1" +
+    "\012\uffc1\013\uffc1\014\uffc1\015\uffc1\016\uffc1\017\uffc1\020" +
+    "\uffc1\021\uffc1\022\uffc1\023\uffc1\024\uffc1\025\uffc1\026\uffc1" +
+    "\027\uffc1\030\uffc1\031\uffc1\032\uffc1\033\uffc1\034\uffc1\035" +
+    "\uffc1\036\uffc1\037\uffc1\040\uffc1\041\uffc1\042\uffc1\044\uffc1" +
+    "\046\uffc1\051\uffc1\052\uffc1\055\uffc1\001\002\000\004\005" +
+    "\223\001\002\000\056\002\ufffe\006\ufffe\007\ufffe\010\ufffe" +
+    "\011\ufffe\012\ufffe\034\ufffe\043\ufffe\045\ufffe\047\ufffe\050" +
+    "\ufffe\053\ufffe\054\ufffe\056\ufffe\057\ufffe\060\ufffe\061\ufffe" +
+    "\062\ufffe\063\ufffe\064\ufffe\065\ufffe\066\ufffe\001\002\000" +
+    "\004\002\001\001\002\000\056\002\000\006\040\007\035" +
+    "\010\033\011\032\012\031\034\041\043\020\045\014\047" +
+    "\012\050\011\053\045\054\030\056\026\057\025\060\024" +
+    "\061\023\062\013\063\010\064\022\065\017\066\016\001" +
+    "\002" });
+
+  /** Access to parse-action table. */
+  public short[][] action_table() {return _action_table;}
+
+  /** <code>reduce_goto</code> table. */
+  protected static final short[][] _reduce_table = 
+    unpackFromStrings(new String[] {
+    "\000\223\000\010\003\004\004\003\005\006\001\001\000" +
+    "\004\005\224\001\001\000\002\001\001\000\002\001\001" +
+    "\000\032\006\026\007\014\010\036\011\035\012\033\013" +
+    "\042\014\047\015\046\016\045\021\020\022\043\023\041" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\022\013\063\014\047\015\046" +
+    "\016\045\017\210\021\020\022\043\023\041\001\001\000" +
+    "\004\024\177\001\001\000\002\001\001\000\002\001\001" +
+    "\000\022\013\063\014\047\015\046\016\045\017\173\021" +
+    "\020\022\043\023\041\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\022\012\172\013\042\014" +
+    "\047\015\046\016\045\021\020\022\043\023\041\001\001" +
+    "\000\022\012\171\013\042\014\047\015\046\016\045\021" +
+    "\020\022\043\023\041\001\001\000\022\012\170\013\042" +
+    "\014\047\015\046\016\045\021\020\022\043\023\041\001" +
+    "\001\000\002\001\001\000\022\012\167\013\042\014\047" +
+    "\015\046\016\045\021\020\022\043\023\041\001\001\000" +
+    "\002\001\001\000\006\021\164\023\041\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\004\023\155\001\001\000\032" +
+    "\007\153\010\036\011\035\012\033\013\102\014\047\015" +
+    "\046\016\045\017\101\021\020\022\043\023\041\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\020\013\053\014\047\015\151\016\045\021" +
+    "\020\022\043\023\041\001\001\000\020\013\053\014\047" +
+    "\015\054\016\045\021\020\022\043\023\041\001\001\000" +
+    "\032\007\100\010\036\011\035\012\033\013\102\014\047" +
+    "\015\046\016\045\017\101\021\020\022\043\023\041\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\020\013\053\014\072\015\046\016\045\021\020\022" +
+    "\043\023\041\001\001\000\020\013\053\014\071\015\046" +
+    "\016\045\021\020\022\043\023\041\001\001\000\002\001" +
+    "\001\000\022\013\063\014\047\015\046\016\045\017\062" +
+    "\021\020\022\043\023\041\001\001\000\002\001\001\000" +
+    "\002\001\001\000\022\013\063\014\047\015\046\016\045" +
+    "\017\065\021\020\022\043\023\041\001\001\000\002\001" +
+    "\001\000\022\013\063\014\047\015\046\016\045\017\067" +
+    "\021\020\022\043\023\041\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\022" +
+    "\013\063\014\047\015\046\016\045\017\074\021\020\022" +
+    "\043\023\041\001\001\000\002\001\001\000\022\013\063" +
+    "\014\047\015\046\016\045\017\076\021\020\022\043\023" +
+    "\041\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\022\013\063\014\047\015\046\016\045\017\117" +
+    "\021\020\022\043\023\041\001\001\000\020\013\116\014" +
+    "\047\015\046\016\045\021\020\022\043\023\041\001\001" +
+    "\000\020\013\115\014\047\015\046\016\045\021\020\022" +
+    "\043\023\041\001\001\000\020\013\114\014\047\015\046" +
+    "\016\045\021\020\022\043\023\041\001\001\000\020\013" +
+    "\113\014\047\015\046\016\045\021\020\022\043\023\041" +
+    "\001\001\000\020\013\112\014\047\015\046\016\045\021" +
+    "\020\022\043\023\041\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\026\010\150\011\035\012\033\013\042\014\047\015" +
+    "\046\016\045\021\020\022\043\023\041\001\001\000\026" +
+    "\010\147\011\035\012\033\013\042\014\047\015\046\016" +
+    "\045\021\020\022\043\023\041\001\001\000\026\010\146" +
+    "\011\035\012\033\013\042\014\047\015\046\016\045\021" +
+    "\020\022\043\023\041\001\001\000\026\010\145\011\035" +
+    "\012\033\013\042\014\047\015\046\016\045\021\020\022" +
+    "\043\023\041\001\001\000\002\001\001\000\026\010\144" +
+    "\011\035\012\033\013\042\014\047\015\046\016\045\021" +
+    "\020\022\043\023\041\001\001\000\026\010\143\011\035" +
+    "\012\033\013\042\014\047\015\046\016\045\021\020\022" +
+    "\043\023\041\001\001\000\026\010\132\011\035\012\033" +
+    "\013\042\014\047\015\046\016\045\021\020\022\043\023" +
+    "\041\001\001\000\002\001\001\000\024\011\142\012\033" +
+    "\013\042\014\047\015\046\016\045\021\020\022\043\023" +
+    "\041\001\001\000\024\011\141\012\033\013\042\014\047" +
+    "\015\046\016\045\021\020\022\043\023\041\001\001\000" +
+    "\024\011\140\012\033\013\042\014\047\015\046\016\045" +
+    "\021\020\022\043\023\041\001\001\000\024\011\137\012" +
+    "\033\013\042\014\047\015\046\016\045\021\020\022\043" +
+    "\023\041\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\004" +
+    "\020\214\001\001\000\002\001\001\000\002\001\001\000" +
+    "\004\020\217\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\032\006\026\007\014\010\036\011\035\012\033\013\042" +
+    "\014\047\015\046\016\045\021\020\022\043\023\041\001" +
+    "\001" });
+
+  /** Access to <code>reduce_goto</code> table. */
+  public short[][] reduce_table() {return _reduce_table;}
+
+  /** Instance of action encapsulation class. */
+  protected CUP$parser$actions action_obj;
+
+  /** Action encapsulation object initializer. */
+  protected void init_actions()
+    {
+      action_obj = new CUP$parser$actions(this);
+    }
+
+  /** Invoke a user supplied parse action. */
+  public java_cup.runtime.Symbol do_action(
+    int                        act_num,
+    java_cup.runtime.lr_parser parser,
+    java.util.Stack            stack,
+    int                        top)
+    throws java.lang.Exception
+  {
+    /* call code in generated class */
+    return action_obj.CUP$parser$do_action(act_num, parser, stack, top);
+  }
+
+  /** Indicates start state. */
+  public int start_state() {return 0;}
+  /** Indicates start production. */
+  public int start_production() {return 0;}
+
+  /** <code>EOF</code> Symbol index. */
+  public int EOF_sym() {return 0;}
+
+  /** <code>error</code> Symbol index. */
+  public int error_sym() {return 1;}
+
+
+
+  public com.googlecode.opennars.parser.loan.Loan.Absyn.Document pDocument() throws Exception
+  {
+	java_cup.runtime.Symbol res = parse();
+	return (com.googlecode.opennars.parser.loan.Loan.Absyn.Document) res.value;
+  }
+
+public <B,A extends java.util.LinkedList<? super B>> A cons_(B x, A xs) { xs.addFirst(x); return xs; }
+
+public void syntax_error(java_cup.runtime.Symbol cur_token)
+{
+	report_error("Syntax Error, trying to recover and continue parse...", cur_token);
+}
+
+public void unrecovered_syntax_error(java_cup.runtime.Symbol cur_token) throws java.lang.Exception
+{
+	throw new Exception("Unrecoverable Syntax Error");
+}
+
+
+}
+
+/** Cup generated class to encapsulate user supplied action code.*/
+class CUP$parser$actions {
+  private final parser parser;
+
+  /** Constructor */
+  CUP$parser$actions(parser parser) {
+    this.parser = parser;
+  }
+
+  /** Method with the actual generated action code. */
+  public final java_cup.runtime.Symbol CUP$parser$do_action(
+    int                        CUP$parser$act_num,
+    java_cup.runtime.lr_parser CUP$parser$parser,
+    java.util.Stack            CUP$parser$stack,
+    int                        CUP$parser$top)
+    throws java.lang.Exception
+    {
+      /* Symbol object for return from actions */
+      java_cup.runtime.Symbol CUP$parser$result;
+
+      /* select the action based on the action number */
+      switch (CUP$parser$act_num)
+        {
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 76: // TruthValue ::= _SYMB_37 _DOUBLE_ _SYMB_17 _DOUBLE_ _SYMB_37 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue RESULT = null;
+		Double p_2 = (Double)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-3)).value;
+		Double p_4 = (Double)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC(p_2,p_4); 
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*TruthValue*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 75: // TruthValue ::= _SYMB_37 _DOUBLE_ _SYMB_37 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue RESULT = null;
+		Double p_2 = (Double)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*TruthValue*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 74: // TruthValue ::= 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*TruthValue*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 73: // NSPrefix ::= _SYMB_36 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(17/*NSPrefix*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 72: // NSPrefix ::= _IDENT_ _SYMB_36 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix RESULT = null;
+		String p_1 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(17/*NSPrefix*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 71: // Literal ::= _SYMB_39 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 70: // Literal ::= _SYMB_45 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 69: // Literal ::= _STRING_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		String p_1 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitString(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 68: // Literal ::= _DOUBLE_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		Double p_1 = (Double)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 67: // Literal ::= _INTEGER_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		Integer p_1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 66: // Literal ::= URIRef 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 65: // Literal ::= _SYMB_35 _IDENT_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 64: // Literal ::= _SYMB_35 _IDENT_ _SYMB_24 ListIdent _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-3)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent p_4 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD(p_2,p_4); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 63: // Literal ::= _SYMB_6 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 62: // Literal ::= _SYMB_6 _IDENT_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Literal RESULT = null;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*Literal*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 61: // URIRef ::= NSPrefix _IDENT_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.URICur(p_1,p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(15/*URIRef*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 60: // URIRef ::= URILit 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef RESULT = null;
+		String p_1 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(15/*URIRef*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 59: // ListIdent ::= _IDENT_ _SYMB_18 ListIdent 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent RESULT = null;
+		String p_1 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_3; p_3.addFirst(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(14/*ListIdent*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 58: // ListIdent ::= _IDENT_ 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent RESULT = null;
+		String p_1 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent(); RESULT.addLast(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(14/*ListIdent*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 57: // ListIdent ::= 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(14/*ListIdent*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 56: // ListTerm ::= Term _SYMB_18 ListTerm 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_3; p_3.addFirst(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(13/*ListTerm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 55: // ListTerm ::= Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm(); RESULT.addLast(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(13/*ListTerm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 54: // ListTerm ::= 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(13/*ListTerm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 53: // Term3 ::= _SYMB_24 Term _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = p_2; 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 52: // Term3 ::= _SYMB_24 Stm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 51: // Term3 ::= Literal 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Literal p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Literal)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 50: // Term3 ::= _SYMB_24 ListTerm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 49: // Term3 ::= _SYMB_33 ListTerm _SYMB_34 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 48: // Term3 ::= _SYMB_31 ListTerm _SYMB_32 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*Term3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 47: // Term2 ::= Term3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(11/*Term2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 46: // Term2 ::= Term _SYMB_41 _SYMB_24 ListTerm _SYMB_30 ListTerm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-6)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_4 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-3)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_6 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg(p_1,p_4,p_6); 
+              CUP$parser$result = new java_cup.runtime.Symbol(11/*Term2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 45: // Term2 ::= Term _SYMB_38 _SYMB_24 ListTerm _SYMB_30 ListTerm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-6)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_4 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-3)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_6 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg(p_1,p_4,p_6); 
+              CUP$parser$result = new java_cup.runtime.Symbol(11/*Term2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 44: // Term1 ::= Term2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(10/*Term1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 43: // Term1 ::= Term1 _SYMB_29 Term2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(10/*Term1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 42: // Term1 ::= Term1 _SYMB_28 Term2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(10/*Term1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 41: // Term ::= Term1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(9/*Term*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 40: // Term ::= Term _SYMB_27 Term1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(9/*Term*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 39: // Term ::= Term _SYMB_26 Term1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Term RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(9/*Term*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 38: // Stm3 ::= _SYMB_24 Stm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = p_2; 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 37: // Stm3 ::= Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 36: // Stm3 ::= Term _SYMB_24 ListTerm _SYMB_25 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-3)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 35: // Stm3 ::= Term _SYMB_23 Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 34: // Stm3 ::= Term _SYMB_22 Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 33: // Stm3 ::= Term _SYMB_21 Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 32: // Stm3 ::= Term _SYMB_20 Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 31: // Stm3 ::= Term _SYMB_19 Term 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Term p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Term)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*Stm3*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 30: // Stm2 ::= Stm3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*Stm2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 29: // Stm2 ::= _SYMB_40 Stm3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*Stm2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 28: // Stm2 ::= _SYMB_44 Stm3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*Stm2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 27: // Stm2 ::= _SYMB_43 Stm3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*Stm2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 26: // Stm2 ::= _SYMB_42 Stm3 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*Stm2*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 25: // Stm1 ::= Stm2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*Stm1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 24: // Stm1 ::= Stm1 _SYMB_18 Stm2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*Stm1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 23: // Stm1 ::= Stm1 _SYMB_17 Stm2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*Stm1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 22: // Stm1 ::= Stm1 _SYMB_16 Stm2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*Stm1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 21: // Stm1 ::= Stm1 _SYMB_15 Stm2 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*Stm1*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 20: // Stm ::= Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 19: // Stm ::= Stm _SYMB_14 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 18: // Stm ::= Stm _SYMB_13 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 17: // Stm ::= Stm _SYMB_12 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 16: // Stm ::= Stm _SYMB_11 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 15: // Stm ::= Stm _SYMB_10 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 14: // Stm ::= Stm _SYMB_9 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 13: // Stm ::= Stm _SYMB_8 Stm1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Stm RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_3 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl(p_1,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*Stm*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 12: // Sentence ::= Stm TruthValue _SYMB_7 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal(p_1,p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 11: // Sentence ::= Stm _SYMB_6 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 10: // Sentence ::= Stm TruthValue _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Stm)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge(p_1,p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 9: // Sentence ::= _SYMB_5 URIRef _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.URIRef)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 8: // Sentence ::= _SYMB_4 _INTEGER_ _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		Integer p_2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 7: // Sentence ::= _SYMB_3 URILit _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 6: // Sentence ::= _SYMB_2 NSPrefix URILit _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		String p_3 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix(p_2,p_3); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*Sentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 5: // ListSentence ::= ListSentence Sentence 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = p_1; p_1.addLast(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*ListSentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 4: // ListSentence ::= 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence RESULT = null;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence(); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*ListSentence*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 3: // BaseRule ::= _SYMB_0 URILit _SYMB_1 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule RESULT = null;
+		String p_2 = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR(p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(2/*BaseRule*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 2: // Document ::= ListSentence 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Document RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.Doc(p_1); 
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*Document*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 1: // Document ::= BaseRule ListSentence 
+            {
+              com.googlecode.opennars.parser.loan.Loan.Absyn.Document RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule p_1 = (com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence p_2 = (com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR(p_1,p_2); 
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*Document*/, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 0: // $START ::= Document EOF 
+            {
+              Object RESULT = null;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Document start_val = (com.googlecode.opennars.parser.loan.Loan.Absyn.Document)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		RESULT = start_val;
+              CUP$parser$result = new java_cup.runtime.Symbol(0/*$START*/, RESULT);
+            }
+          /* ACCEPT */
+          CUP$parser$parser.done_parsing();
+          return CUP$parser$result;
+
+          /* . . . . . .*/
+          default:
+            throw new Exception(
+               "Invalid action number found in internal parse table");
+
+        }
+    }
+}
+
diff --git a/open-nars/com/googlecode/opennars/parser/loan/Loan/sym.java b/open-nars/com/googlecode/opennars/parser/loan/Loan/sym.java
new file mode 100644
index 0000000..db86f2a
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/Loan/sym.java
@@ -0,0 +1,66 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Fri Apr 04 05:03:03 BST 2008
+//----------------------------------------------------
+
+package com.googlecode.opennars.parser.loan.Loan;
+
+/** CUP generated class containing symbol constants. */
+public class sym {
+  /* terminals */
+  public static final int _SYMB_18 = 20;
+  public static final int _SYMB_17 = 19;
+  public static final int _SYMB_16 = 18;
+  public static final int _SYMB_15 = 17;
+  public static final int _SYMB_14 = 16;
+  public static final int _SYMB_45 = 47;
+  public static final int _SYMB_13 = 15;
+  public static final int _SYMB_44 = 46;
+  public static final int _SYMB_12 = 14;
+  public static final int _SYMB_43 = 45;
+  public static final int _SYMB_11 = 13;
+  public static final int _SYMB_9 = 11;
+  public static final int _SYMB_42 = 44;
+  public static final int _SYMB_8 = 10;
+  public static final int _SYMB_10 = 12;
+  public static final int _SYMB_41 = 43;
+  public static final int _SYMB_7 = 9;
+  public static final int URILit = 52;
+  public static final int _SYMB_40 = 42;
+  public static final int _SYMB_6 = 8;
+  public static final int _SYMB_5 = 7;
+  public static final int _SYMB_4 = 6;
+  public static final int _SYMB_3 = 5;
+  public static final int _SYMB_2 = 4;
+  public static final int _SYMB_1 = 3;
+  public static final int _SYMB_0 = 2;
+  public static final int _IDENT_ = 51;
+  public static final int _INTEGER_ = 49;
+  public static final int _STRING_ = 48;
+  public static final int _SYMB_39 = 41;
+  public static final int _SYMB_38 = 40;
+  public static final int _SYMB_37 = 39;
+  public static final int _SYMB_36 = 38;
+  public static final int _SYMB_35 = 37;
+  public static final int _SYMB_34 = 36;
+  public static final int _SYMB_33 = 35;
+  public static final int _SYMB_32 = 34;
+  public static final int _SYMB_31 = 33;
+  public static final int _SYMB_30 = 32;
+  public static final int EOF = 0;
+  public static final int error = 1;
+  public static final int _SYMB_29 = 31;
+  public static final int _SYMB_28 = 30;
+  public static final int _SYMB_27 = 29;
+  public static final int _SYMB_26 = 28;
+  public static final int _SYMB_25 = 27;
+  public static final int _SYMB_24 = 26;
+  public static final int _SYMB_23 = 25;
+  public static final int _SYMB_22 = 24;
+  public static final int _SYMB_21 = 23;
+  public static final int _SYMB_20 = 22;
+  public static final int _DOUBLE_ = 50;
+  public static final int _SYMB_19 = 21;
+}
+
diff --git a/open-nars/com/googlecode/opennars/parser/loan/LoanParser.java b/open-nars/com/googlecode/opennars/parser/loan/LoanParser.java
new file mode 100644
index 0000000..c663d96
--- /dev/null
+++ b/open-nars/com/googlecode/opennars/parser/loan/LoanParser.java
@@ -0,0 +1,1449 @@
+package com.googlecode.opennars.parser.loan;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import com.googlecode.opennars.entity.Base;
+import com.googlecode.opennars.entity.BudgetValue;
+import com.googlecode.opennars.entity.Sentence;
+import com.googlecode.opennars.entity.Task;
+import com.googlecode.opennars.entity.TruthValue;
+import com.googlecode.opennars.language.BooleanLiteral;
+import com.googlecode.opennars.language.CompoundTerm;
+import com.googlecode.opennars.language.Conjunction;
+import com.googlecode.opennars.language.ConjunctionParallel;
+import com.googlecode.opennars.language.ConjunctionSequence;
+import com.googlecode.opennars.language.DifferenceExt;
+import com.googlecode.opennars.language.DifferenceInt;
+import com.googlecode.opennars.language.Disjunction;
+import com.googlecode.opennars.language.Equivalence;
+import com.googlecode.opennars.language.EquivalenceAfter;
+import com.googlecode.opennars.language.EquivalenceWhen;
+import com.googlecode.opennars.language.ImageExt;
+import com.googlecode.opennars.language.ImageInt;
+import com.googlecode.opennars.language.Implication;
+import com.googlecode.opennars.language.ImplicationAfter;
+import com.googlecode.opennars.language.ImplicationBefore;
+import com.googlecode.opennars.language.ImplicationWhen;
+import com.googlecode.opennars.language.Inheritance;
+import com.googlecode.opennars.language.Instance;
+import com.googlecode.opennars.language.InstanceProperty;
+import com.googlecode.opennars.language.IntersectionExt;
+import com.googlecode.opennars.language.IntersectionInt;
+import com.googlecode.opennars.language.Literal;
+import com.googlecode.opennars.language.Negation;
+import com.googlecode.opennars.language.NumericLiteral;
+import com.googlecode.opennars.language.Product;
+import com.googlecode.opennars.language.Property;
+import com.googlecode.opennars.language.SetExt;
+import com.googlecode.opennars.language.SetInt;
+import com.googlecode.opennars.language.Similarity;
+import com.googlecode.opennars.language.Statement;
+import com.googlecode.opennars.language.StringLiteral;
+import com.googlecode.opennars.language.TenseFuture;
+import com.googlecode.opennars.language.TensePast;
+import com.googlecode.opennars.language.TensePresent;
+import com.googlecode.opennars.language.Term;
+import com.googlecode.opennars.language.URIRef;
+import com.googlecode.opennars.language.Variable;
+import com.googlecode.opennars.main.Memory;
+import com.googlecode.opennars.parser.InvalidInputException;
+import com.googlecode.opennars.parser.Parser;
+import com.googlecode.opennars.parser.Symbols;
+import com.googlecode.opennars.parser.TermVisitor;
+import com.googlecode.opennars.parser.loan.Loan.AbstractVisitor;
+import com.googlecode.opennars.parser.loan.Loan.PrettyPrinter;
+import com.googlecode.opennars.parser.loan.Loan.Yylex;
+import com.googlecode.opennars.parser.loan.Loan.parser;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.Doc;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.Document;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.ListIdent;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.ListTerm;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitString;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.Stm;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.URICur;
+import com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul;
+
+public class LoanParser extends Parser {
+
+	public class SerialiseVisitor implements TermVisitor<Object,LoanParser> {
+
+		/**
+		 * If the provided object is a term, wrap it in a StmTrm object
+		 * @param o the object to (potentially) wrap
+		 * @return the wrapped object
+		 */
+		private Stm wrapTerm(Object o) {
+			if(o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.Term) {
+				return new StmTrm((com.googlecode.opennars.parser.loan.Loan.Absyn.Term) o);
+			}
+			else
+				return (Stm) o;
+		}
+		
+		/**
+		 * If the provided object is a statement, wrap it in a TrmStm object
+		 * @param o the object to (potentially) wrap
+		 * @return the wrapped object
+		 */
+		private com.googlecode.opennars.parser.loan.Loan.Absyn.Term wrapStatement(Object o) {
+			if(o instanceof com.googlecode.opennars.parser.loan.Loan.Absyn.Stm) {
+				return new TrmStm((com.googlecode.opennars.parser.loan.Loan.Absyn.Stm) o);
+			}
+			else
+				return (com.googlecode.opennars.parser.loan.Loan.Absyn.Term) o;
+		}
+		
+		public Object visit(Term p, LoanParser arg) {
+			// TODO: Fix this awful ladder. I wish Java had a more dynamic invocation procedure like Smalltalk or Objective-C
+			if(p instanceof BooleanLiteral)
+				return visit((BooleanLiteral) p, arg);
+			if(p instanceof Conjunction)
+				return visit((Conjunction) p, arg);
+			if(p instanceof ConjunctionParallel)
+				return visit((ConjunctionParallel) p, arg);
+			if(p instanceof ConjunctionSequence)
+				return visit((ConjunctionSequence) p, arg);
+			if(p instanceof DifferenceExt)
+				return visit((DifferenceExt) p, arg);
+			if(p instanceof DifferenceInt)
+				return visit((DifferenceInt) p, arg);
+			if(p instanceof Disjunction)
+				return visit((Disjunction) p, arg);
+			if(p instanceof Equivalence)
+				return visit((Equivalence) p, arg);
+			if(p instanceof EquivalenceAfter)
+				return visit((EquivalenceAfter) p, arg);
+			if(p instanceof EquivalenceWhen)
+				return visit((EquivalenceWhen) p, arg);
+			if(p instanceof ImageExt)
+				return visit((ImageExt) p, arg);
+			if(p instanceof ImageInt)
+				return visit((ImageInt) p, arg);
+			if(p instanceof Implication)
+				return visit((Implication) p, arg);
+			if(p instanceof ImplicationAfter)
+				return visit((ImplicationAfter) p, arg);
+			if(p instanceof ImplicationBefore)
+				return visit((ImplicationBefore) p, arg);
+			if(p instanceof ImplicationWhen)
+				return visit((ImplicationWhen) p, arg);
+			if(p instanceof Inheritance)
+				return visit((Inheritance) p, arg);
+			if(p instanceof Instance)
+				return visit((Instance) p, arg);
+			if(p instanceof InstanceProperty)
+				return visit((InstanceProperty) p, arg);
+			if(p instanceof IntersectionExt)
+				return visit((IntersectionExt) p, arg);
+			if(p instanceof IntersectionInt)
+				return visit((IntersectionInt) p, arg);
+			if(p instanceof Negation)
+				return visit((Negation) p, arg);
+			if(p instanceof NumericLiteral)
+				return visit((NumericLiteral) p, arg);
+			if(p instanceof Product)
+				return visit((Product) p, arg);
+			if(p instanceof Property)
+				return visit((Property) p, arg);
+			if(p instanceof SetExt)
+				return visit((SetExt) p, arg);
+			if(p instanceof SetInt)
+				return visit((SetInt) p, arg);
+			if(p instanceof Similarity)
+				return visit((Similarity) p, arg);
+			if(p instanceof TenseFuture)
+				return visit((TenseFuture) p, arg);
+			if(p instanceof TensePast)
+				return visit((TensePast) p, arg);
+			if(p instanceof TensePresent)
+				return visit((TensePresent) p, arg);
+			if(p instanceof URIRef)
+				return visit((URIRef) p, arg);
+			if(p instanceof Variable)
+				return visit((Variable) p, arg);
+			
+			return new TrmLit(new LitString(p.getName()));
+		}
+		
+		public Object visit(BooleanLiteral p, LoanParser arg) {
+			if(p.getName().equals("true"))
+				return new TrmLit(new LitTrue());
+			else
+				return new TrmLit(new LitFalse());
+		}
+
+		public Object visit(Conjunction p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			Stm s = wrapTerm(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new StmConj(s, wrapTerm(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(ConjunctionParallel p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			Stm s = wrapTerm(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new StmPar(s, wrapTerm(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(ConjunctionSequence p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			Stm s = wrapTerm(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new StmSeq(s, wrapTerm(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(DifferenceExt p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Term t1 = components.get(0);
+			Term t2 = components.get(1);
+			return new TrmExDif(wrapStatement(t1.accept(this, arg)), wrapStatement(t2.accept(this, arg)));
+		}
+
+		public Object visit(DifferenceInt p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Term t1 = components.get(0);
+			Term t2 = components.get(1);
+			return new TrmInDif(wrapStatement(t1.accept(this, arg)), wrapStatement(t2.accept(this, arg)));
+		}
+
+		public Object visit(Disjunction p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			Stm s = wrapTerm(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new StmDisj(s, wrapTerm(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(Equivalence p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmEquiv(subj,pred);
+		}
+
+		public Object visit(EquivalenceAfter p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmEqvPred(subj,pred);
+		}
+
+		public Object visit(EquivalenceWhen p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmEqvConc(subj,pred);
+		}
+
+		public Object visit(ImageExt p, LoanParser arg) {
+			List<Term> pre = p.getComponents().subList(0, p.getRelationIndex());
+			Term reln = p.getComponents().get(p.getRelationIndex());
+			List<Term> post = p.getComponents().subList(p.getRelationIndex() + 1, p.size());
+			
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term relnT = wrapStatement(reln.accept(this, arg));
+			
+			ListTerm preList = new ListTerm();
+			Iterator<Term> iter = pre.iterator();
+			while(iter.hasNext()) {
+				preList.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			
+			ListTerm postList = new ListTerm();
+			iter = post.iterator();
+			while(iter.hasNext()) {
+				postList.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			
+			return new TrmExImg(relnT, preList, postList);
+		}
+
+		public Object visit(ImageInt p, LoanParser arg) {
+			List<Term> pre = p.getComponents().subList(0, p.getRelationIndex());
+			Term reln = p.getComponents().get(p.getRelationIndex());
+			List<Term> post = p.getComponents().subList(p.getRelationIndex() + 1, p.size());
+			
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term relnT = wrapStatement(reln.accept(this, arg));
+			
+			ListTerm preList = new ListTerm();
+			Iterator<Term> iter = pre.iterator();
+			while(iter.hasNext()) {
+				preList.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			
+			ListTerm postList = new ListTerm();
+			iter = post.iterator();
+			while(iter.hasNext()) {
+				postList.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			
+			return new TrmInImg(relnT, preList, postList);
+		}
+
+		public Object visit(Implication p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmImpl(subj,pred);
+		}
+
+		public Object visit(ImplicationAfter p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmImpPred(subj,pred);
+		}
+
+		public Object visit(ImplicationBefore p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmImpRet(subj,pred);
+		}
+		
+		public Object visit(ImplicationWhen p, LoanParser arg) {
+			Stm subj = wrapTerm(p.getSubject().accept(this, arg));
+			Stm pred = wrapTerm(p.getPredicate().accept(this, arg));
+			return new StmImpConc(subj,pred);
+		}
+
+		public Object visit(Inheritance p, LoanParser arg) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term subj = wrapStatement(p.getSubject().accept(this, arg));
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term pred = wrapStatement(p.getPredicate().accept(this, arg));
+			return new StmInher(subj,pred);
+		}
+
+		public Object visit(Instance p, LoanParser arg) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term subj = wrapStatement(p.getSubject().accept(this, arg));
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term pred = wrapStatement(p.getPredicate().accept(this, arg));
+			return new StmInst(subj,pred);
+		}
+
+		public Object visit(InstanceProperty p, LoanParser arg) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term subj = wrapStatement(p.getSubject().accept(this, arg));
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term pred = wrapStatement(p.getPredicate().accept(this, arg));
+			return new StmInPp(subj,pred);
+		}
+
+		public Object visit(IntersectionExt p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term s = wrapStatement(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new TrmExInt(s, wrapStatement(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(IntersectionInt p, LoanParser arg) {
+			ArrayList<Term> components = p.getComponents();
+			Iterator<Term> iter = components.iterator();
+			Term t = iter.next();
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term s = wrapStatement(t.accept(this, arg));
+			while(iter.hasNext()) {
+				s = new TrmInInt(s, wrapStatement(iter.next().accept(this, arg)));
+			}
+			return s;
+		}
+
+		public Object visit(Negation p, LoanParser arg) {
+			Stm s = wrapTerm(p.getComponents().get(0).accept(this, arg));
+			return new StmNot(s);
+		}
+
+		public Object visit(NumericLiteral p, LoanParser arg) {
+			if(p.getType() == NumericLiteral.TYPE.INTEGER)
+				return new TrmLit(new LitInt(Integer.parseInt(p.getName())));
+			else if(p.getType() == NumericLiteral.TYPE.DOUBLE)
+				return new TrmLit(new LitDbl(Double.parseDouble(p.getName())));
+			else
+				return null;
+		}
+
+		public Object visit(Product p, LoanParser arg) {
+			Iterator<Term> iter = p.getComponents().iterator();
+			ListTerm ts = new ListTerm();
+			while(iter.hasNext()) {
+				ts.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			return new TrmProd(ts);
+		}
+
+		public Object visit(Property p, LoanParser arg) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term subj = wrapStatement(p.getSubject().accept(this, arg));
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term pred = wrapStatement(p.getPredicate().accept(this, arg));
+			return new StmProp(subj,pred);
+		}
+
+		public Object visit(SetExt p, LoanParser arg) {
+			Iterator<Term> iter = p.getComponents().iterator();
+			ListTerm ts = new ListTerm();
+			while(iter.hasNext()) {
+				ts.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			return new TrmExSet(ts);
+		}
+
+		public Object visit(SetInt p, LoanParser arg) {
+			Iterator<Term> iter = p.getComponents().iterator();
+			ListTerm ts = new ListTerm();
+			while(iter.hasNext()) {
+				ts.add(wrapStatement(iter.next().accept(this, arg)));
+			}
+			return new TrmInSet(ts);
+		}
+
+		public Object visit(Similarity p, LoanParser arg) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term subj = wrapStatement(p.getSubject().accept(this, arg));
+			com.googlecode.opennars.parser.loan.Loan.Absyn.Term pred = wrapStatement(p.getPredicate().accept(this, arg));
+			return new StmSim(subj,pred);
+		}
+
+		public Object visit(TenseFuture p, LoanParser arg) {
+			Stm s = wrapTerm(p.getComponents().get(0).accept(this, arg));
+			return new StmFut(s);
+		}
+
+		public Object visit(TensePast p, LoanParser arg) {
+			Stm s = wrapTerm(p.getComponents().get(0).accept(this, arg));
+			return new StmPst(s);
+		}
+
+		public Object visit(TensePresent p, LoanParser arg) {
+			Stm s = wrapTerm(p.getComponents().get(0).accept(this, arg));
+			return new StmPres(s);
+		}
+
+		public Object visit(StringLiteral p, LoanParser arg) {
+			return new TrmLit(new LitString(p.getName()));
+		}
+
+		public Object visit(URIRef p, LoanParser arg) {
+			String uriref = p.getName();
+			// Try namespaces first
+			Iterator<String> iter = arg.getNamespaces().keySet().iterator();
+			while(iter.hasNext()) {
+				String pre = iter.next();
+				URI u = arg.getNamespaces().get(pre);
+				// Can we match the start of the URI to any known sequence?
+				if(uriref.startsWith(u.toString())) {
+					// Blank prefix is dealt with separately in the abstract syntax for parsing reasons
+					if(u.equals(""))
+						return new TrmLit(new LitURI(new URICur(new NSPrefix2(), uriref.substring(u.toString().length()))));
+					else
+						return new TrmLit(new LitURI(new URICur(new NSPrefix1(pre), uriref.substring(u.toString().length()))));
+				}
+			}
+			
+			try {
+				// Try resolving against the base
+				URI b = arg.getBaseURI();
+				URI r = b.relativize(new URI(uriref));
+				return new TrmLit(new LitURI(new URIFul("<" + r.toString() + ">")));
+			}
+			catch (URISyntaxException e) {
+				e.printStackTrace();
+			}
+			return new TrmLit(new LitURI(new URIFul("<" + p.getName() + ">")));
+		}
+
+		public Object visit(Variable p, LoanParser arg) {
+			if(p.getType() == Variable.VarType.QUERY)
+				return new TrmLit(new LitQVar(p.getName().substring(1)));
+			else if(p.getType() == Variable.VarType.INDEPENDENT)
+				return new TrmLit(new LitSVarI(p.getName().substring(1)));
+			else if(p.getType() == Variable.VarType.DEPENDENT)
+				return new TrmLit(new LitSVarD(p.getName().substring(1), new ListIdent()));
+			else if(p.getType() == Variable.VarType.ANONYMOUS)
+				return new TrmLit(new LitQVarAn());
+			else
+				return null;
+		}
+
+	}
+
+	public class ParserVisitor extends AbstractVisitor<Object, LoanParser> {
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR, java.lang.Object)
+		 */
+		@Override
+		public Object visit(BaseR p, LoanParser arg) {
+			try {
+				arg.setBaseURI(new URI(p.urilit_.substring(1, p.urilit_.length()-1)));
+			} catch (URISyntaxException e) {
+				e.printStackTrace();
+			}
+			return null;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.Doc, java.lang.Object)
+		 */
+		@Override
+		public Object visit(Doc p, LoanParser arg) {
+			List<Task> tasks = new ArrayList<Task>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence> iter = p.listsentence_.iterator();
+			while(iter.hasNext()) {
+				com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence s = iter.next();
+				Object t = s.accept(this, arg);
+				if(t != null) {
+					if(t instanceof List) // Should only happen with an @import
+						tasks.addAll((Collection<? extends Task>) t);
+					else
+						tasks.add((Task) t);
+				}
+			}
+			return tasks;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.DocBR, java.lang.Object)
+		 */
+		@Override
+		public Object visit(DocBR p, LoanParser arg) {
+			p.baserule_.accept(this, arg);
+			List<Task> tasks = new ArrayList<Task>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence> iter = p.listsentence_.iterator();
+			while(iter.hasNext()) {
+				com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence s = iter.next();
+				Task t = (Task) s.accept(this, arg);
+				if(t != null)
+					tasks.add(t);
+			}
+			return tasks;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitDbl, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitDbl p, LoanParser arg) {
+			return new NumericLiteral(p.double_.doubleValue());
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitFalse, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitFalse p, LoanParser arg) {
+			return new BooleanLiteral(false);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitInt, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitInt p, LoanParser arg) {
+			return new NumericLiteral(p.integer_.intValue());
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVar, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitQVar p, LoanParser arg) {
+			return new Variable("" + Symbols.QUERY_VARIABLE_TAG + p.ident_);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitQVarAn, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitQVarAn p, LoanParser arg) {
+			return new Variable("" + Symbols.QUERY_VARIABLE_TAG);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitString, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitString p, LoanParser arg) {
+			// TODO Auto-generated method stub
+			return new StringLiteral(p.string_);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarD, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitSVarD p, LoanParser arg) {
+			StringBuilder builder = new StringBuilder();
+			builder.append(Symbols.VARIABLE_TAG);
+			builder.append(p.ident_);
+			builder.append(Symbols.COMPOUND_TERM_OPENER);
+			Iterator<String> iter = p.listident_.iterator();
+			while(iter.hasNext()) {
+				builder.append(iter.next());
+				if(iter.hasNext())
+					builder.append(",");
+			}
+			builder.append(Symbols.COMPOUND_TERM_CLOSER);
+			return new Variable(builder.toString());
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitSVarI, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitSVarI p, LoanParser arg) {
+			return new Variable("" + Symbols.VARIABLE_TAG + p.ident_);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitTrue, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitTrue p, LoanParser arg) {
+			return new BooleanLiteral(true);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.LitURI, java.lang.Object)
+		 */
+		@Override
+		public Object visit(LitURI p, LoanParser arg) {
+			URI u = (URI) p.uriref_.accept(this, arg);
+			return new URIRef(u);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix1, java.lang.Object)
+		 */
+		@Override
+		public Object visit(NSPrefix1 p, LoanParser arg) {
+			// TODO Auto-generated method stub
+			return p.ident_;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.NSPrefix2, java.lang.Object)
+		 */
+		@Override
+		public Object visit(NSPrefix2 p, LoanParser arg) {
+			// TODO Auto-generated method stub
+			return "";
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentDelay, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentDelay p, LoanParser arg) {
+			int delay = p.integer_.intValue();
+			for(int i = 0; i < delay; i++)
+				arg.getMemory().cycle();
+			return null;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentGoal p, LoanParser arg) {
+			// Get the truth
+			TruthValue truth = (TruthValue) p.truthvalue_.accept(this, arg);
+			
+			// We don't actually do budget values (yet) in LOAN
+			float priority = memory.getParameters().DEFAULT_GOAL_PRIORITY;
+            float durability = memory.getParameters().DEFAULT_GOAL_DURABILITY;
+            float quality = memory.budgetfunctions.truthToQuality(truth);
+            BudgetValue budget = new BudgetValue(priority, durability, quality, memory);
+            
+            // Process the sentence itself
+            Term content = (Term) p.stm_.accept(this, arg);
+            Base base = new Base();
+            Sentence sentence = Sentence.make(content, Symbols.GOAL_MARK, truth, base, memory);
+            sentence.setInput();
+            
+            return new Task(sentence, budget, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentImport, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentImport p, LoanParser arg) {
+			try {
+				URL u = new URL(p.urilit_.substring(1, p.urilit_.length()-1));
+				BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream()));
+				StringBuilder builder = new StringBuilder();
+				String line = "";
+				while(line != null) {
+					builder.append(line);
+					builder.append("\n");
+					line = reader.readLine();
+				}
+				
+				LoanParser parser = new LoanParser();
+				parser.setBaseURI(u.toURI());
+				List<Task> ts = parser.parseTasks(builder.toString(), memory);
+				return ts;
+			} catch (MalformedURLException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return null;
+			} catch (InvalidInputException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return null;
+			} catch (URISyntaxException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return null;
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return null;
+			}
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentJudge p, LoanParser arg) {
+			// Get the truth
+			TruthValue truth = (TruthValue) p.truthvalue_.accept(this, arg);
+			
+			// We don't actually do budget values (yet) in LOAN
+			float priority = memory.getParameters().DEFAULT_JUDGMENT_PRIORITY;
+            float durability = memory.getParameters().DEFAULT_JUDGMENT_DURABILITY;
+            float quality = memory.budgetfunctions.truthToQuality(truth);
+            BudgetValue budget = new BudgetValue(priority, durability, quality, memory);
+            
+            // Process the sentence itself
+            Term content = (Term) p.stm_.accept(this, arg);
+            Base base = new Base();
+            Sentence sentence = Sentence.make(content, Symbols.JUDGMENT_MARK, truth, base, memory);
+            sentence.setInput();
+            
+            return new Task(sentence, budget, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentOp, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentOp p, LoanParser arg) {
+			// TODO Handle the adding of operators once we can do something with them
+			return null;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentPrefix, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentPrefix p, LoanParser arg) {
+			String pre = (String) p.nsprefix_.accept(this, arg);
+			try {
+				URI u = new URI(p.urilit_.substring(1, p.urilit_.length()-1));
+				arg.getNamespaces().put(pre, u);
+			} catch (URISyntaxException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			return null;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest, java.lang.Object)
+		 */
+		@Override
+		public Object visit(SentQuest p, LoanParser arg) {
+			// Questions don't have truth
+			TruthValue truth = null;
+			
+			// We don't actually do budget values (yet) in LOAN
+			float priority = memory.getParameters().DEFAULT_QUESTION_PRIORITY;
+            float durability = memory.getParameters().DEFAULT_QUESTION_DURABILITY;
+            float quality = 1;
+            BudgetValue budget = new BudgetValue(priority, durability, quality, memory);
+            
+            // Process the sentence itself
+            Term content = (Term) p.stm_.accept(this, arg);
+            Base base = null;
+            Sentence sentence = Sentence.make(content, Symbols.QUESTION_MARK, truth, base, memory);
+            sentence.setInput();
+            
+            // ++DEBUG
+            System.out.println(sentence.toString2());
+            // --DEBUG
+            
+            return new Task(sentence, budget, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmConj, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmConj p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.CONJUNCTION_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmDisj, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmDisj p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.DISJUNCTION_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEquiv, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmEquiv p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return Statement.make(Symbols.EQUIVALENCE_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvConc, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmEqvConc p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return Statement.make(Symbols.EQUIVALENCE_WHEN_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmEqvPred, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmEqvPred p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			
+			return Statement.make(Symbols.EQUIVALENCE_AFTER_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmFut, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmFut p, LoanParser arg) {
+			Term t1 = (Term) p.stm_.accept(this, arg);
+			
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			
+			return CompoundTerm.make(Symbols.FUTURE_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpConc, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmImpConc p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			
+			return Statement.make(Symbols.IMPLICATION_WHEN_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpl, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmImpl p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			
+			return Statement.make(Symbols.IMPLICATION_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpPred, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmImpPred p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			
+			return Statement.make(Symbols.IMPLICATION_AFTER_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmImpRet, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmImpRet p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			
+			return Statement.make(Symbols.IMPLICATION_BEFORE_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInher, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmInher p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			
+			return Statement.make(Symbols.INHERITANCE_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInPp, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmInPp p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			
+			return Statement.make(Symbols.INSTANCE_PROPERTY_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmInst, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmInst p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			
+			return Statement.make(Symbols.INSTANCE_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmNot, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmNot p, LoanParser arg) {
+			Term t1 = (Term) p.stm_.accept(this, arg);
+			
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			
+			return CompoundTerm.make(Symbols.NEGATION_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmOp, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmOp p, LoanParser arg) {
+			// Get the functor
+			Term t1 = (Term) p.term_.accept(this, arg);
+			
+			// Get the arguments
+			ArrayList<Term> opargs = new ArrayList<Term>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_.iterator();
+			while(iter.hasNext()) {
+				Term t = (Term) iter.next().accept(this, arg);
+				opargs.add(t);
+			}
+			
+			// Make arguments into a product
+			Term prod = CompoundTerm.make(Symbols.PRODUCT_OPERATOR, opargs, memory);
+			
+			return Statement.make(Symbols.INHERITANCE_RELATION, prod, t1, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPar, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmPar p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.PARALLEL_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPres, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmPres p, LoanParser arg) {
+			Term t1 = (Term) p.stm_.accept(this, arg);
+			
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			
+			return CompoundTerm.make(Symbols.PRESENT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmProp, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmProp p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			
+			return Statement.make(Symbols.PROPERTY_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmPst, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmPst p, LoanParser arg) {
+			Term t1 = (Term) p.stm_.accept(this, arg);
+			
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			
+			return CompoundTerm.make(Symbols.PAST_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSeq, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmSeq p, LoanParser arg) {
+			Term t1 = (Term) p.stm_1.accept(this, arg);
+			Term t2 = (Term) p.stm_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.SEQUENCE_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmSim, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmSim p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			
+			return Statement.make(Symbols.SIMILARITY_RELATION, t1, t2, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.StmTrm, java.lang.Object)
+		 */
+		@Override
+		public Object visit(StmTrm p, LoanParser arg) {
+			return p.term_.accept(this, arg);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExDif, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmExDif p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.DIFFERENCE_EXT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExImg, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmExImg p, LoanParser arg) {
+			Term reln = (Term) p.term_.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(reln);
+			
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_1.iterator();
+			while(iter.hasNext())
+				ts.add((Term) iter.next().accept(this, arg));
+			ts.add(new Term("" + Symbols.IMAGE_PLACE_HOLDER));
+			iter = p.listterm_2.iterator();
+			while(iter.hasNext())
+				ts.add((Term) iter.next().accept(this, arg));
+			
+			return CompoundTerm.make(Symbols.IMAGE_EXT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExInt, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmExInt p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.INTERSECTION_EXT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmExSet, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmExSet p, LoanParser arg) {
+			ArrayList<Term> ts = new ArrayList<Term>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_.iterator();
+			while(iter.hasNext()) {
+				Term t = (Term) iter.next().accept(this, arg);
+				ts.add(t);
+			}
+			
+			return SetExt.make(ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInDif, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmInDif p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.DIFFERENCE_INT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInImg, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmInImg p, LoanParser arg) {
+			Term reln = (Term) p.term_.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(reln);
+			
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_1.iterator();
+			while(iter.hasNext())
+				ts.add((Term) iter.next().accept(this, arg));
+			ts.add(new Term("" + Symbols.IMAGE_PLACE_HOLDER));
+			iter = p.listterm_2.iterator();
+			while(iter.hasNext())
+				ts.add((Term) iter.next().accept(this, arg));
+			
+			return CompoundTerm.make(Symbols.IMAGE_INT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInInt, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmInInt p, LoanParser arg) {
+			Term t1 = (Term) p.term_1.accept(this, arg);
+			Term t2 = (Term) p.term_2.accept(this, arg);
+			ArrayList<Term> ts = new ArrayList<Term>();
+			ts.add(t1);
+			ts.add(t2);
+			
+			return CompoundTerm.make(Symbols.INTERSECTION_INT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmInSet, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmInSet p, LoanParser arg) {
+			ArrayList<Term> ts = new ArrayList<Term>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_.iterator();
+			while(iter.hasNext()) {
+				Term t = (Term) iter.next().accept(this, arg);
+				ts.add(t);
+			}
+			
+			return SetInt.make(ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmLit, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmLit p, LoanParser arg) {
+			return p.literal_.accept(this, arg);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmProd, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmProd p, LoanParser arg) {
+			ArrayList<Term> ts = new ArrayList<Term>();
+			Iterator<com.googlecode.opennars.parser.loan.Loan.Absyn.Term> iter = p.listterm_.iterator();
+			while(iter.hasNext()) {
+				Term t = (Term) iter.next().accept(this, arg);
+				ts.add(t);
+			}
+			
+			return CompoundTerm.make(Symbols.PRODUCT_OPERATOR, ts, memory);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TrmStm, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TrmStm p, LoanParser arg) {
+			return p.stm_.accept(this, arg);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthE, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TruthE p, LoanParser arg) {
+			return new TruthValue(1, memory.getParameters().DEFAULT_JUDGMENT_CONFIDENCE);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthF, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TruthF p, LoanParser arg) {
+			return new TruthValue(p.double_.floatValue(), memory.getParameters().DEFAULT_JUDGMENT_CONFIDENCE);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC, java.lang.Object)
+		 */
+		@Override
+		public Object visit(TruthFC p, LoanParser arg) {
+			return new TruthValue(p.double_1.floatValue(),p.double_2.floatValue());
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URICur, java.lang.Object)
+		 */
+		@Override
+		public Object visit(URICur p, LoanParser arg) {
+			String pre = (String) p.nsprefix_.accept(this, arg);
+			URI u = arg.getNamespaces().get(pre);
+			return u.resolve(p.ident_);
+		}
+
+		/* (non-Javadoc)
+		 * @see com.googlecode.opennars.parser.loan.Loan.AbstractVisitor#visit(com.googlecode.opennars.parser.loan.Loan.Absyn.URIFul, java.lang.Object)
+		 */
+		@Override
+		public Object visit(URIFul p, LoanParser arg) {
+			URI base = arg.getBaseURI();
+			String u = p.urilit_.substring(1, p.urilit_.length()-1);
+			return base.resolve(u);
+		}
+
+	}
+
+	private Map<String,URI> namespaces = new HashMap<String,URI>();
+	private URI baseURI = null;
+	private Memory memory = null;
+	
+	@Override
+	public Task parseTask(String input, Memory memory)
+			throws InvalidInputException {
+		this.memory = memory;
+		List<Task> tasks = null;
+		Yylex l = new Yylex(new StringReader(input));
+	    parser p = new parser(l);
+	    try {
+			Document parse_tree = p.pDocument();
+			tasks = (List<Task>) parse_tree.accept(new ParserVisitor(), this);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new InvalidInputException();
+		}
+	    if(tasks.size() > 0)
+	    	return tasks.get(0);
+	    else
+	    	return null;
+	}
+
+	@Override
+	public List<Task> parseTasks(String input, Memory memory)
+			throws InvalidInputException {
+		this.memory = memory;
+		List<Task> tasks = null;
+		Yylex l = new Yylex(new StringReader(input));
+	    parser p = new parser(l);
+	    try {
+			Document parse_tree = p.pDocument();
+			tasks = (List<Task>) parse_tree.accept(new ParserVisitor(), this);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new InvalidInputException();
+		}
+	    
+		return tasks;
+	}
+
+	@Override
+	public String serialiseSentence(Sentence task, Memory memory) {
+		com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence ss = new com.googlecode.opennars.parser.loan.Loan.Absyn.ListSentence();
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Sentence s;
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Stm stm = (Stm) ((CompoundTerm) task.getContent()).accept(new SerialiseVisitor(), this);
+		if(task.isJudgment()) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue tv = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC(Double.valueOf(task.getTruth().getFrequency()), Double.valueOf(task.getTruth().getConfidence()));
+			s = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentJudge(stm, tv);
+			ss.add(s);
+		}
+		else if(task.isQuestion()) {
+			s = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentQuest(stm);
+			ss.add(s);
+		}
+		else if(task.isGoal()) {
+			com.googlecode.opennars.parser.loan.Loan.Absyn.TruthValue tv = new com.googlecode.opennars.parser.loan.Loan.Absyn.TruthFC(Double.valueOf(task.getTruth().getFrequency()), Double.valueOf(task.getTruth().getConfidence()));
+			s = new com.googlecode.opennars.parser.loan.Loan.Absyn.SentGoal(stm, tv);
+			ss.add(s);
+		}
+		
+		com.googlecode.opennars.parser.loan.Loan.Absyn.Doc doc = new Doc(ss);
+		return PrettyPrinter.print(doc).replace('\n', ' ');
+	}
+
+	@Override
+	public String serialiseSentences(List<Sentence> tasks, Memory memory) {
+		// TODO: Write this method
+		com.googlecode.opennars.parser.loan.Loan.Absyn.BaseRule br = new com.googlecode.opennars.parser.loan.Loan.Absyn.BaseR(this.getBaseURI().toString());
+		return null;
+	}
+
+	/**
+	 * @return the memory
+	 */
+	public Memory getMemory() {
+		return memory;
+	}
+
+	/**
+	 * @param memory the memory to set
+	 */
+	public void setMemory(Memory memory) {
+		this.memory = memory;
+	}
+
+	/**
+	 * @return the namespaces
+	 */
+	public Map<String, URI> getNamespaces() {
+		return namespaces;
+	}
+
+	/**
+	 * @param namespaces the namespaces to set
+	 */
+	public void setNamespaces(Map<String, URI> namespaces) {
+		this.namespaces = namespaces;
+	}
+
+	/**
+	 * @return the base URI
+	 */
+	public URI getBaseURI() {
+		return baseURI;
+	}
+
+	/**
+	 * @param baseURI the base URI to set
+	 */
+	public void setBaseURI(URI baseURI) {
+		this.baseURI = baseURI;
+	}
+
+}
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loan.g b/open-nars/com/googlecode/opennars/parser/loan/loan.g
index e76fa96..604a9a8 100644
--- a/open-nars/com/googlecode/opennars/parser/loan/loan.g
+++ b/open-nars/com/googlecode/opennars/parser/loan/loan.g
@@ -4,6 +4,17 @@ options {
 	output = AST;
 }
 
+tokens {
+	NUM_LIT = 'numeric';
+	BOOL_LIT = 'boolean';
+	STRING_LIT = 'string';
+	URI = 'uri';
+	CURIE = 'curie';
+	PRODUCT = 'product';
+	JUDGEMENT = 'judgement';
+	GOAL = 'goal';
+}
+
 // $<Parser
 
 document 
@@ -19,7 +30,10 @@ at_rule :	AT_IMPORT^ IRI_REF DOT!
 	;
 
 sentence 
-	:	statement (judgement^|question^|goal^)
+	:	statement ( judgement
+	                  | question
+	                  | goal
+	                  )
 	;
 	
 judgement 
@@ -34,7 +48,7 @@ question
 	;
 	
 truthvalue 
-	:	PERCENT! (DECIMAL | INTEGER) (SEMICOLON DECIMAL)? PERCENT!;
+	:	PERCENT^ (DECIMAL | INTEGER) (SEMICOLON! DECIMAL)? PERCENT!;
 
 statement 
 	:	unary_statement ((CONJ^ | SEMICOLON^ | COMMA^ | DISJ^) unary_statement)*
@@ -62,16 +76,31 @@ ext_set :	OPEN_BRACE^ (term (COMMA! term)*)? CLOSE_BRACE!
 int_set :	LBRACKET^ (term (COMMA! term)*)? RBRACKET!
 	;
 	
+ext_image 
+	:	EXT_IMG^ LPAREN! term COMMA! term_or_wild (COMMA! term_or_wild)* RPAREN!
+	;
+	
+int_image 
+	:	INT_IMG^ LPAREN! term COMMA! term_or_wild (COMMA! term_or_wild)* RPAREN!
+	;
+	
+term_or_wild 
+	:	WILDCARD
+	|	term
+	;
+	
 difference 
 	:	product ((MINUS^ | TILDE^) product)*
 	;
 	
-product :	atomic_term (STAR^ atomic_term)*
+product :	atomic_term (STAR atomic_term)* -> ^(PRODUCT atomic_term*)
 	;
 
 atomic_term 
 	:	ext_set
 	|	int_set
+	|	ext_image
+	|	int_image
 	|	LPAREN! statement RPAREN!
 	|	variable
 	|	iriRef
@@ -94,9 +123,9 @@ statement_variable
 	
 	
 literal
-	:	numericLiteral
-	|	booleanLiteral
-	|	string
+	:	numericLiteral -> ^(NUM_LIT numericLiteral)
+	|	booleanLiteral -> ^(BOOL_LIT booleanLiteral)
+	|	string -> ^(STRING_LIT string)
 	;
 	
 numericLiteral
@@ -134,8 +163,8 @@ string
     ;
 
 iriRef
-    : IRI_REF
-    | prefixedName
+    : IRI_REF -> ^(URI IRI_REF)
+    | prefixedName -> ^(CURIE prefixedName)
     ;
 
 prefixedName
@@ -225,6 +254,17 @@ EQUIVALENCE_CONC
 	:	'<|>'
 	;
 	
+EXT_IMG	:	'ext'
+	;
+	
+INT_IMG :	'int'
+	;
+	
+WILDCARD 
+	:	'_'
+	;
+
+	
 NOT	:	'!!'
 	;
 	
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loan.tokens b/open-nars/com/googlecode/opennars/parser/loan/loan.tokens
deleted file mode 100644
index 61763b1..0000000
--- a/open-nars/com/googlecode/opennars/parser/loan/loan.tokens
+++ /dev/null
@@ -1,76 +0,0 @@
-COMMA=20
-PN_CHARS_U=75
-MINUS=44
-PERCENT=16
-AT_PREFIX=8
-OPEN_BRACE=40
-DOUBLE=49
-AT_BASE=4
-EQUIVALENCE=35
-FALSE=57
-PN_CHARS_BASE=69
-EQUIVALENCE_CONC=37
-QUERY_VAR=47
-AT_DELAY=10
-LBRACKET=42
-INHERITANCE=26
-INSTANCE=28
-TILDE=45
-DECIMAL=17
-QUESTION=15
-CONJ=19
-DISJ=21
-IMPLICATION=31
-DOT=6
-STM_VAR=48
-RANGLE=68
-INTEGER=12
-IMPLICATION_RETRO=33
-FUTURE=25
-RBRACKET=43
-RPAREN=13
-PN_PREFIX=65
-EQUIVALENCE_PRED=36
-LANGLE=67
-LPAREN=11
-INSTANCE_PROPERTY=30
-ECHAR=74
-PLUS=73
-DIGIT=70
-AMPERSAND=38
-INTEGER_NEGATIVE=53
-PNAME_NS=9
-PAST=23
-SIMILARITY=27
-PROPERTY=29
-DECIMAL_POSITIVE=51
-STRING_LITERAL_LONG1=60
-IMPLICATION_PRED=32
-WS=64
-PNAME_LN=62
-LANGTAG=71
-EXCLAMATION=14
-PN_LOCAL=66
-VARNAME=76
-CLOSE_BRACE=41
-COMMENT=78
-PN_CHARS=77
-PRESENT=24
-AT_IMPORT=7
-STRING_LITERAL_LONG2=61
-DOUBLE_NEGATIVE=55
-EXPONENT=72
-SEMICOLON=18
-BAR=39
-DECIMAL_NEGATIVE=54
-IRI_REF=5
-DOUBLE_POSITIVE=52
-REFERENCE=79
-EOL=63
-INTEGER_POSITIVE=50
-STAR=46
-NOT=22
-STRING_LITERAL2=59
-TRUE=56
-STRING_LITERAL1=58
-IMPLICATION_CONC=34
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java b/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
deleted file mode 100644
index 865e1e2..0000000
--- a/open-nars/com/googlecode/opennars/parser/loan/loanLexer.java
+++ /dev/null
@@ -1,3574 +0,0 @@
-package com.googlecode.opennars.parser.loan;
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-public class loanLexer extends Lexer {
-    public static final int COMMA=20;
-    public static final int PN_CHARS_U=75;
-    public static final int MINUS=44;
-    public static final int AT_PREFIX=8;
-    public static final int PERCENT=16;
-    public static final int OPEN_BRACE=40;
-    public static final int DOUBLE=49;
-    public static final int EQUIVALENCE=35;
-    public static final int AT_BASE=4;
-    public static final int FALSE=57;
-    public static final int EQUIVALENCE_CONC=37;
-    public static final int PN_CHARS_BASE=69;
-    public static final int QUERY_VAR=47;
-    public static final int AT_DELAY=10;
-    public static final int LBRACKET=42;
-    public static final int INHERITANCE=26;
-    public static final int INSTANCE=28;
-    public static final int TILDE=45;
-    public static final int DECIMAL=17;
-    public static final int QUESTION=15;
-    public static final int CONJ=19;
-    public static final int DISJ=21;
-    public static final int IMPLICATION=31;
-    public static final int DOT=6;
-    public static final int STM_VAR=48;
-    public static final int RANGLE=68;
-    public static final int INTEGER=12;
-    public static final int IMPLICATION_RETRO=33;
-    public static final int FUTURE=25;
-    public static final int RBRACKET=43;
-    public static final int RPAREN=13;
-    public static final int PN_PREFIX=65;
-    public static final int EQUIVALENCE_PRED=36;
-    public static final int LANGLE=67;
-    public static final int LPAREN=11;
-    public static final int INSTANCE_PROPERTY=30;
-    public static final int ECHAR=74;
-    public static final int PLUS=73;
-    public static final int DIGIT=70;
-    public static final int AMPERSAND=38;
-    public static final int PAST=23;
-    public static final int PNAME_NS=9;
-    public static final int INTEGER_NEGATIVE=53;
-    public static final int SIMILARITY=27;
-    public static final int PROPERTY=29;
-    public static final int DECIMAL_POSITIVE=51;
-    public static final int STRING_LITERAL_LONG1=60;
-    public static final int IMPLICATION_PRED=32;
-    public static final int WS=64;
-    public static final int PNAME_LN=62;
-    public static final int EXCLAMATION=14;
-    public static final int LANGTAG=71;
-    public static final int PN_LOCAL=66;
-    public static final int CLOSE_BRACE=41;
-    public static final int VARNAME=76;
-    public static final int COMMENT=78;
-    public static final int PN_CHARS=77;
-    public static final int PRESENT=24;
-    public static final int AT_IMPORT=7;
-    public static final int DOUBLE_NEGATIVE=55;
-    public static final int STRING_LITERAL_LONG2=61;
-    public static final int SEMICOLON=18;
-    public static final int EXPONENT=72;
-    public static final int BAR=39;
-    public static final int DECIMAL_NEGATIVE=54;
-    public static final int IRI_REF=5;
-    public static final int EOF=-1;
-    public static final int DOUBLE_POSITIVE=52;
-    public static final int EOL=63;
-    public static final int REFERENCE=79;
-    public static final int Tokens=80;
-    public static final int INTEGER_POSITIVE=50;
-    public static final int STAR=46;
-    public static final int NOT=22;
-    public static final int TRUE=56;
-    public static final int STRING_LITERAL2=59;
-    public static final int STRING_LITERAL1=58;
-    public static final int IMPLICATION_CONC=34;
-    public loanLexer() {;} 
-    public loanLexer(CharStream input) {
-        super(input);
-    }
-    public String getGrammarFileName() { return "/Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g"; }
-
-    // $ANTLR start WS
-    public final void mWS() throws RecognitionException {
-        try {
-            int _type = WS;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:5: ( ( ' ' | '\\t' | EOL )+ )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:7: ( ' ' | '\\t' | EOL )+
-            {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:152:7: ( ' ' | '\\t' | EOL )+
-            int cnt1=0;
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-
-                if ( ((LA1_0>='\t' && LA1_0<='\n')||LA1_0=='\r'||LA1_0==' ') ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.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 ( cnt1 >= 1 ) break loop1;
-                        EarlyExitException eee =
-                            new EarlyExitException(1, input);
-                        throw eee;
-                }
-                cnt1++;
-            } while (true);
-
-             channel=HIDDEN; 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end WS
-
-    // $ANTLR start AT_IMPORT
-    public final void mAT_IMPORT() throws RecognitionException {
-        try {
-            int _type = AT_IMPORT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:156:2: ( '@import' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:156:4: '@import'
-            {
-            match("@import"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AT_IMPORT
-
-    // $ANTLR start AT_PREFIX
-    public final void mAT_PREFIX() throws RecognitionException {
-        try {
-            int _type = AT_PREFIX;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:160:2: ( '@prefix' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:160:4: '@prefix'
-            {
-            match("@prefix"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AT_PREFIX
-
-    // $ANTLR start AT_BASE
-    public final void mAT_BASE() throws RecognitionException {
-        try {
-            int _type = AT_BASE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:163:9: ( '@base' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:163:11: '@base'
-            {
-            match("@base"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AT_BASE
-
-    // $ANTLR start AT_DELAY
-    public final void mAT_DELAY() throws RecognitionException {
-        try {
-            int _type = AT_DELAY;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:167:2: ( '@delay' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:167:4: '@delay'
-            {
-            match("@delay"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AT_DELAY
-
-    // $ANTLR start INHERITANCE
-    public final void mINHERITANCE() throws RecognitionException {
-        try {
-            int _type = INHERITANCE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:172:2: ( '-->' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:172:4: '-->'
-            {
-            match("-->"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INHERITANCE
-
-    // $ANTLR start SIMILARITY
-    public final void mSIMILARITY() throws RecognitionException {
-        try {
-            int _type = SIMILARITY;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:176:2: ( '<->' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:176:4: '<->'
-            {
-            match("<->"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end SIMILARITY
-
-    // $ANTLR start INSTANCE
-    public final void mINSTANCE() throws RecognitionException {
-        try {
-            int _type = INSTANCE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:180:2: ( '}->' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:180:4: '}->'
-            {
-            match("}->"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INSTANCE
-
-    // $ANTLR start PROPERTY
-    public final void mPROPERTY() throws RecognitionException {
-        try {
-            int _type = PROPERTY;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:185:2: ( '--[' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:185:4: '--['
-            {
-            match("--["); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PROPERTY
-
-    // $ANTLR start INSTANCE_PROPERTY
-    public final void mINSTANCE_PROPERTY() throws RecognitionException {
-        try {
-            int _type = INSTANCE_PROPERTY;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:190:2: ( '}-[' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:190:4: '}-['
-            {
-            match("}-["); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INSTANCE_PROPERTY
-
-    // $ANTLR start IMPLICATION
-    public final void mIMPLICATION() throws RecognitionException {
-        try {
-            int _type = IMPLICATION;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:195:2: ( '==>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:195:4: '==>'
-            {
-            match("==>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IMPLICATION
-
-    // $ANTLR start IMPLICATION_PRED
-    public final void mIMPLICATION_PRED() throws RecognitionException {
-        try {
-            int _type = IMPLICATION_PRED;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:200:2: ( '=/>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:200:4: '=/>'
-            {
-            match("=/>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IMPLICATION_PRED
-
-    // $ANTLR start IMPLICATION_RETRO
-    public final void mIMPLICATION_RETRO() throws RecognitionException {
-        try {
-            int _type = IMPLICATION_RETRO;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:205:2: ( '=\\\\>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:205:4: '=\\\\>'
-            {
-            match("=\\>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IMPLICATION_RETRO
-
-    // $ANTLR start IMPLICATION_CONC
-    public final void mIMPLICATION_CONC() throws RecognitionException {
-        try {
-            int _type = IMPLICATION_CONC;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:210:2: ( '=|>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:210:4: '=|>'
-            {
-            match("=|>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IMPLICATION_CONC
-
-    // $ANTLR start EQUIVALENCE
-    public final void mEQUIVALENCE() throws RecognitionException {
-        try {
-            int _type = EQUIVALENCE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:215:2: ( '<=>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:215:4: '<=>'
-            {
-            match("<=>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EQUIVALENCE
-
-    // $ANTLR start EQUIVALENCE_PRED
-    public final void mEQUIVALENCE_PRED() throws RecognitionException {
-        try {
-            int _type = EQUIVALENCE_PRED;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:220:2: ( '</>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:220:4: '</>'
-            {
-            match("</>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EQUIVALENCE_PRED
-
-    // $ANTLR start EQUIVALENCE_CONC
-    public final void mEQUIVALENCE_CONC() throws RecognitionException {
-        try {
-            int _type = EQUIVALENCE_CONC;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:225:2: ( '<|>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:225:4: '<|>'
-            {
-            match("<|>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EQUIVALENCE_CONC
-
-    // $ANTLR start NOT
-    public final void mNOT() throws RecognitionException {
-        try {
-            int _type = NOT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:228:5: ( '!!' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:228:7: '!!'
-            {
-            match("!!"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end NOT
-
-    // $ANTLR start PAST
-    public final void mPAST() throws RecognitionException {
-        try {
-            int _type = PAST;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:231:6: ( '\\\\>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:231:8: '\\\\>'
-            {
-            match("\\>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PAST
-
-    // $ANTLR start PRESENT
-    public final void mPRESENT() throws RecognitionException {
-        try {
-            int _type = PRESENT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:234:9: ( '|>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:234:11: '|>'
-            {
-            match("|>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PRESENT
-
-    // $ANTLR start FUTURE
-    public final void mFUTURE() throws RecognitionException {
-        try {
-            int _type = FUTURE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:237:9: ( '/>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:237:11: '/>'
-            {
-            match("/>"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FUTURE
-
-    // $ANTLR start CONJ
-    public final void mCONJ() throws RecognitionException {
-        try {
-            int _type = CONJ;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:240:6: ( '&&' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:240:8: '&&'
-            {
-            match("&&"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end CONJ
-
-    // $ANTLR start DISJ
-    public final void mDISJ() throws RecognitionException {
-        try {
-            int _type = DISJ;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:243:6: ( '||' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:243:8: '||'
-            {
-            match("||"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DISJ
-
-    // $ANTLR start OPEN_BRACE
-    public final void mOPEN_BRACE() throws RecognitionException {
-        try {
-            int _type = OPEN_BRACE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:247:2: ( '{' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:247:4: '{'
-            {
-            match('{'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end OPEN_BRACE
-
-    // $ANTLR start CLOSE_BRACE
-    public final void mCLOSE_BRACE() throws RecognitionException {
-        try {
-            int _type = CLOSE_BRACE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:251:2: ( '}' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:251:4: '}'
-            {
-            match('}'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end CLOSE_BRACE
-
-    // $ANTLR start LPAREN
-    public final void mLPAREN() throws RecognitionException {
-        try {
-            int _type = LPAREN;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:254:8: ( '(' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:254:10: '('
-            {
-            match('('); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LPAREN
-
-    // $ANTLR start RPAREN
-    public final void mRPAREN() throws RecognitionException {
-        try {
-            int _type = RPAREN;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:257:8: ( ')' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:257:10: ')'
-            {
-            match(')'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RPAREN
-
-    // $ANTLR start LBRACKET
-    public final void mLBRACKET() throws RecognitionException {
-        try {
-            int _type = LBRACKET;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:261:2: ( '[' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:261:4: '['
-            {
-            match('['); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LBRACKET
-
-    // $ANTLR start RBRACKET
-    public final void mRBRACKET() throws RecognitionException {
-        try {
-            int _type = RBRACKET;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:265:2: ( ']' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:265:4: ']'
-            {
-            match(']'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RBRACKET
-
-    // $ANTLR start PNAME_NS
-    public final void mPNAME_NS() throws RecognitionException {
-        try {
-            int _type = PNAME_NS;
-            Token p=null;
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:5: ( (p= PN_PREFIX )? ':' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:7: (p= PN_PREFIX )? ':'
-            {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:8: (p= PN_PREFIX )?
-            int alt2=2;
-            int LA2_0 = input.LA(1);
-
-            if ( ((LA2_0>='A' && LA2_0<='Z')||(LA2_0>='a' && LA2_0<='z')||(LA2_0>='\u00C0' && LA2_0<='\u00D6')||(LA2_0>='\u00D8' && LA2_0<='\u00F6')||(LA2_0>='\u00F8' && LA2_0<='\u02FF')||(LA2_0>='\u0370' && LA2_0<='\u037D')||(LA2_0>='\u037F' && LA2_0<='\u1FFF')||(LA2_0>='\u200C' && LA2_0<='\u200D')||(LA2_0>='\u2070' && LA2_0<='\u218F')||(LA2_0>='\u2C00' && LA2_0<='\u2FEF')||(LA2_0>='\u3001' && LA2_0<='\uD7FF')||(LA2_0>='\uF900' && LA2_0<='\uFDCF')||(LA2_0>='\uFDF0' && LA2_0<='\uFFFD')) ) {
-                alt2=1;
-            }
-            switch (alt2) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:271:8: p= PN_PREFIX
-                    {
-                    int pStart439 = getCharIndex();
-                    mPN_PREFIX(); 
-                    p = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, pStart439, getCharIndex()-1);
-
-                    }
-                    break;
-
-            }
-
-            match(':'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PNAME_NS
-
-    // $ANTLR start PNAME_LN
-    public final void mPNAME_LN() throws RecognitionException {
-        try {
-            int _type = PNAME_LN;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:275:5: ( PNAME_NS PN_LOCAL )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:275:7: PNAME_NS PN_LOCAL
-            {
-            mPNAME_NS(); 
-            mPN_LOCAL(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PNAME_LN
-
-    // $ANTLR start TRUE
-    public final void mTRUE() throws RecognitionException {
-        try {
-            int _type = TRUE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:279:5: ( ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' ) )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:279:7: ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' )
-            {
-            if ( input.LA(1)=='T'||input.LA(1)=='t' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='R'||input.LA(1)=='r' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='U'||input.LA(1)=='u' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end TRUE
-
-    // $ANTLR start FALSE
-    public final void mFALSE() throws RecognitionException {
-        try {
-            int _type = FALSE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:283:5: ( ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' ) )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:283:7: ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' )
-            {
-            if ( input.LA(1)=='F'||input.LA(1)=='f' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='A'||input.LA(1)=='a' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='S'||input.LA(1)=='s' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FALSE
-
-    // $ANTLR start IRI_REF
-    public final void mIRI_REF() throws RecognitionException {
-        try {
-            int _type = IRI_REF;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:5: ( LANGLE ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )* RANGLE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:7: LANGLE ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )* RANGLE
-            {
-            mLANGLE(); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:14: ( options {greedy=false; } : ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) ) )*
-            loop3:
-            do {
-                int alt3=2;
-                int LA3_0 = input.LA(1);
-
-                if ( (LA3_0=='>') ) {
-                    alt3=2;
-                }
-                else if ( (LA3_0=='!'||(LA3_0>='#' && LA3_0<=';')||LA3_0=='='||(LA3_0>='?' && LA3_0<='[')||LA3_0==']'||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')||(LA3_0>='~' && LA3_0<='\uFFFE')) ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:287:42: ~ ( LANGLE | RANGLE | '\"' | OPEN_BRACE | CLOSE_BRACE | '|' | '^' | '\\\\' | '`' | ( '\\u0000' .. '\\u0020' ) )
-            	    {
-            	    if ( input.LA(1)=='!'||(input.LA(1)>='#' && input.LA(1)<=';')||input.LA(1)=='='||(input.LA(1)>='?' && input.LA(1)<='[')||input.LA(1)==']'||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='~' && input.LA(1)<='\uFFFE') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recover(mse);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop3;
-                }
-            } while (true);
-
-            mRANGLE(); 
-             setText(getText().substring(1, getText().length() - 1)); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IRI_REF
-
-    // $ANTLR start LANGTAG
-    public final void mLANGTAG() throws RecognitionException {
-        try {
-            int _type = LANGTAG;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:5: ( '@' ( PN_CHARS_BASE )+ ( MINUS ( PN_CHARS_BASE DIGIT )+ )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:7: '@' ( PN_CHARS_BASE )+ ( MINUS ( PN_CHARS_BASE DIGIT )+ )*
-            {
-            match('@'); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:11: ( PN_CHARS_BASE )+
-            int cnt4=0;
-            loop4:
-            do {
-                int alt4=2;
-                int LA4_0 = input.LA(1);
-
-                if ( ((LA4_0>='A' && LA4_0<='Z')||(LA4_0>='a' && LA4_0<='z')||(LA4_0>='\u00C0' && LA4_0<='\u00D6')||(LA4_0>='\u00D8' && LA4_0<='\u00F6')||(LA4_0>='\u00F8' && LA4_0<='\u02FF')||(LA4_0>='\u0370' && LA4_0<='\u037D')||(LA4_0>='\u037F' && LA4_0<='\u1FFF')||(LA4_0>='\u200C' && LA4_0<='\u200D')||(LA4_0>='\u2070' && LA4_0<='\u218F')||(LA4_0>='\u2C00' && LA4_0<='\u2FEF')||(LA4_0>='\u3001' && LA4_0<='\uD7FF')||(LA4_0>='\uF900' && LA4_0<='\uFDCF')||(LA4_0>='\uFDF0' && LA4_0<='\uFFFD')) ) {
-                    alt4=1;
-                }
-
-
-                switch (alt4) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:11: PN_CHARS_BASE
-            	    {
-            	    mPN_CHARS_BASE(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt4 >= 1 ) break loop4;
-                        EarlyExitException eee =
-                            new EarlyExitException(4, input);
-                        throw eee;
-                }
-                cnt4++;
-            } while (true);
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:26: ( MINUS ( PN_CHARS_BASE DIGIT )+ )*
-            loop6:
-            do {
-                int alt6=2;
-                int LA6_0 = input.LA(1);
-
-                if ( (LA6_0=='-') ) {
-                    alt6=1;
-                }
-
-
-                switch (alt6) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:27: MINUS ( PN_CHARS_BASE DIGIT )+
-            	    {
-            	    mMINUS(); 
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:33: ( PN_CHARS_BASE DIGIT )+
-            	    int cnt5=0;
-            	    loop5:
-            	    do {
-            	        int alt5=2;
-            	        int LA5_0 = input.LA(1);
-
-            	        if ( ((LA5_0>='A' && LA5_0<='Z')||(LA5_0>='a' && LA5_0<='z')||(LA5_0>='\u00C0' && LA5_0<='\u00D6')||(LA5_0>='\u00D8' && LA5_0<='\u00F6')||(LA5_0>='\u00F8' && LA5_0<='\u02FF')||(LA5_0>='\u0370' && LA5_0<='\u037D')||(LA5_0>='\u037F' && LA5_0<='\u1FFF')||(LA5_0>='\u200C' && LA5_0<='\u200D')||(LA5_0>='\u2070' && LA5_0<='\u218F')||(LA5_0>='\u2C00' && LA5_0<='\u2FEF')||(LA5_0>='\u3001' && LA5_0<='\uD7FF')||(LA5_0>='\uF900' && LA5_0<='\uFDCF')||(LA5_0>='\uFDF0' && LA5_0<='\uFFFD')) ) {
-            	            alt5=1;
-            	        }
-
-
-            	        switch (alt5) {
-            	    	case 1 :
-            	    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:291:34: PN_CHARS_BASE DIGIT
-            	    	    {
-            	    	    mPN_CHARS_BASE(); 
-            	    	    mDIGIT(); 
-
-            	    	    }
-            	    	    break;
-
-            	    	default :
-            	    	    if ( cnt5 >= 1 ) break loop5;
-            	                EarlyExitException eee =
-            	                    new EarlyExitException(5, input);
-            	                throw eee;
-            	        }
-            	        cnt5++;
-            	    } while (true);
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop6;
-                }
-            } while (true);
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LANGTAG
-
-    // $ANTLR start QUERY_VAR
-    public final void mQUERY_VAR() throws RecognitionException {
-        try {
-            int _type = QUERY_VAR;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:295:2: ( '?' PN_LOCAL )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:295:4: '?' PN_LOCAL
-            {
-            match('?'); 
-            mPN_LOCAL(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end QUERY_VAR
-
-    // $ANTLR start STM_VAR
-    public final void mSTM_VAR() throws RecognitionException {
-        try {
-            int _type = STM_VAR;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:9: ( '#' PN_LOCAL ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:11: '#' PN_LOCAL ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )?
-            {
-            match('#'); 
-            mPN_LOCAL(); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:24: ( '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')' )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( (LA9_0=='(') ) {
-                alt9=1;
-            }
-            switch (alt9) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:25: '(' ( PN_LOCAL ( ',' PN_LOCAL )* )? ')'
-                    {
-                    match('('); 
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:29: ( PN_LOCAL ( ',' PN_LOCAL )* )?
-                    int alt8=2;
-                    int LA8_0 = input.LA(1);
-
-                    if ( ((LA8_0>='0' && LA8_0<='9')||(LA8_0>='A' && LA8_0<='Z')||LA8_0=='_'||(LA8_0>='a' && LA8_0<='z')||(LA8_0>='\u00C0' && LA8_0<='\u00D6')||(LA8_0>='\u00D8' && LA8_0<='\u00F6')||(LA8_0>='\u00F8' && LA8_0<='\u02FF')||(LA8_0>='\u0370' && LA8_0<='\u037D')||(LA8_0>='\u037F' && LA8_0<='\u1FFF')||(LA8_0>='\u200C' && LA8_0<='\u200D')||(LA8_0>='\u2070' && LA8_0<='\u218F')||(LA8_0>='\u2C00' && LA8_0<='\u2FEF')||(LA8_0>='\u3001' && LA8_0<='\uD7FF')||(LA8_0>='\uF900' && LA8_0<='\uFDCF')||(LA8_0>='\uFDF0' && LA8_0<='\uFFFD')) ) {
-                        alt8=1;
-                    }
-                    switch (alt8) {
-                        case 1 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:30: PN_LOCAL ( ',' PN_LOCAL )*
-                            {
-                            mPN_LOCAL(); 
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:39: ( ',' PN_LOCAL )*
-                            loop7:
-                            do {
-                                int alt7=2;
-                                int LA7_0 = input.LA(1);
-
-                                if ( (LA7_0==',') ) {
-                                    alt7=1;
-                                }
-
-
-                                switch (alt7) {
-                            	case 1 :
-                            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:298:40: ',' PN_LOCAL
-                            	    {
-                            	    match(','); 
-                            	    mPN_LOCAL(); 
-
-                            	    }
-                            	    break;
-
-                            	default :
-                            	    break loop7;
-                                }
-                            } while (true);
-
-
-                            }
-                            break;
-
-                    }
-
-                    match(')'); 
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STM_VAR
-
-    // $ANTLR start INTEGER
-    public final void mINTEGER() throws RecognitionException {
-        try {
-            int _type = INTEGER;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:5: ( ( DIGIT )+ )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: ( DIGIT )+
-            {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: ( DIGIT )+
-            int cnt10=0;
-            loop10:
-            do {
-                int alt10=2;
-                int LA10_0 = input.LA(1);
-
-                if ( ((LA10_0>='0' && LA10_0<='9')) ) {
-                    alt10=1;
-                }
-
-
-                switch (alt10) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:302:7: DIGIT
-            	    {
-            	    mDIGIT(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt10 >= 1 ) break loop10;
-                        EarlyExitException eee =
-                            new EarlyExitException(10, input);
-                        throw eee;
-                }
-                cnt10++;
-            } while (true);
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INTEGER
-
-    // $ANTLR start DECIMAL
-    public final void mDECIMAL() throws RecognitionException {
-        try {
-            int _type = DECIMAL;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:5: ( ( DIGIT )+ DOT ( DIGIT )* | DOT ( DIGIT )+ )
-            int alt14=2;
-            int LA14_0 = input.LA(1);
-
-            if ( ((LA14_0>='0' && LA14_0<='9')) ) {
-                alt14=1;
-            }
-            else if ( (LA14_0=='.') ) {
-                alt14=2;
-            }
-            else {
-                NoViableAltException nvae =
-                    new NoViableAltException("305:1: DECIMAL : ( ( DIGIT )+ DOT ( DIGIT )* | DOT ( DIGIT )+ );", 14, 0, input);
-
-                throw nvae;
-            }
-            switch (alt14) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: ( DIGIT )+ DOT ( DIGIT )*
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: ( DIGIT )+
-                    int cnt11=0;
-                    loop11:
-                    do {
-                        int alt11=2;
-                        int LA11_0 = input.LA(1);
-
-                        if ( ((LA11_0>='0' && LA11_0<='9')) ) {
-                            alt11=1;
-                        }
-
-
-                        switch (alt11) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:7: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt11 >= 1 ) break loop11;
-                                EarlyExitException eee =
-                                    new EarlyExitException(11, input);
-                                throw eee;
-                        }
-                        cnt11++;
-                    } while (true);
-
-                    mDOT(); 
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:18: ( DIGIT )*
-                    loop12:
-                    do {
-                        int alt12=2;
-                        int LA12_0 = input.LA(1);
-
-                        if ( ((LA12_0>='0' && LA12_0<='9')) ) {
-                            alt12=1;
-                        }
-
-
-                        switch (alt12) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:306:18: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop12;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:7: DOT ( DIGIT )+
-                    {
-                    mDOT(); 
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:11: ( DIGIT )+
-                    int cnt13=0;
-                    loop13:
-                    do {
-                        int alt13=2;
-                        int LA13_0 = input.LA(1);
-
-                        if ( ((LA13_0>='0' && LA13_0<='9')) ) {
-                            alt13=1;
-                        }
-
-
-                        switch (alt13) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:307:11: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt13 >= 1 ) break loop13;
-                                EarlyExitException eee =
-                                    new EarlyExitException(13, input);
-                                throw eee;
-                        }
-                        cnt13++;
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DECIMAL
-
-    // $ANTLR start DOUBLE
-    public final void mDOUBLE() throws RecognitionException {
-        try {
-            int _type = DOUBLE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:5: ( ( DIGIT )+ DOT ( DIGIT )* EXPONENT | DOT ( DIGIT )+ EXPONENT | ( DIGIT )+ EXPONENT )
-            int alt19=3;
-            alt19 = dfa19.predict(input);
-            switch (alt19) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: ( DIGIT )+ DOT ( DIGIT )* EXPONENT
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: ( DIGIT )+
-                    int cnt15=0;
-                    loop15:
-                    do {
-                        int alt15=2;
-                        int LA15_0 = input.LA(1);
-
-                        if ( ((LA15_0>='0' && LA15_0<='9')) ) {
-                            alt15=1;
-                        }
-
-
-                        switch (alt15) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:7: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt15 >= 1 ) break loop15;
-                                EarlyExitException eee =
-                                    new EarlyExitException(15, input);
-                                throw eee;
-                        }
-                        cnt15++;
-                    } while (true);
-
-                    mDOT(); 
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:18: ( DIGIT )*
-                    loop16:
-                    do {
-                        int alt16=2;
-                        int LA16_0 = input.LA(1);
-
-                        if ( ((LA16_0>='0' && LA16_0<='9')) ) {
-                            alt16=1;
-                        }
-
-
-                        switch (alt16) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:311:18: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop16;
-                        }
-                    } while (true);
-
-                    mEXPONENT(); 
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:7: DOT ( DIGIT )+ EXPONENT
-                    {
-                    mDOT(); 
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:11: ( DIGIT )+
-                    int cnt17=0;
-                    loop17:
-                    do {
-                        int alt17=2;
-                        int LA17_0 = input.LA(1);
-
-                        if ( ((LA17_0>='0' && LA17_0<='9')) ) {
-                            alt17=1;
-                        }
-
-
-                        switch (alt17) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:312:11: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt17 >= 1 ) break loop17;
-                                EarlyExitException eee =
-                                    new EarlyExitException(17, input);
-                                throw eee;
-                        }
-                        cnt17++;
-                    } while (true);
-
-                    mEXPONENT(); 
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: ( DIGIT )+ EXPONENT
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: ( DIGIT )+
-                    int cnt18=0;
-                    loop18:
-                    do {
-                        int alt18=2;
-                        int LA18_0 = input.LA(1);
-
-                        if ( ((LA18_0>='0' && LA18_0<='9')) ) {
-                            alt18=1;
-                        }
-
-
-                        switch (alt18) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:313:7: DIGIT
-                    	    {
-                    	    mDIGIT(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt18 >= 1 ) break loop18;
-                                EarlyExitException eee =
-                                    new EarlyExitException(18, input);
-                                throw eee;
-                        }
-                        cnt18++;
-                    } while (true);
-
-                    mEXPONENT(); 
-
-                    }
-                    break;
-
-            }
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOUBLE
-
-    // $ANTLR start INTEGER_POSITIVE
-    public final void mINTEGER_POSITIVE() throws RecognitionException {
-        try {
-            int _type = INTEGER_POSITIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:317:5: ( PLUS INTEGER )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:317:7: PLUS INTEGER
-            {
-            mPLUS(); 
-            mINTEGER(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INTEGER_POSITIVE
-
-    // $ANTLR start DECIMAL_POSITIVE
-    public final void mDECIMAL_POSITIVE() throws RecognitionException {
-        try {
-            int _type = DECIMAL_POSITIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:321:5: ( PLUS DECIMAL )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:321:7: PLUS DECIMAL
-            {
-            mPLUS(); 
-            mDECIMAL(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DECIMAL_POSITIVE
-
-    // $ANTLR start DOUBLE_POSITIVE
-    public final void mDOUBLE_POSITIVE() throws RecognitionException {
-        try {
-            int _type = DOUBLE_POSITIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:325:5: ( PLUS DOUBLE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:325:7: PLUS DOUBLE
-            {
-            mPLUS(); 
-            mDOUBLE(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOUBLE_POSITIVE
-
-    // $ANTLR start INTEGER_NEGATIVE
-    public final void mINTEGER_NEGATIVE() throws RecognitionException {
-        try {
-            int _type = INTEGER_NEGATIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:329:5: ( MINUS INTEGER )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:329:7: MINUS INTEGER
-            {
-            mMINUS(); 
-            mINTEGER(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INTEGER_NEGATIVE
-
-    // $ANTLR start DECIMAL_NEGATIVE
-    public final void mDECIMAL_NEGATIVE() throws RecognitionException {
-        try {
-            int _type = DECIMAL_NEGATIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:333:5: ( MINUS DECIMAL )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:333:7: MINUS DECIMAL
-            {
-            mMINUS(); 
-            mDECIMAL(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DECIMAL_NEGATIVE
-
-    // $ANTLR start DOUBLE_NEGATIVE
-    public final void mDOUBLE_NEGATIVE() throws RecognitionException {
-        try {
-            int _type = DOUBLE_NEGATIVE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:337:5: ( MINUS DOUBLE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:337:7: MINUS DOUBLE
-            {
-            mMINUS(); 
-            mDOUBLE(); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOUBLE_NEGATIVE
-
-    // $ANTLR start EXPONENT
-    public final void mEXPONENT() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:5: ( ( 'e' | 'E' ) ( PLUS | MINUS )? ( DIGIT )+ )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:7: ( 'e' | 'E' ) ( PLUS | MINUS )? ( DIGIT )+
-            {
-            if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:17: ( PLUS | MINUS )?
-            int alt20=2;
-            int LA20_0 = input.LA(1);
-
-            if ( (LA20_0=='+'||LA20_0=='-') ) {
-                alt20=1;
-            }
-            switch (alt20) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-                    {
-                    if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
-                        input.consume();
-
-                    }
-                    else {
-                        MismatchedSetException mse =
-                            new MismatchedSetException(null,input);
-                        recover(mse);    throw mse;
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:31: ( DIGIT )+
-            int cnt21=0;
-            loop21:
-            do {
-                int alt21=2;
-                int LA21_0 = input.LA(1);
-
-                if ( ((LA21_0>='0' && LA21_0<='9')) ) {
-                    alt21=1;
-                }
-
-
-                switch (alt21) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:342:31: DIGIT
-            	    {
-            	    mDIGIT(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt21 >= 1 ) break loop21;
-                        EarlyExitException eee =
-                            new EarlyExitException(21, input);
-                        throw eee;
-                }
-                cnt21++;
-            } while (true);
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EXPONENT
-
-    // $ANTLR start STRING_LITERAL1
-    public final void mSTRING_LITERAL1() throws RecognitionException {
-        try {
-            int _type = STRING_LITERAL1;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:5: ( '\\'' ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\\'' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:7: '\\'' ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\\''
-            {
-            match('\''); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:12: ( options {greedy=false; } : ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )*
-            loop22:
-            do {
-                int alt22=3;
-                int LA22_0 = input.LA(1);
-
-                if ( (LA22_0=='\'') ) {
-                    alt22=3;
-                }
-                else if ( ((LA22_0>='\u0000' && LA22_0<='\t')||(LA22_0>='\u000B' && LA22_0<='\f')||(LA22_0>='\u000E' && LA22_0<='&')||(LA22_0>='(' && LA22_0<='[')||(LA22_0>=']' && LA22_0<='\uFFFE')) ) {
-                    alt22=1;
-                }
-                else if ( (LA22_0=='\\') ) {
-                    alt22=2;
-                }
-
-
-                switch (alt22) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:40: ~ ( '\\u0027' | '\\u005C' | '\\u000A' | '\\u000D' )
-            	    {
-            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recover(mse);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:346:87: ECHAR
-            	    {
-            	    mECHAR(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop22;
-                }
-            } while (true);
-
-            match('\''); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STRING_LITERAL1
-
-    // $ANTLR start STRING_LITERAL2
-    public final void mSTRING_LITERAL2() throws RecognitionException {
-        try {
-            int _type = STRING_LITERAL2;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:5: ( '\"' ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\"' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:7: '\"' ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )* '\"'
-            {
-            match('\"'); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:12: ( options {greedy=false; } : ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' ) | ECHAR )*
-            loop23:
-            do {
-                int alt23=3;
-                int LA23_0 = input.LA(1);
-
-                if ( (LA23_0=='\"') ) {
-                    alt23=3;
-                }
-                else if ( ((LA23_0>='\u0000' && LA23_0<='\t')||(LA23_0>='\u000B' && LA23_0<='\f')||(LA23_0>='\u000E' && LA23_0<='!')||(LA23_0>='#' && LA23_0<='[')||(LA23_0>=']' && LA23_0<='\uFFFE')) ) {
-                    alt23=1;
-                }
-                else if ( (LA23_0=='\\') ) {
-                    alt23=2;
-                }
-
-
-                switch (alt23) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:40: ~ ( '\\u0022' | '\\u005C' | '\\u000A' | '\\u000D' )
-            	    {
-            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recover(mse);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:350:87: ECHAR
-            	    {
-            	    mECHAR(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop23;
-                }
-            } while (true);
-
-            match('\"'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STRING_LITERAL2
-
-    // $ANTLR start STRING_LITERAL_LONG1
-    public final void mSTRING_LITERAL_LONG1() throws RecognitionException {
-        try {
-            int _type = STRING_LITERAL_LONG1;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:5: ( '\\'\\'\\'' ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )* '\\'\\'\\'' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:9: '\\'\\'\\'' ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )* '\\'\\'\\''
-            {
-            match("\'\'\'"); 
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:18: ( options {greedy=false; } : ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR ) )*
-            loop26:
-            do {
-                int alt26=2;
-                int LA26_0 = input.LA(1);
-
-                if ( (LA26_0=='\'') ) {
-                    int LA26_1 = input.LA(2);
-
-                    if ( (LA26_1=='\'') ) {
-                        int LA26_3 = input.LA(3);
-
-                        if ( (LA26_3=='\'') ) {
-                            alt26=2;
-                        }
-                        else if ( ((LA26_3>='\u0000' && LA26_3<='&')||(LA26_3>='(' && LA26_3<='\uFFFE')) ) {
-                            alt26=1;
-                        }
-
-
-                    }
-                    else if ( ((LA26_1>='\u0000' && LA26_1<='&')||(LA26_1>='(' && LA26_1<='\uFFFE')) ) {
-                        alt26=1;
-                    }
-
-
-                }
-                else if ( ((LA26_0>='\u0000' && LA26_0<='&')||(LA26_0>='(' && LA26_0<='\uFFFE')) ) {
-                    alt26=1;
-                }
-
-
-                switch (alt26) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:46: ( '\\'' | '\\'\\'' )? (~ ( '\\'' | '\\\\' ) | ECHAR )
-            	    {
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:46: ( '\\'' | '\\'\\'' )?
-            	    int alt24=3;
-            	    int LA24_0 = input.LA(1);
-
-            	    if ( (LA24_0=='\'') ) {
-            	        int LA24_1 = input.LA(2);
-
-            	        if ( (LA24_1=='\'') ) {
-            	            alt24=2;
-            	        }
-            	        else if ( ((LA24_1>='\u0000' && LA24_1<='&')||(LA24_1>='(' && LA24_1<='\uFFFE')) ) {
-            	            alt24=1;
-            	        }
-            	    }
-            	    switch (alt24) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:48: '\\''
-            	            {
-            	            match('\''); 
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:55: '\\'\\''
-            	            {
-            	            match("\'\'"); 
-
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:65: (~ ( '\\'' | '\\\\' ) | ECHAR )
-            	    int alt25=2;
-            	    int LA25_0 = input.LA(1);
-
-            	    if ( ((LA25_0>='\u0000' && LA25_0<='&')||(LA25_0>='(' && LA25_0<='[')||(LA25_0>=']' && LA25_0<='\uFFFE')) ) {
-            	        alt25=1;
-            	    }
-            	    else if ( (LA25_0=='\\') ) {
-            	        alt25=2;
-            	    }
-            	    else {
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("354:65: (~ ( '\\'' | '\\\\' ) | ECHAR )", 25, 0, input);
-
-            	        throw nvae;
-            	    }
-            	    switch (alt25) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:67: ~ ( '\\'' | '\\\\' )
-            	            {
-            	            if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-            	                input.consume();
-
-            	            }
-            	            else {
-            	                MismatchedSetException mse =
-            	                    new MismatchedSetException(null,input);
-            	                recover(mse);    throw mse;
-            	            }
-
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:354:82: ECHAR
-            	            {
-            	            mECHAR(); 
-
-            	            }
-            	            break;
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop26;
-                }
-            } while (true);
-
-            match("\'\'\'"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STRING_LITERAL_LONG1
-
-    // $ANTLR start STRING_LITERAL_LONG2
-    public final void mSTRING_LITERAL_LONG2() throws RecognitionException {
-        try {
-            int _type = STRING_LITERAL_LONG2;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:5: ( '\"\"\"' ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )* '\"\"\"' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:9: '\"\"\"' ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )* '\"\"\"'
-            {
-            match("\"\"\""); 
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:15: ( options {greedy=false; } : ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR ) )*
-            loop29:
-            do {
-                int alt29=2;
-                int LA29_0 = input.LA(1);
-
-                if ( (LA29_0=='\"') ) {
-                    int LA29_1 = input.LA(2);
-
-                    if ( (LA29_1=='\"') ) {
-                        int LA29_3 = input.LA(3);
-
-                        if ( (LA29_3=='\"') ) {
-                            alt29=2;
-                        }
-                        else if ( ((LA29_3>='\u0000' && LA29_3<='!')||(LA29_3>='#' && LA29_3<='\uFFFE')) ) {
-                            alt29=1;
-                        }
-
-
-                    }
-                    else if ( ((LA29_1>='\u0000' && LA29_1<='!')||(LA29_1>='#' && LA29_1<='\uFFFE')) ) {
-                        alt29=1;
-                    }
-
-
-                }
-                else if ( ((LA29_0>='\u0000' && LA29_0<='!')||(LA29_0>='#' && LA29_0<='\uFFFE')) ) {
-                    alt29=1;
-                }
-
-
-                switch (alt29) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:43: ( '\"' | '\"\"' )? (~ ( '\"' | '\\\\' ) | ECHAR )
-            	    {
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:43: ( '\"' | '\"\"' )?
-            	    int alt27=3;
-            	    int LA27_0 = input.LA(1);
-
-            	    if ( (LA27_0=='\"') ) {
-            	        int LA27_1 = input.LA(2);
-
-            	        if ( (LA27_1=='\"') ) {
-            	            alt27=2;
-            	        }
-            	        else if ( ((LA27_1>='\u0000' && LA27_1<='!')||(LA27_1>='#' && LA27_1<='\uFFFE')) ) {
-            	            alt27=1;
-            	        }
-            	    }
-            	    switch (alt27) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:45: '\"'
-            	            {
-            	            match('\"'); 
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:51: '\"\"'
-            	            {
-            	            match("\"\""); 
-
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:59: (~ ( '\"' | '\\\\' ) | ECHAR )
-            	    int alt28=2;
-            	    int LA28_0 = input.LA(1);
-
-            	    if ( ((LA28_0>='\u0000' && LA28_0<='!')||(LA28_0>='#' && LA28_0<='[')||(LA28_0>=']' && LA28_0<='\uFFFE')) ) {
-            	        alt28=1;
-            	    }
-            	    else if ( (LA28_0=='\\') ) {
-            	        alt28=2;
-            	    }
-            	    else {
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("358:59: (~ ( '\"' | '\\\\' ) | ECHAR )", 28, 0, input);
-
-            	        throw nvae;
-            	    }
-            	    switch (alt28) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:61: ~ ( '\"' | '\\\\' )
-            	            {
-            	            if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-            	                input.consume();
-
-            	            }
-            	            else {
-            	                MismatchedSetException mse =
-            	                    new MismatchedSetException(null,input);
-            	                recover(mse);    throw mse;
-            	            }
-
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:358:75: ECHAR
-            	            {
-            	            mECHAR(); 
-
-            	            }
-            	            break;
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop29;
-                }
-            } while (true);
-
-            match("\"\"\""); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STRING_LITERAL_LONG2
-
-    // $ANTLR start ECHAR
-    public final void mECHAR() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:363:5: ( '\\\\' ( 't' | 'b' | 'n' | 'r' | 'f' | '\\\\' | '\"' | '\\'' ) )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:363:7: '\\\\' ( 't' | 'b' | 'n' | 'r' | 'f' | '\\\\' | '\"' | '\\'' )
-            {
-            match('\\'); 
-            if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||input.LA(1)=='t' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ECHAR
-
-    // $ANTLR start PN_CHARS_U
-    public final void mPN_CHARS_U() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:368:5: ( PN_CHARS_BASE | '_' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PN_CHARS_U
-
-    // $ANTLR start VARNAME
-    public final void mVARNAME() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:5: ( ( PN_CHARS_U | DIGIT ) ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:7: ( PN_CHARS_U | DIGIT ) ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )*
-            {
-            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.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:373:30: ( PN_CHARS_U | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )*
-            loop30:
-            do {
-                int alt30=2;
-                int LA30_0 = input.LA(1);
-
-                if ( ((LA30_0>='0' && LA30_0<='9')||(LA30_0>='A' && LA30_0<='Z')||LA30_0=='_'||(LA30_0>='a' && LA30_0<='z')||LA30_0=='\u00B7'||(LA30_0>='\u00C0' && LA30_0<='\u00D6')||(LA30_0>='\u00D8' && LA30_0<='\u00F6')||(LA30_0>='\u00F8' && LA30_0<='\u037D')||(LA30_0>='\u037F' && LA30_0<='\u1FFF')||(LA30_0>='\u200C' && LA30_0<='\u200D')||(LA30_0>='\u203F' && LA30_0<='\u2040')||(LA30_0>='\u2070' && LA30_0<='\u218F')||(LA30_0>='\u2C00' && LA30_0<='\u2FEF')||(LA30_0>='\u3001' && LA30_0<='\uD7FF')||(LA30_0>='\uF900' && LA30_0<='\uFDCF')||(LA30_0>='\uFDF0' && LA30_0<='\uFFFD')) ) {
-                    alt30=1;
-                }
-
-
-                switch (alt30) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.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.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recover(mse);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop30;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end VARNAME
-
-    // $ANTLR start PN_CHARS
-    public final void mPN_CHARS() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:378:5: ( PN_CHARS_U | MINUS | DIGIT | '\\u00B7' | '\\u0300' .. '\\u036F' | '\\u203F' .. '\\u2040' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            if ( input.LA(1)=='-'||(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.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PN_CHARS
-
-    // $ANTLR start PN_PREFIX
-    public final void mPN_PREFIX() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:5: ( PN_CHARS_BASE ( ( PN_CHARS | DOT )* PN_CHARS )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:7: PN_CHARS_BASE ( ( PN_CHARS | DOT )* PN_CHARS )?
-            {
-            mPN_CHARS_BASE(); 
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:21: ( ( PN_CHARS | DOT )* PN_CHARS )?
-            int alt32=2;
-            int LA32_0 = input.LA(1);
-
-            if ( ((LA32_0>='-' && LA32_0<='.')||(LA32_0>='0' && LA32_0<='9')||(LA32_0>='A' && LA32_0<='Z')||LA32_0=='_'||(LA32_0>='a' && LA32_0<='z')||LA32_0=='\u00B7'||(LA32_0>='\u00C0' && LA32_0<='\u00D6')||(LA32_0>='\u00D8' && LA32_0<='\u00F6')||(LA32_0>='\u00F8' && LA32_0<='\u037D')||(LA32_0>='\u037F' && LA32_0<='\u1FFF')||(LA32_0>='\u200C' && LA32_0<='\u200D')||(LA32_0>='\u203F' && LA32_0<='\u2040')||(LA32_0>='\u2070' && LA32_0<='\u218F')||(LA32_0>='\u2C00' && LA32_0<='\u2FEF')||(LA32_0>='\u3001' && LA32_0<='\uD7FF')||(LA32_0>='\uF900' && LA32_0<='\uFDCF')||(LA32_0>='\uFDF0' && LA32_0<='\uFFFD')) ) {
-                alt32=1;
-            }
-            switch (alt32) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:22: ( PN_CHARS | DOT )* PN_CHARS
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:388:22: ( PN_CHARS | DOT )*
-                    loop31:
-                    do {
-                        int alt31=2;
-                        int LA31_0 = input.LA(1);
-
-                        if ( (LA31_0=='-'||(LA31_0>='0' && LA31_0<='9')||(LA31_0>='A' && LA31_0<='Z')||LA31_0=='_'||(LA31_0>='a' && LA31_0<='z')||LA31_0=='\u00B7'||(LA31_0>='\u00C0' && LA31_0<='\u00D6')||(LA31_0>='\u00D8' && LA31_0<='\u00F6')||(LA31_0>='\u00F8' && LA31_0<='\u037D')||(LA31_0>='\u037F' && LA31_0<='\u1FFF')||(LA31_0>='\u200C' && LA31_0<='\u200D')||(LA31_0>='\u203F' && LA31_0<='\u2040')||(LA31_0>='\u2070' && LA31_0<='\u218F')||(LA31_0>='\u2C00' && LA31_0<='\u2FEF')||(LA31_0>='\u3001' && LA31_0<='\uD7FF')||(LA31_0>='\uF900' && LA31_0<='\uFDCF')||(LA31_0>='\uFDF0' && LA31_0<='\uFFFD')) ) {
-                            int LA31_1 = input.LA(2);
-
-                            if ( ((LA31_1>='-' && LA31_1<='.')||(LA31_1>='0' && LA31_1<='9')||(LA31_1>='A' && LA31_1<='Z')||LA31_1=='_'||(LA31_1>='a' && LA31_1<='z')||LA31_1=='\u00B7'||(LA31_1>='\u00C0' && LA31_1<='\u00D6')||(LA31_1>='\u00D8' && LA31_1<='\u00F6')||(LA31_1>='\u00F8' && LA31_1<='\u037D')||(LA31_1>='\u037F' && LA31_1<='\u1FFF')||(LA31_1>='\u200C' && LA31_1<='\u200D')||(LA31_1>='\u203F' && LA31_1<='\u2040')||(LA31_1>='\u2070' && LA31_1<='\u218F')||(LA31_1>='\u2C00' && LA31_1<='\u2FEF')||(LA31_1>='\u3001' && LA31_1<='\uD7FF')||(LA31_1>='\uF900' && LA31_1<='\uFDCF')||(LA31_1>='\uFDF0' && LA31_1<='\uFFFD')) ) {
-                                alt31=1;
-                            }
-
-
-                        }
-                        else if ( (LA31_0=='.') ) {
-                            alt31=1;
-                        }
-
-
-                        switch (alt31) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-                    	    {
-                    	    if ( (input.LA(1)>='-' && input.LA(1)<='.')||(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.LA(1)=='\u00B7'||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u203F' && input.LA(1)<='\u2040')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                    	        input.consume();
-
-                    	    }
-                    	    else {
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recover(mse);    throw mse;
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop31;
-                        }
-                    } while (true);
-
-                    mPN_CHARS(); 
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PN_PREFIX
-
-    // $ANTLR start PN_LOCAL
-    public final void mPN_LOCAL() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:5: ( ( PN_CHARS_U | DIGIT ) ( ( PN_CHARS )* PN_CHARS )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:7: ( PN_CHARS_U | DIGIT ) ( ( PN_CHARS )* PN_CHARS )?
-            {
-            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.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:30: ( ( PN_CHARS )* PN_CHARS )?
-            int alt34=2;
-            int LA34_0 = input.LA(1);
-
-            if ( (LA34_0=='-'||(LA34_0>='0' && LA34_0<='9')||(LA34_0>='A' && LA34_0<='Z')||LA34_0=='_'||(LA34_0>='a' && LA34_0<='z')||LA34_0=='\u00B7'||(LA34_0>='\u00C0' && LA34_0<='\u00D6')||(LA34_0>='\u00D8' && LA34_0<='\u00F6')||(LA34_0>='\u00F8' && LA34_0<='\u037D')||(LA34_0>='\u037F' && LA34_0<='\u1FFF')||(LA34_0>='\u200C' && LA34_0<='\u200D')||(LA34_0>='\u203F' && LA34_0<='\u2040')||(LA34_0>='\u2070' && LA34_0<='\u218F')||(LA34_0>='\u2C00' && LA34_0<='\u2FEF')||(LA34_0>='\u3001' && LA34_0<='\uD7FF')||(LA34_0>='\uF900' && LA34_0<='\uFDCF')||(LA34_0>='\uFDF0' && LA34_0<='\uFFFD')) ) {
-                alt34=1;
-            }
-            switch (alt34) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:31: ( PN_CHARS )* PN_CHARS
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:31: ( PN_CHARS )*
-                    loop33:
-                    do {
-                        int alt33=2;
-                        int LA33_0 = input.LA(1);
-
-                        if ( (LA33_0=='-'||(LA33_0>='0' && LA33_0<='9')||(LA33_0>='A' && LA33_0<='Z')||LA33_0=='_'||(LA33_0>='a' && LA33_0<='z')||LA33_0=='\u00B7'||(LA33_0>='\u00C0' && LA33_0<='\u00D6')||(LA33_0>='\u00D8' && LA33_0<='\u00F6')||(LA33_0>='\u00F8' && LA33_0<='\u037D')||(LA33_0>='\u037F' && LA33_0<='\u1FFF')||(LA33_0>='\u200C' && LA33_0<='\u200D')||(LA33_0>='\u203F' && LA33_0<='\u2040')||(LA33_0>='\u2070' && LA33_0<='\u218F')||(LA33_0>='\u2C00' && LA33_0<='\u2FEF')||(LA33_0>='\u3001' && LA33_0<='\uD7FF')||(LA33_0>='\uF900' && LA33_0<='\uFDCF')||(LA33_0>='\uFDF0' && LA33_0<='\uFFFD')) ) {
-                            int LA33_1 = input.LA(2);
-
-                            if ( (LA33_1=='-'||(LA33_1>='0' && LA33_1<='9')||(LA33_1>='A' && LA33_1<='Z')||LA33_1=='_'||(LA33_1>='a' && LA33_1<='z')||LA33_1=='\u00B7'||(LA33_1>='\u00C0' && LA33_1<='\u00D6')||(LA33_1>='\u00D8' && LA33_1<='\u00F6')||(LA33_1>='\u00F8' && LA33_1<='\u037D')||(LA33_1>='\u037F' && LA33_1<='\u1FFF')||(LA33_1>='\u200C' && LA33_1<='\u200D')||(LA33_1>='\u203F' && LA33_1<='\u2040')||(LA33_1>='\u2070' && LA33_1<='\u218F')||(LA33_1>='\u2C00' && LA33_1<='\u2FEF')||(LA33_1>='\u3001' && LA33_1<='\uD7FF')||(LA33_1>='\uF900' && LA33_1<='\uFDCF')||(LA33_1>='\uFDF0' && LA33_1<='\uFFFD')) ) {
-                                alt33=1;
-                            }
-
-
-                        }
-
-
-                        switch (alt33) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:393:32: PN_CHARS
-                    	    {
-                    	    mPN_CHARS(); 
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop33;
-                        }
-                    } while (true);
-
-                    mPN_CHARS(); 
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PN_LOCAL
-
-    // $ANTLR start PN_CHARS_BASE
-    public final void mPN_CHARS_BASE() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:398:5: ( 'A' .. 'Z' | 'a' .. 'z' | '\\u00C0' .. '\\u00D6' | '\\u00D8' .. '\\u00F6' | '\\u00F8' .. '\\u02FF' | '\\u0370' .. '\\u037D' | '\\u037F' .. '\\u1FFF' | '\\u200C' .. '\\u200D' | '\\u2070' .. '\\u218F' | '\\u2C00' .. '\\u2FEF' | '\\u3001' .. '\\uD7FF' | '\\uF900' .. '\\uFDCF' | '\\uFDF0' .. '\\uFFFD' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u02FF')||(input.LA(1)>='\u0370' && input.LA(1)<='\u037D')||(input.LA(1)>='\u037F' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u200C' && input.LA(1)<='\u200D')||(input.LA(1)>='\u2070' && input.LA(1)<='\u218F')||(input.LA(1)>='\u2C00' && input.LA(1)<='\u2FEF')||(input.LA(1)>='\u3001' && input.LA(1)<='\uD7FF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFDCF')||(input.LA(1)>='\uFDF0' && input.LA(1)<='\uFFFD') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PN_CHARS_BASE
-
-    // $ANTLR start DIGIT
-    public final void mDIGIT() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:415:5: ( '0' .. '9' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:415:7: '0' .. '9'
-            {
-            matchRange('0','9'); 
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DIGIT
-
-    // $ANTLR start COMMENT
-    public final void mCOMMENT() throws RecognitionException {
-        try {
-            int _type = COMMENT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:5: ( '//' ( options {greedy=false; } : . )* EOL )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:7: '//' ( options {greedy=false; } : . )* EOL
-            {
-            match("//"); 
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:12: ( options {greedy=false; } : . )*
-            loop35:
-            do {
-                int alt35=2;
-                int LA35_0 = input.LA(1);
-
-                if ( (LA35_0=='\n'||LA35_0=='\r') ) {
-                    alt35=2;
-                }
-                else if ( ((LA35_0>='\u0000' && LA35_0<='\t')||(LA35_0>='\u000B' && LA35_0<='\f')||(LA35_0>='\u000E' && LA35_0<='\uFFFE')) ) {
-                    alt35=1;
-                }
-
-
-                switch (alt35) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:419:39: .
-            	    {
-            	    matchAny(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop35;
-                }
-            } while (true);
-
-            mEOL(); 
-             channel=HIDDEN; 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end COMMENT
-
-    // $ANTLR start EOL
-    public final void mEOL() throws RecognitionException {
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:424:5: ( '\\n' | '\\r' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            if ( input.LA(1)=='\n'||input.LA(1)=='\r' ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EOL
-
-    // $ANTLR start REFERENCE
-    public final void mREFERENCE() throws RecognitionException {
-        try {
-            int _type = REFERENCE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:428:5: ( '^^' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:428:7: '^^'
-            {
-            match("^^"); 
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end REFERENCE
-
-    // $ANTLR start EXCLAMATION
-    public final void mEXCLAMATION() throws RecognitionException {
-        try {
-            int _type = EXCLAMATION;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:431:2: ( '!' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:431:4: '!'
-            {
-            match('!'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EXCLAMATION
-
-    // $ANTLR start QUESTION
-    public final void mQUESTION() throws RecognitionException {
-        try {
-            int _type = QUESTION;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:434:2: ( '?' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:434:4: '?'
-            {
-            match('?'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end QUESTION
-
-    // $ANTLR start DOT
-    public final void mDOT() throws RecognitionException {
-        try {
-            int _type = DOT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:436:5: ( '.' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:436:7: '.'
-            {
-            match('.'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOT
-
-    // $ANTLR start COMMA
-    public final void mCOMMA() throws RecognitionException {
-        try {
-            int _type = COMMA;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:439:7: ( ',' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:439:9: ','
-            {
-            match(','); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end COMMA
-
-    // $ANTLR start SEMICOLON
-    public final void mSEMICOLON() throws RecognitionException {
-        try {
-            int _type = SEMICOLON;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:446:2: ( ';' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:446:4: ';'
-            {
-            match(';'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end SEMICOLON
-
-    // $ANTLR start AMPERSAND
-    public final void mAMPERSAND() throws RecognitionException {
-        try {
-            int _type = AMPERSAND;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:450:2: ( '&' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:450:4: '&'
-            {
-            match('&'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AMPERSAND
-
-    // $ANTLR start BAR
-    public final void mBAR() throws RecognitionException {
-        try {
-            int _type = BAR;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:452:5: ( '|' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:452:7: '|'
-            {
-            match('|'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end BAR
-
-    // $ANTLR start LANGLE
-    public final void mLANGLE() throws RecognitionException {
-        try {
-            int _type = LANGLE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:455:8: ( '<' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:455:10: '<'
-            {
-            match('<'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LANGLE
-
-    // $ANTLR start RANGLE
-    public final void mRANGLE() throws RecognitionException {
-        try {
-            int _type = RANGLE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:458:9: ( '>' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:458:11: '>'
-            {
-            match('>'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RANGLE
-
-    // $ANTLR start PERCENT
-    public final void mPERCENT() throws RecognitionException {
-        try {
-            int _type = PERCENT;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:461:9: ( '%' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:461:11: '%'
-            {
-            match('%'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PERCENT
-
-    // $ANTLR start PLUS
-    public final void mPLUS() throws RecognitionException {
-        try {
-            int _type = PLUS;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:464:6: ( '+' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:464:8: '+'
-            {
-            match('+'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PLUS
-
-    // $ANTLR start MINUS
-    public final void mMINUS() throws RecognitionException {
-        try {
-            int _type = MINUS;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:467:7: ( '-' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:467:9: '-'
-            {
-            match('-'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end MINUS
-
-    // $ANTLR start STAR
-    public final void mSTAR() throws RecognitionException {
-        try {
-            int _type = STAR;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:470:6: ( '*' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:470:8: '*'
-            {
-            match('*'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STAR
-
-    // $ANTLR start TILDE
-    public final void mTILDE() throws RecognitionException {
-        try {
-            int _type = TILDE;
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:473:8: ( '~' )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:473:10: '~'
-            {
-            match('~'); 
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end TILDE
-
-    public void mTokens() throws RecognitionException {
-        // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:8: ( WS | AT_IMPORT | AT_PREFIX | AT_BASE | AT_DELAY | INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC | NOT | PAST | PRESENT | FUTURE | CONJ | DISJ | OPEN_BRACE | CLOSE_BRACE | LPAREN | RPAREN | LBRACKET | RBRACKET | PNAME_NS | PNAME_LN | TRUE | FALSE | IRI_REF | LANGTAG | QUERY_VAR | STM_VAR | INTEGER | DECIMAL | DOUBLE | INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE | INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE | STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 | COMMENT | REFERENCE | EXCLAMATION | QUESTION | DOT | COMMA | SEMICOLON | AMPERSAND | BAR | LANGLE | RANGLE | PERCENT | PLUS | MINUS | STAR | TILDE )
-        int alt36=66;
-        alt36 = dfa36.predict(input);
-        switch (alt36) {
-            case 1 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:10: WS
-                {
-                mWS(); 
-
-                }
-                break;
-            case 2 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:13: AT_IMPORT
-                {
-                mAT_IMPORT(); 
-
-                }
-                break;
-            case 3 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:23: AT_PREFIX
-                {
-                mAT_PREFIX(); 
-
-                }
-                break;
-            case 4 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:33: AT_BASE
-                {
-                mAT_BASE(); 
-
-                }
-                break;
-            case 5 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:41: AT_DELAY
-                {
-                mAT_DELAY(); 
-
-                }
-                break;
-            case 6 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:50: INHERITANCE
-                {
-                mINHERITANCE(); 
-
-                }
-                break;
-            case 7 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:62: SIMILARITY
-                {
-                mSIMILARITY(); 
-
-                }
-                break;
-            case 8 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:73: INSTANCE
-                {
-                mINSTANCE(); 
-
-                }
-                break;
-            case 9 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:82: PROPERTY
-                {
-                mPROPERTY(); 
-
-                }
-                break;
-            case 10 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:91: INSTANCE_PROPERTY
-                {
-                mINSTANCE_PROPERTY(); 
-
-                }
-                break;
-            case 11 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:109: IMPLICATION
-                {
-                mIMPLICATION(); 
-
-                }
-                break;
-            case 12 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:121: IMPLICATION_PRED
-                {
-                mIMPLICATION_PRED(); 
-
-                }
-                break;
-            case 13 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:138: IMPLICATION_RETRO
-                {
-                mIMPLICATION_RETRO(); 
-
-                }
-                break;
-            case 14 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:156: IMPLICATION_CONC
-                {
-                mIMPLICATION_CONC(); 
-
-                }
-                break;
-            case 15 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:173: EQUIVALENCE
-                {
-                mEQUIVALENCE(); 
-
-                }
-                break;
-            case 16 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:185: EQUIVALENCE_PRED
-                {
-                mEQUIVALENCE_PRED(); 
-
-                }
-                break;
-            case 17 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:202: EQUIVALENCE_CONC
-                {
-                mEQUIVALENCE_CONC(); 
-
-                }
-                break;
-            case 18 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:219: NOT
-                {
-                mNOT(); 
-
-                }
-                break;
-            case 19 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:223: PAST
-                {
-                mPAST(); 
-
-                }
-                break;
-            case 20 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:228: PRESENT
-                {
-                mPRESENT(); 
-
-                }
-                break;
-            case 21 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:236: FUTURE
-                {
-                mFUTURE(); 
-
-                }
-                break;
-            case 22 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:243: CONJ
-                {
-                mCONJ(); 
-
-                }
-                break;
-            case 23 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:248: DISJ
-                {
-                mDISJ(); 
-
-                }
-                break;
-            case 24 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:253: OPEN_BRACE
-                {
-                mOPEN_BRACE(); 
-
-                }
-                break;
-            case 25 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:264: CLOSE_BRACE
-                {
-                mCLOSE_BRACE(); 
-
-                }
-                break;
-            case 26 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:276: LPAREN
-                {
-                mLPAREN(); 
-
-                }
-                break;
-            case 27 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:283: RPAREN
-                {
-                mRPAREN(); 
-
-                }
-                break;
-            case 28 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:290: LBRACKET
-                {
-                mLBRACKET(); 
-
-                }
-                break;
-            case 29 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:299: RBRACKET
-                {
-                mRBRACKET(); 
-
-                }
-                break;
-            case 30 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:308: PNAME_NS
-                {
-                mPNAME_NS(); 
-
-                }
-                break;
-            case 31 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:317: PNAME_LN
-                {
-                mPNAME_LN(); 
-
-                }
-                break;
-            case 32 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:326: TRUE
-                {
-                mTRUE(); 
-
-                }
-                break;
-            case 33 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:331: FALSE
-                {
-                mFALSE(); 
-
-                }
-                break;
-            case 34 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:337: IRI_REF
-                {
-                mIRI_REF(); 
-
-                }
-                break;
-            case 35 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:345: LANGTAG
-                {
-                mLANGTAG(); 
-
-                }
-                break;
-            case 36 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:353: QUERY_VAR
-                {
-                mQUERY_VAR(); 
-
-                }
-                break;
-            case 37 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:363: STM_VAR
-                {
-                mSTM_VAR(); 
-
-                }
-                break;
-            case 38 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:371: INTEGER
-                {
-                mINTEGER(); 
-
-                }
-                break;
-            case 39 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:379: DECIMAL
-                {
-                mDECIMAL(); 
-
-                }
-                break;
-            case 40 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:387: DOUBLE
-                {
-                mDOUBLE(); 
-
-                }
-                break;
-            case 41 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:394: INTEGER_POSITIVE
-                {
-                mINTEGER_POSITIVE(); 
-
-                }
-                break;
-            case 42 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:411: DECIMAL_POSITIVE
-                {
-                mDECIMAL_POSITIVE(); 
-
-                }
-                break;
-            case 43 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:428: DOUBLE_POSITIVE
-                {
-                mDOUBLE_POSITIVE(); 
-
-                }
-                break;
-            case 44 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:444: INTEGER_NEGATIVE
-                {
-                mINTEGER_NEGATIVE(); 
-
-                }
-                break;
-            case 45 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:461: DECIMAL_NEGATIVE
-                {
-                mDECIMAL_NEGATIVE(); 
-
-                }
-                break;
-            case 46 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:478: DOUBLE_NEGATIVE
-                {
-                mDOUBLE_NEGATIVE(); 
-
-                }
-                break;
-            case 47 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:494: STRING_LITERAL1
-                {
-                mSTRING_LITERAL1(); 
-
-                }
-                break;
-            case 48 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:510: STRING_LITERAL2
-                {
-                mSTRING_LITERAL2(); 
-
-                }
-                break;
-            case 49 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:526: STRING_LITERAL_LONG1
-                {
-                mSTRING_LITERAL_LONG1(); 
-
-                }
-                break;
-            case 50 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:547: STRING_LITERAL_LONG2
-                {
-                mSTRING_LITERAL_LONG2(); 
-
-                }
-                break;
-            case 51 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:568: COMMENT
-                {
-                mCOMMENT(); 
-
-                }
-                break;
-            case 52 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:576: REFERENCE
-                {
-                mREFERENCE(); 
-
-                }
-                break;
-            case 53 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:586: EXCLAMATION
-                {
-                mEXCLAMATION(); 
-
-                }
-                break;
-            case 54 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:598: QUESTION
-                {
-                mQUESTION(); 
-
-                }
-                break;
-            case 55 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:607: DOT
-                {
-                mDOT(); 
-
-                }
-                break;
-            case 56 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:611: COMMA
-                {
-                mCOMMA(); 
-
-                }
-                break;
-            case 57 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:617: SEMICOLON
-                {
-                mSEMICOLON(); 
-
-                }
-                break;
-            case 58 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:627: AMPERSAND
-                {
-                mAMPERSAND(); 
-
-                }
-                break;
-            case 59 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:637: BAR
-                {
-                mBAR(); 
-
-                }
-                break;
-            case 60 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:641: LANGLE
-                {
-                mLANGLE(); 
-
-                }
-                break;
-            case 61 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:648: RANGLE
-                {
-                mRANGLE(); 
-
-                }
-                break;
-            case 62 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:655: PERCENT
-                {
-                mPERCENT(); 
-
-                }
-                break;
-            case 63 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:663: PLUS
-                {
-                mPLUS(); 
-
-                }
-                break;
-            case 64 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:668: MINUS
-                {
-                mMINUS(); 
-
-                }
-                break;
-            case 65 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:674: STAR
-                {
-                mSTAR(); 
-
-                }
-                break;
-            case 66 :
-                // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:1:679: TILDE
-                {
-                mTILDE(); 
-
-                }
-                break;
-
-        }
-
-    }
-
-
-    protected DFA19 dfa19 = new DFA19(this);
-    protected DFA36 dfa36 = new DFA36(this);
-    static final String DFA19_eotS =
-        "\5\uffff";
-    static final String DFA19_eofS =
-        "\5\uffff";
-    static final String DFA19_minS =
-        "\2\56\3\uffff";
-    static final String DFA19_maxS =
-        "\1\71\1\145\3\uffff";
-    static final String DFA19_acceptS =
-        "\2\uffff\1\2\1\1\1\3";
-    static final String DFA19_specialS =
-        "\5\uffff}>";
-    static final String[] DFA19_transitionS = {
-            "\1\2\1\uffff\12\1",
-            "\1\3\1\uffff\12\1\13\uffff\1\4\37\uffff\1\4",
-            "",
-            "",
-            ""
-    };
-
-    static final short[] DFA19_eot = DFA.unpackEncodedString(DFA19_eotS);
-    static final short[] DFA19_eof = DFA.unpackEncodedString(DFA19_eofS);
-    static final char[] DFA19_min = DFA.unpackEncodedStringToUnsignedChars(DFA19_minS);
-    static final char[] DFA19_max = DFA.unpackEncodedStringToUnsignedChars(DFA19_maxS);
-    static final short[] DFA19_accept = DFA.unpackEncodedString(DFA19_acceptS);
-    static final short[] DFA19_special = DFA.unpackEncodedString(DFA19_specialS);
-    static final short[][] DFA19_transition;
-
-    static {
-        int numStates = DFA19_transitionS.length;
-        DFA19_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA19_transition[i] = DFA.unpackEncodedString(DFA19_transitionS[i]);
-        }
-    }
-
-    class DFA19 extends DFA {
-
-        public DFA19(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 19;
-            this.eot = DFA19_eot;
-            this.eof = DFA19_eof;
-            this.min = DFA19_min;
-            this.max = DFA19_max;
-            this.accept = DFA19_accept;
-            this.special = DFA19_special;
-            this.transition = DFA19_transition;
-        }
-        public String getDescription() {
-            return "310:1: DOUBLE : ( ( DIGIT )+ DOT ( DIGIT )* EXPONENT | DOT ( DIGIT )+ EXPONENT | ( DIGIT )+ EXPONENT );";
-        }
-    }
-    static final String DFA36_eotS =
-        "\3\uffff\1\51\1\60\1\63\1\uffff\1\71\1\uffff\1\74\1\uffff\1\100"+
-        "\6\uffff\1\104\2\uffff\1\107\1\uffff\1\111\1\114\1\116\11\uffff"+
-        "\4\47\3\uffff\1\133\37\uffff\1\146\2\uffff\1\146\1\uffff\1\150\1"+
-        "\uffff\1\122\1\uffff\1\124\1\uffff\4\47\3\uffff\1\162\1\uffff\1"+
-        "\162\10\uffff\1\146\1\uffff\1\171\1\uffff\1\171\2\uffff\4\47\1\uffff"+
-        "\1\162\3\uffff\1\177\2\uffff\1\171\3\47\1\u0084\1\uffff\1\u0085"+
-        "\2\47\1\u0088\2\uffff\1\u0089\1\u008a\3\uffff";
-    static final String DFA36_eofS =
-        "\u008b\uffff";
-    static final String DFA36_minS =
-        "\1\11\1\uffff\1\101\1\55\1\41\1\55\1\57\1\41\1\uffff\1\76\1\57\1"+
-        "\46\5\uffff\1\55\1\60\2\55\1\60\1\uffff\1\56\1\60\1\56\2\0\7\uffff"+
-        "\1\155\1\162\1\145\1\141\1\uffff\1\76\1\uffff\1\56\1\60\2\41\1\uffff"+
-        "\1\41\2\uffff\1\76\16\uffff\3\55\2\uffff\1\55\3\uffff\1\60\2\uffff"+
-        "\1\60\1\uffff\1\56\1\60\1\47\1\uffff\1\42\1\uffff\1\160\1\145\1"+
-        "\154\1\163\3\uffff\1\60\1\uffff\1\60\5\uffff\2\55\1\uffff\1\60\1"+
-        "\uffff\1\60\1\uffff\1\60\2\uffff\1\157\1\146\1\141\1\145\1\uffff"+
-        "\1\60\3\uffff\2\55\1\uffff\1\60\1\162\1\151\1\171\1\55\1\uffff\1"+
-        "\55\1\164\1\170\1\55\2\uffff\2\55\3\uffff";
-    static final String DFA36_maxS =
-        "\1\ufffd\1\uffff\1\ufffd\1\71\1\ufffe\1\55\1\174\1\41\1\uffff\1"+
-        "\174\1\76\1\46\5\uffff\5\ufffd\1\uffff\1\145\2\71\2\ufffe\7\uffff"+
-        "\1\155\1\162\1\145\1\141\1\uffff\1\133\1\uffff\1\145\1\71\2\ufffe"+
-        "\1\uffff\1\ufffe\2\uffff\1\133\16\uffff\3\ufffd\2\uffff\1\ufffd"+
-        "\3\uffff\1\145\2\uffff\1\145\1\uffff\1\145\1\71\1\47\1\uffff\1\42"+
-        "\1\uffff\1\160\1\145\1\154\1\163\3\uffff\1\145\1\uffff\1\145\5\uffff"+
-        "\2\ufffd\1\uffff\1\145\1\uffff\1\145\1\uffff\1\145\2\uffff\1\157"+
-        "\1\146\1\141\1\145\1\uffff\1\145\3\uffff\2\ufffd\1\uffff\1\145\1"+
-        "\162\1\151\1\171\1\ufffd\1\uffff\1\ufffd\1\164\1\170\1\ufffd\2\uffff"+
-        "\2\ufffd\3\uffff";
-    static final String DFA36_acceptS =
-        "\1\uffff\1\1\6\uffff\1\23\3\uffff\1\30\1\32\1\33\1\34\1\35\5\uffff"+
-        "\1\45\5\uffff\1\64\1\70\1\71\1\75\1\76\1\101\1\102\4\uffff\1\43"+
-        "\1\uffff\1\100\4\uffff\1\21\1\uffff\1\74\1\42\1\uffff\1\31\1\14"+
-        "\1\13\1\15\1\16\1\22\1\65\1\24\1\27\1\73\1\25\1\63\1\26\1\72\3\uffff"+
-        "\1\36\1\37\1\uffff\1\66\1\44\1\46\1\uffff\1\50\1\67\1\uffff\1\77"+
-        "\3\uffff\1\57\1\uffff\1\60\4\uffff\1\11\1\6\1\54\1\uffff\1\56\1"+
-        "\uffff\1\17\1\7\1\20\1\12\1\10\2\uffff\1\47\1\uffff\1\51\1\uffff"+
-        "\1\53\1\uffff\1\61\1\62\4\uffff\1\55\1\uffff\1\17\1\7\1\20\2\uffff"+
-        "\1\52\5\uffff\1\40\4\uffff\1\4\1\41\2\uffff\1\5\1\2\1\3";
-    static final String DFA36_specialS =
-        "\u008b\uffff}>";
-    static final String[] DFA36_transitionS = {
-            "\2\1\2\uffff\1\1\22\uffff\1\1\1\7\1\33\1\26\1\uffff\1\40\1\13"+
-            "\1\32\1\15\1\16\1\41\1\31\1\35\1\3\1\30\1\12\12\27\1\22\1\36"+
-            "\1\4\1\6\1\37\1\25\1\2\5\24\1\23\15\24\1\21\6\24\1\17\1\10\1"+
-            "\20\1\34\2\uffff\5\24\1\23\15\24\1\21\6\24\1\14\1\11\1\5\1\42"+
-            "\101\uffff\27\24\1\uffff\37\24\1\uffff\u0208\24\160\uffff\16"+
-            "\24\1\uffff\u1c81\24\14\uffff\2\24\142\uffff\u0120\24\u0a70"+
-            "\uffff\u03f0\24\21\uffff\ua7ff\24\u2100\uffff\u04d0\24\40\uffff"+
-            "\u020e\24",
-            "",
-            "\32\47\6\uffff\1\47\1\46\1\47\1\45\4\47\1\43\6\47\1\44\12\47"+
-            "\105\uffff\27\47\1\uffff\37\47\1\uffff\u0208\47\160\uffff\16"+
-            "\47\1\uffff\u1c81\47\14\uffff\2\47\142\uffff\u0120\47\u0a70"+
-            "\uffff\u03f0\47\21\uffff\ua7ff\47\u2100\uffff\u04d0\47\40\uffff"+
-            "\u020e\47",
-            "\1\50\1\53\1\uffff\12\52",
-            "\1\61\1\uffff\12\61\1\55\1\61\1\57\14\61\1\uffff\1\54\36\61"+
-            "\1\uffff\1\61\1\uffff\1\61\1\uffff\32\61\1\uffff\1\56\1\uffff"+
-            "\uff81\61",
-            "\1\62",
-            "\1\64\15\uffff\1\65\36\uffff\1\66\37\uffff\1\67",
-            "\1\70",
-            "",
-            "\1\72\75\uffff\1\73",
-            "\1\76\16\uffff\1\75",
-            "\1\77",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\21\102\1\101\10\102"+
-            "\4\uffff\1\102\1\uffff\21\102\1\101\10\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105\105\uffff"+
-            "\27\105\1\uffff\37\105\1\uffff\u0208\105\160\uffff\16\105\1"+
-            "\uffff\u1c81\105\14\uffff\2\105\142\uffff\u0120\105\u0a70\uffff"+
-            "\u03f0\105\21\uffff\ua7ff\105\u2100\uffff\u04d0\105\40\uffff"+
-            "\u020e\105",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\1\106\31\102\4\uffff"+
-            "\1\102\1\uffff\1\106\31\102\74\uffff\1\102\10\uffff\27\102\1"+
-            "\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2"+
-            "\102\61\uffff\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102"+
-            "\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
-            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
-            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
-            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
-            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
-            "\12\110\7\uffff\32\110\4\uffff\1\110\1\uffff\32\110\105\uffff"+
-            "\27\110\1\uffff\37\110\1\uffff\u0208\110\160\uffff\16\110\1"+
-            "\uffff\u1c81\110\14\uffff\2\110\142\uffff\u0120\110\u0a70\uffff"+
-            "\u03f0\110\21\uffff\ua7ff\110\u2100\uffff\u04d0\110\40\uffff"+
-            "\u020e\110",
-            "",
-            "\1\112\1\uffff\12\27\13\uffff\1\113\37\uffff\1\113",
-            "\12\115",
-            "\1\120\1\uffff\12\117",
-            "\12\122\1\uffff\2\122\1\uffff\31\122\1\121\uffd7\122",
-            "\12\124\1\uffff\2\124\1\uffff\24\124\1\123\uffdc\124",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\125",
-            "\1\126",
-            "\1\127",
-            "\1\130",
-            "",
-            "\1\132\34\uffff\1\131",
-            "",
-            "\1\134\1\uffff\12\52\13\uffff\1\135\37\uffff\1\135",
-            "\12\136",
-            "\1\61\1\uffff\31\61\1\uffff\1\61\1\137\35\61\1\uffff\1\61\1"+
-            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
-            "\1\61\1\uffff\31\61\1\uffff\1\61\1\140\35\61\1\uffff\1\61\1"+
-            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
-            "",
-            "\1\61\1\uffff\31\61\1\uffff\1\61\1\141\35\61\1\uffff\1\61\1"+
-            "\uffff\1\61\1\uffff\32\61\3\uffff\uff81\61",
-            "",
-            "",
-            "\1\143\34\uffff\1\142",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\24\102\1\144\5\102"+
-            "\4\uffff\1\102\1\uffff\24\102\1\144\5\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
-            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
-            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
-            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
-            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
-            "\1\102\1\103\1\uffff\12\102\7\uffff\32\102\4\uffff\1\102\1\uffff"+
-            "\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102\1\uffff"+
-            "\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff\2\102\57"+
-            "\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff\102\u2100"+
-            "\uffff\u04d0\102\40\uffff\u020e\102",
-            "",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\13\102\1\145\16\102"+
-            "\4\uffff\1\102\1\uffff\13\102\1\145\16\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "",
-            "",
-            "",
-            "\12\147\13\uffff\1\113\37\uffff\1\113",
-            "",
-            "",
-            "\12\115\13\uffff\1\113\37\uffff\1\113",
-            "",
-            "\1\151\1\uffff\12\117\13\uffff\1\152\37\uffff\1\152",
-            "\12\153",
-            "\1\154",
-            "",
-            "\1\155",
-            "",
-            "\1\156",
-            "\1\157",
-            "\1\160",
-            "\1\161",
-            "",
-            "",
-            "",
-            "\12\163\13\uffff\1\135\37\uffff\1\135",
-            "",
-            "\12\136\13\uffff\1\135\37\uffff\1\135",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\4\102\1\167\25\102"+
-            "\4\uffff\1\102\1\uffff\4\102\1\167\25\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\22\102\1\170\7\102"+
-            "\4\uffff\1\102\1\uffff\22\102\1\170\7\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "",
-            "\12\147\13\uffff\1\113\37\uffff\1\113",
-            "",
-            "\12\172\13\uffff\1\152\37\uffff\1\152",
-            "",
-            "\12\153\13\uffff\1\152\37\uffff\1\152",
-            "",
-            "",
-            "\1\173",
-            "\1\174",
-            "\1\175",
-            "\1\176",
-            "",
-            "\12\163\13\uffff\1\135\37\uffff\1\135",
-            "",
-            "",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
-            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
-            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
-            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
-            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\4\102\1\u0080\25\102"+
-            "\4\uffff\1\102\1\uffff\4\102\1\u0080\25\102\74\uffff\1\102\10"+
-            "\uffff\27\102\1\uffff\37\102\1\uffff\u0286\102\1\uffff\u1c81"+
-            "\102\14\uffff\2\102\61\uffff\2\102\57\uffff\u0120\102\u0a70"+
-            "\uffff\u03f0\102\21\uffff\ua7ff\102\u2100\uffff\u04d0\102\40"+
-            "\uffff\u020e\102",
-            "",
-            "\12\172\13\uffff\1\152\37\uffff\1\152",
-            "\1\u0081",
-            "\1\u0082",
-            "\1\u0083",
-            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
-            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
-            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
-            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
-            "",
-            "\1\102\1\103\1\uffff\12\102\1\22\6\uffff\32\102\4\uffff\1\102"+
-            "\1\uffff\32\102\74\uffff\1\102\10\uffff\27\102\1\uffff\37\102"+
-            "\1\uffff\u0286\102\1\uffff\u1c81\102\14\uffff\2\102\61\uffff"+
-            "\2\102\57\uffff\u0120\102\u0a70\uffff\u03f0\102\21\uffff\ua7ff"+
-            "\102\u2100\uffff\u04d0\102\40\uffff\u020e\102",
-            "\1\u0086",
-            "\1\u0087",
-            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
-            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
-            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
-            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
-            "",
-            "",
-            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
-            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
-            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
-            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
-            "\1\47\23\uffff\32\47\6\uffff\32\47\105\uffff\27\47\1\uffff\37"+
-            "\47\1\uffff\u0208\47\160\uffff\16\47\1\uffff\u1c81\47\14\uffff"+
-            "\2\47\142\uffff\u0120\47\u0a70\uffff\u03f0\47\21\uffff\ua7ff"+
-            "\47\u2100\uffff\u04d0\47\40\uffff\u020e\47",
-            "",
-            "",
-            ""
-    };
-
-    static final short[] DFA36_eot = DFA.unpackEncodedString(DFA36_eotS);
-    static final short[] DFA36_eof = DFA.unpackEncodedString(DFA36_eofS);
-    static final char[] DFA36_min = DFA.unpackEncodedStringToUnsignedChars(DFA36_minS);
-    static final char[] DFA36_max = DFA.unpackEncodedStringToUnsignedChars(DFA36_maxS);
-    static final short[] DFA36_accept = DFA.unpackEncodedString(DFA36_acceptS);
-    static final short[] DFA36_special = DFA.unpackEncodedString(DFA36_specialS);
-    static final short[][] DFA36_transition;
-
-    static {
-        int numStates = DFA36_transitionS.length;
-        DFA36_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA36_transition[i] = DFA.unpackEncodedString(DFA36_transitionS[i]);
-        }
-    }
-
-    class DFA36 extends DFA {
-
-        public DFA36(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 36;
-            this.eot = DFA36_eot;
-            this.eof = DFA36_eof;
-            this.min = DFA36_min;
-            this.max = DFA36_max;
-            this.accept = DFA36_accept;
-            this.special = DFA36_special;
-            this.transition = DFA36_transition;
-        }
-        public String getDescription() {
-            return "1:1: Tokens : ( WS | AT_IMPORT | AT_PREFIX | AT_BASE | AT_DELAY | INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC | NOT | PAST | PRESENT | FUTURE | CONJ | DISJ | OPEN_BRACE | CLOSE_BRACE | LPAREN | RPAREN | LBRACKET | RBRACKET | PNAME_NS | PNAME_LN | TRUE | FALSE | IRI_REF | LANGTAG | QUERY_VAR | STM_VAR | INTEGER | DECIMAL | DOUBLE | INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE | INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE | STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 | COMMENT | REFERENCE | EXCLAMATION | QUESTION | DOT | COMMA | SEMICOLON | AMPERSAND | BAR | LANGLE | RANGLE | PERCENT | PLUS | MINUS | STAR | TILDE );";
-        }
-    }
- 
-
-}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/loan/loanParser.java b/open-nars/com/googlecode/opennars/parser/loan/loanParser.java
deleted file mode 100644
index b70c733..0000000
--- a/open-nars/com/googlecode/opennars/parser/loan/loanParser.java
+++ /dev/null
@@ -1,3160 +0,0 @@
-package com.googlecode.opennars.parser.loan;
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-
-import org.antlr.runtime.tree.*;
-
-public class loanParser extends Parser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "AT_BASE", "IRI_REF", "DOT", "AT_IMPORT", "AT_PREFIX", "PNAME_NS", "AT_DELAY", "LPAREN", "INTEGER", "RPAREN", "EXCLAMATION", "QUESTION", "PERCENT", "DECIMAL", "SEMICOLON", "CONJ", "COMMA", "DISJ", "NOT", "PAST", "PRESENT", "FUTURE", "INHERITANCE", "SIMILARITY", "INSTANCE", "PROPERTY", "INSTANCE_PROPERTY", "IMPLICATION", "IMPLICATION_PRED", "IMPLICATION_RETRO", "IMPLICATION_CONC", "EQUIVALENCE", "EQUIVALENCE_PRED", "EQUIVALENCE_CONC", "AMPERSAND", "BAR", "OPEN_BRACE", "CLOSE_BRACE", "LBRACKET", "RBRACKET", "MINUS", "TILDE", "STAR", "QUERY_VAR", "STM_VAR", "DOUBLE", "INTEGER_POSITIVE", "DECIMAL_POSITIVE", "DOUBLE_POSITIVE", "INTEGER_NEGATIVE", "DECIMAL_NEGATIVE", "DOUBLE_NEGATIVE", "TRUE", "FALSE", "STRING_LITERAL1", "STRING_LITERAL2", "STRING_LITERAL_LONG1", "STRING_LITERAL_LONG2", "PNAME_LN", "EOL", "WS", "PN_PREFIX", "PN_LOCAL", "LANGLE", "RANGLE", "PN_CHARS_BASE", "DIGIT", "LANGTAG", "EXPONENT", "PLUS", "ECHAR", "PN_CHARS_U", "VARNAME", "PN_CHARS", "COMMENT", "REFERENCE"
-    };
-    public static final int COMMA=20;
-    public static final int PN_CHARS_U=75;
-    public static final int MINUS=44;
-    public static final int PERCENT=16;
-    public static final int AT_PREFIX=8;
-    public static final int OPEN_BRACE=40;
-    public static final int DOUBLE=49;
-    public static final int AT_BASE=4;
-    public static final int EQUIVALENCE=35;
-    public static final int FALSE=57;
-    public static final int PN_CHARS_BASE=69;
-    public static final int EQUIVALENCE_CONC=37;
-    public static final int QUERY_VAR=47;
-    public static final int AT_DELAY=10;
-    public static final int LBRACKET=42;
-    public static final int INHERITANCE=26;
-    public static final int INSTANCE=28;
-    public static final int TILDE=45;
-    public static final int DECIMAL=17;
-    public static final int QUESTION=15;
-    public static final int CONJ=19;
-    public static final int DISJ=21;
-    public static final int IMPLICATION=31;
-    public static final int DOT=6;
-    public static final int STM_VAR=48;
-    public static final int RANGLE=68;
-    public static final int INTEGER=12;
-    public static final int IMPLICATION_RETRO=33;
-    public static final int FUTURE=25;
-    public static final int RBRACKET=43;
-    public static final int RPAREN=13;
-    public static final int PN_PREFIX=65;
-    public static final int EQUIVALENCE_PRED=36;
-    public static final int LANGLE=67;
-    public static final int LPAREN=11;
-    public static final int INSTANCE_PROPERTY=30;
-    public static final int ECHAR=74;
-    public static final int PLUS=73;
-    public static final int DIGIT=70;
-    public static final int AMPERSAND=38;
-    public static final int INTEGER_NEGATIVE=53;
-    public static final int PNAME_NS=9;
-    public static final int PAST=23;
-    public static final int SIMILARITY=27;
-    public static final int PROPERTY=29;
-    public static final int DECIMAL_POSITIVE=51;
-    public static final int STRING_LITERAL_LONG1=60;
-    public static final int IMPLICATION_PRED=32;
-    public static final int WS=64;
-    public static final int PNAME_LN=62;
-    public static final int LANGTAG=71;
-    public static final int EXCLAMATION=14;
-    public static final int PN_LOCAL=66;
-    public static final int VARNAME=76;
-    public static final int CLOSE_BRACE=41;
-    public static final int COMMENT=78;
-    public static final int PN_CHARS=77;
-    public static final int PRESENT=24;
-    public static final int AT_IMPORT=7;
-    public static final int STRING_LITERAL_LONG2=61;
-    public static final int DOUBLE_NEGATIVE=55;
-    public static final int EXPONENT=72;
-    public static final int SEMICOLON=18;
-    public static final int BAR=39;
-    public static final int DECIMAL_NEGATIVE=54;
-    public static final int EOF=-1;
-    public static final int IRI_REF=5;
-    public static final int DOUBLE_POSITIVE=52;
-    public static final int REFERENCE=79;
-    public static final int EOL=63;
-    public static final int INTEGER_POSITIVE=50;
-    public static final int STAR=46;
-    public static final int NOT=22;
-    public static final int STRING_LITERAL2=59;
-    public static final int TRUE=56;
-    public static final int STRING_LITERAL1=58;
-    public static final int IMPLICATION_CONC=34;
-
-        public loanParser(TokenStream input) {
-            super(input);
-        }
-        
-    protected TreeAdaptor adaptor = new CommonTreeAdaptor();
-
-    public void setTreeAdaptor(TreeAdaptor adaptor) {
-        this.adaptor = adaptor;
-    }
-    public TreeAdaptor getTreeAdaptor() {
-        return adaptor;
-    }
-
-    public String[] getTokenNames() { return tokenNames; }
-    public String getGrammarFileName() { return "/Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g"; }
-
-
-    public static class document_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start document
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:9:1: document : ( base_rule )? ( at_rule | sentence )* EOF ;
-    public final document_return document() throws RecognitionException {
-        document_return retval = new document_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token EOF4=null;
-        base_rule_return base_rule1 = null;
-
-        at_rule_return at_rule2 = null;
-
-        sentence_return sentence3 = null;
-
-
-        Object EOF4_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:2: ( ( base_rule )? ( at_rule | sentence )* EOF )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: ( base_rule )? ( at_rule | sentence )* EOF
-            {
-            root_0 = (Object)adaptor.nil();
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: ( base_rule )?
-            int alt1=2;
-            int LA1_0 = input.LA(1);
-
-            if ( (LA1_0==AT_BASE) ) {
-                alt1=1;
-            }
-            switch (alt1) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:4: base_rule
-                    {
-                    pushFollow(FOLLOW_base_rule_in_document27);
-                    base_rule1=base_rule();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, base_rule1.getTree());
-
-                    }
-                    break;
-
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:15: ( at_rule | sentence )*
-            loop2:
-            do {
-                int alt2=3;
-                int LA2_0 = input.LA(1);
-
-                if ( ((LA2_0>=AT_IMPORT && LA2_0<=AT_PREFIX)||LA2_0==AT_DELAY) ) {
-                    alt2=1;
-                }
-                else if ( (LA2_0==IRI_REF||LA2_0==PNAME_NS||(LA2_0>=LPAREN && LA2_0<=INTEGER)||LA2_0==DECIMAL||(LA2_0>=NOT && LA2_0<=FUTURE)||LA2_0==OPEN_BRACE||LA2_0==LBRACKET||(LA2_0>=QUERY_VAR && LA2_0<=PNAME_LN)) ) {
-                    alt2=2;
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:16: at_rule
-            	    {
-            	    pushFollow(FOLLOW_at_rule_in_document31);
-            	    at_rule2=at_rule();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, at_rule2.getTree());
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:10:26: sentence
-            	    {
-            	    pushFollow(FOLLOW_sentence_in_document35);
-            	    sentence3=sentence();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, sentence3.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop2;
-                }
-            } while (true);
-
-            EOF4=(Token)input.LT(1);
-            match(input,EOF,FOLLOW_EOF_in_document39); 
-            EOF4_tree = (Object)adaptor.create(EOF4);
-            adaptor.addChild(root_0, EOF4_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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end document
-
-    public static class base_rule_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start base_rule
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:12:1: base_rule : AT_BASE IRI_REF DOT ;
-    public final base_rule_return base_rule() throws RecognitionException {
-        base_rule_return retval = new base_rule_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token AT_BASE5=null;
-        Token IRI_REF6=null;
-        Token DOT7=null;
-
-        Object AT_BASE5_tree=null;
-        Object IRI_REF6_tree=null;
-        Object DOT7_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:13:2: ( AT_BASE IRI_REF DOT )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:13:4: AT_BASE IRI_REF DOT
-            {
-            root_0 = (Object)adaptor.nil();
-
-            AT_BASE5=(Token)input.LT(1);
-            match(input,AT_BASE,FOLLOW_AT_BASE_in_base_rule50); 
-            AT_BASE5_tree = (Object)adaptor.create(AT_BASE5);
-            root_0 = (Object)adaptor.becomeRoot(AT_BASE5_tree, root_0);
-
-            IRI_REF6=(Token)input.LT(1);
-            match(input,IRI_REF,FOLLOW_IRI_REF_in_base_rule53); 
-            IRI_REF6_tree = (Object)adaptor.create(IRI_REF6);
-            adaptor.addChild(root_0, IRI_REF6_tree);
-
-            DOT7=(Token)input.LT(1);
-            match(input,DOT,FOLLOW_DOT_in_base_rule55); 
-
-            }
-
-            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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end base_rule
-
-    public static class at_rule_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start at_rule
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:1: at_rule : ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT );
-    public final at_rule_return at_rule() throws RecognitionException {
-        at_rule_return retval = new at_rule_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token AT_IMPORT8=null;
-        Token IRI_REF9=null;
-        Token DOT10=null;
-        Token AT_PREFIX11=null;
-        Token PNAME_NS12=null;
-        Token IRI_REF13=null;
-        Token DOT14=null;
-        Token AT_DELAY15=null;
-        Token LPAREN16=null;
-        Token INTEGER17=null;
-        Token RPAREN18=null;
-        Token DOT19=null;
-
-        Object AT_IMPORT8_tree=null;
-        Object IRI_REF9_tree=null;
-        Object DOT10_tree=null;
-        Object AT_PREFIX11_tree=null;
-        Object PNAME_NS12_tree=null;
-        Object IRI_REF13_tree=null;
-        Object DOT14_tree=null;
-        Object AT_DELAY15_tree=null;
-        Object LPAREN16_tree=null;
-        Object INTEGER17_tree=null;
-        Object RPAREN18_tree=null;
-        Object DOT19_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:9: ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT )
-            int alt3=3;
-            switch ( input.LA(1) ) {
-            case AT_IMPORT:
-                {
-                alt3=1;
-                }
-                break;
-            case AT_PREFIX:
-                {
-                alt3=2;
-                }
-                break;
-            case AT_DELAY:
-                {
-                alt3=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("16:1: at_rule : ( AT_IMPORT IRI_REF DOT | AT_PREFIX PNAME_NS IRI_REF DOT | AT_DELAY LPAREN INTEGER RPAREN DOT );", 3, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt3) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:16:11: AT_IMPORT IRI_REF DOT
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    AT_IMPORT8=(Token)input.LT(1);
-                    match(input,AT_IMPORT,FOLLOW_AT_IMPORT_in_at_rule66); 
-                    AT_IMPORT8_tree = (Object)adaptor.create(AT_IMPORT8);
-                    root_0 = (Object)adaptor.becomeRoot(AT_IMPORT8_tree, root_0);
-
-                    IRI_REF9=(Token)input.LT(1);
-                    match(input,IRI_REF,FOLLOW_IRI_REF_in_at_rule69); 
-                    IRI_REF9_tree = (Object)adaptor.create(IRI_REF9);
-                    adaptor.addChild(root_0, IRI_REF9_tree);
-
-                    DOT10=(Token)input.LT(1);
-                    match(input,DOT,FOLLOW_DOT_in_at_rule71); 
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:17:4: AT_PREFIX PNAME_NS IRI_REF DOT
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    AT_PREFIX11=(Token)input.LT(1);
-                    match(input,AT_PREFIX,FOLLOW_AT_PREFIX_in_at_rule77); 
-                    AT_PREFIX11_tree = (Object)adaptor.create(AT_PREFIX11);
-                    root_0 = (Object)adaptor.becomeRoot(AT_PREFIX11_tree, root_0);
-
-                    PNAME_NS12=(Token)input.LT(1);
-                    match(input,PNAME_NS,FOLLOW_PNAME_NS_in_at_rule80); 
-                    PNAME_NS12_tree = (Object)adaptor.create(PNAME_NS12);
-                    adaptor.addChild(root_0, PNAME_NS12_tree);
-
-                    IRI_REF13=(Token)input.LT(1);
-                    match(input,IRI_REF,FOLLOW_IRI_REF_in_at_rule82); 
-                    IRI_REF13_tree = (Object)adaptor.create(IRI_REF13);
-                    adaptor.addChild(root_0, IRI_REF13_tree);
-
-                    DOT14=(Token)input.LT(1);
-                    match(input,DOT,FOLLOW_DOT_in_at_rule84); 
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:18:4: AT_DELAY LPAREN INTEGER RPAREN DOT
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    AT_DELAY15=(Token)input.LT(1);
-                    match(input,AT_DELAY,FOLLOW_AT_DELAY_in_at_rule90); 
-                    AT_DELAY15_tree = (Object)adaptor.create(AT_DELAY15);
-                    root_0 = (Object)adaptor.becomeRoot(AT_DELAY15_tree, root_0);
-
-                    LPAREN16=(Token)input.LT(1);
-                    match(input,LPAREN,FOLLOW_LPAREN_in_at_rule93); 
-                    INTEGER17=(Token)input.LT(1);
-                    match(input,INTEGER,FOLLOW_INTEGER_in_at_rule96); 
-                    INTEGER17_tree = (Object)adaptor.create(INTEGER17);
-                    adaptor.addChild(root_0, INTEGER17_tree);
-
-                    RPAREN18=(Token)input.LT(1);
-                    match(input,RPAREN,FOLLOW_RPAREN_in_at_rule98); 
-                    DOT19=(Token)input.LT(1);
-                    match(input,DOT,FOLLOW_DOT_in_at_rule101); 
-
-                    }
-                    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end at_rule
-
-    public static class sentence_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start sentence
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:21:1: sentence : statement ( judgement | question | goal ) ;
-    public final sentence_return sentence() throws RecognitionException {
-        sentence_return retval = new sentence_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        statement_return statement20 = null;
-
-        judgement_return judgement21 = null;
-
-        question_return question22 = null;
-
-        goal_return goal23 = null;
-
-
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:2: ( statement ( judgement | question | goal ) )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:4: statement ( judgement | question | goal )
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_statement_in_sentence114);
-            statement20=statement();
-            _fsp--;
-
-            adaptor.addChild(root_0, statement20.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:14: ( judgement | question | goal )
-            int alt4=3;
-            switch ( input.LA(1) ) {
-            case DOT:
-                {
-                alt4=1;
-                }
-                break;
-            case QUESTION:
-                {
-                alt4=2;
-                }
-                break;
-            case EXCLAMATION:
-                {
-                alt4=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("22:14: ( judgement | question | goal )", 4, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt4) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:15: judgement
-                    {
-                    pushFollow(FOLLOW_judgement_in_sentence117);
-                    judgement21=judgement();
-                    _fsp--;
-
-                    root_0 = (Object)adaptor.becomeRoot(judgement21.getTree(), root_0);
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:26: question
-                    {
-                    pushFollow(FOLLOW_question_in_sentence120);
-                    question22=question();
-                    _fsp--;
-
-                    root_0 = (Object)adaptor.becomeRoot(question22.getTree(), root_0);
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:22:36: goal
-                    {
-                    pushFollow(FOLLOW_goal_in_sentence123);
-                    goal23=goal();
-                    _fsp--;
-
-                    root_0 = (Object)adaptor.becomeRoot(goal23.getTree(), 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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end sentence
-
-    public static class judgement_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start judgement
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:25:1: judgement : DOT ( truthvalue )? ;
-    public final judgement_return judgement() throws RecognitionException {
-        judgement_return retval = new judgement_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token DOT24=null;
-        truthvalue_return truthvalue25 = null;
-
-
-        Object DOT24_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:2: ( DOT ( truthvalue )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:4: DOT ( truthvalue )?
-            {
-            root_0 = (Object)adaptor.nil();
-
-            DOT24=(Token)input.LT(1);
-            match(input,DOT,FOLLOW_DOT_in_judgement138); 
-            DOT24_tree = (Object)adaptor.create(DOT24);
-            root_0 = (Object)adaptor.becomeRoot(DOT24_tree, root_0);
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:9: ( truthvalue )?
-            int alt5=2;
-            int LA5_0 = input.LA(1);
-
-            if ( (LA5_0==PERCENT) ) {
-                alt5=1;
-            }
-            switch (alt5) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:26:9: truthvalue
-                    {
-                    pushFollow(FOLLOW_truthvalue_in_judgement141);
-                    truthvalue25=truthvalue();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, truthvalue25.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end judgement
-
-    public static class goal_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start goal
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:1: goal : EXCLAMATION ( truthvalue )? ;
-    public final goal_return goal() throws RecognitionException {
-        goal_return retval = new goal_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token EXCLAMATION26=null;
-        truthvalue_return truthvalue27 = null;
-
-
-        Object EXCLAMATION26_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:6: ( EXCLAMATION ( truthvalue )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:8: EXCLAMATION ( truthvalue )?
-            {
-            root_0 = (Object)adaptor.nil();
-
-            EXCLAMATION26=(Token)input.LT(1);
-            match(input,EXCLAMATION,FOLLOW_EXCLAMATION_in_goal153); 
-            EXCLAMATION26_tree = (Object)adaptor.create(EXCLAMATION26);
-            root_0 = (Object)adaptor.becomeRoot(EXCLAMATION26_tree, root_0);
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:21: ( truthvalue )?
-            int alt6=2;
-            int LA6_0 = input.LA(1);
-
-            if ( (LA6_0==PERCENT) ) {
-                alt6=1;
-            }
-            switch (alt6) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:29:21: truthvalue
-                    {
-                    pushFollow(FOLLOW_truthvalue_in_goal156);
-                    truthvalue27=truthvalue();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, truthvalue27.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end goal
-
-    public static class question_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start question
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:32:1: question : QUESTION ;
-    public final question_return question() throws RecognitionException {
-        question_return retval = new question_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token QUESTION28=null;
-
-        Object QUESTION28_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:33:2: ( QUESTION )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:33:4: QUESTION
-            {
-            root_0 = (Object)adaptor.nil();
-
-            QUESTION28=(Token)input.LT(1);
-            match(input,QUESTION,FOLLOW_QUESTION_in_question170); 
-            QUESTION28_tree = (Object)adaptor.create(QUESTION28);
-            root_0 = (Object)adaptor.becomeRoot(QUESTION28_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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end question
-
-    public static class truthvalue_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start truthvalue
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:36:1: truthvalue : PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT ;
-    public final truthvalue_return truthvalue() throws RecognitionException {
-        truthvalue_return retval = new truthvalue_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token PERCENT29=null;
-        Token set30=null;
-        Token SEMICOLON31=null;
-        Token DECIMAL32=null;
-        Token PERCENT33=null;
-
-        Object PERCENT29_tree=null;
-        Object set30_tree=null;
-        Object SEMICOLON31_tree=null;
-        Object DECIMAL32_tree=null;
-        Object PERCENT33_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:2: ( PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:4: PERCENT ( DECIMAL | INTEGER ) ( SEMICOLON DECIMAL )? PERCENT
-            {
-            root_0 = (Object)adaptor.nil();
-
-            PERCENT29=(Token)input.LT(1);
-            match(input,PERCENT,FOLLOW_PERCENT_in_truthvalue184); 
-            set30=(Token)input.LT(1);
-            if ( input.LA(1)==INTEGER||input.LA(1)==DECIMAL ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set30));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_truthvalue187);    throw mse;
-            }
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:33: ( SEMICOLON DECIMAL )?
-            int alt7=2;
-            int LA7_0 = input.LA(1);
-
-            if ( (LA7_0==SEMICOLON) ) {
-                alt7=1;
-            }
-            switch (alt7) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:37:34: SEMICOLON DECIMAL
-                    {
-                    SEMICOLON31=(Token)input.LT(1);
-                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_truthvalue196); 
-                    SEMICOLON31_tree = (Object)adaptor.create(SEMICOLON31);
-                    adaptor.addChild(root_0, SEMICOLON31_tree);
-
-                    DECIMAL32=(Token)input.LT(1);
-                    match(input,DECIMAL,FOLLOW_DECIMAL_in_truthvalue198); 
-                    DECIMAL32_tree = (Object)adaptor.create(DECIMAL32);
-                    adaptor.addChild(root_0, DECIMAL32_tree);
-
-
-                    }
-                    break;
-
-            }
-
-            PERCENT33=(Token)input.LT(1);
-            match(input,PERCENT,FOLLOW_PERCENT_in_truthvalue202); 
-
-            }
-
-            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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end truthvalue
-
-    public static class statement_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start statement
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:39:1: statement : unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )* ;
-    public final statement_return statement() throws RecognitionException {
-        statement_return retval = new statement_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token CONJ35=null;
-        Token SEMICOLON36=null;
-        Token COMMA37=null;
-        Token DISJ38=null;
-        unary_statement_return unary_statement34 = null;
-
-        unary_statement_return unary_statement39 = null;
-
-
-        Object CONJ35_tree=null;
-        Object SEMICOLON36_tree=null;
-        Object COMMA37_tree=null;
-        Object DISJ38_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:2: ( unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:4: unary_statement ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )*
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_unary_statement_in_statement213);
-            unary_statement34=unary_statement();
-            _fsp--;
-
-            adaptor.addChild(root_0, unary_statement34.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:20: ( ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement )*
-            loop9:
-            do {
-                int alt9=2;
-                int LA9_0 = input.LA(1);
-
-                if ( ((LA9_0>=SEMICOLON && LA9_0<=DISJ)) ) {
-                    alt9=1;
-                }
-
-
-                switch (alt9) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:21: ( CONJ | SEMICOLON | COMMA | DISJ ) unary_statement
-            	    {
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:21: ( CONJ | SEMICOLON | COMMA | DISJ )
-            	    int alt8=4;
-            	    switch ( input.LA(1) ) {
-            	    case CONJ:
-            	        {
-            	        alt8=1;
-            	        }
-            	        break;
-            	    case SEMICOLON:
-            	        {
-            	        alt8=2;
-            	        }
-            	        break;
-            	    case COMMA:
-            	        {
-            	        alt8=3;
-            	        }
-            	        break;
-            	    case DISJ:
-            	        {
-            	        alt8=4;
-            	        }
-            	        break;
-            	    default:
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("40:21: ( CONJ | SEMICOLON | COMMA | DISJ )", 8, 0, input);
-
-            	        throw nvae;
-            	    }
-
-            	    switch (alt8) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:22: CONJ
-            	            {
-            	            CONJ35=(Token)input.LT(1);
-            	            match(input,CONJ,FOLLOW_CONJ_in_statement217); 
-            	            CONJ35_tree = (Object)adaptor.create(CONJ35);
-            	            root_0 = (Object)adaptor.becomeRoot(CONJ35_tree, root_0);
-
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:30: SEMICOLON
-            	            {
-            	            SEMICOLON36=(Token)input.LT(1);
-            	            match(input,SEMICOLON,FOLLOW_SEMICOLON_in_statement222); 
-            	            SEMICOLON36_tree = (Object)adaptor.create(SEMICOLON36);
-            	            root_0 = (Object)adaptor.becomeRoot(SEMICOLON36_tree, root_0);
-
-
-            	            }
-            	            break;
-            	        case 3 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:43: COMMA
-            	            {
-            	            COMMA37=(Token)input.LT(1);
-            	            match(input,COMMA,FOLLOW_COMMA_in_statement227); 
-            	            COMMA37_tree = (Object)adaptor.create(COMMA37);
-            	            root_0 = (Object)adaptor.becomeRoot(COMMA37_tree, root_0);
-
-
-            	            }
-            	            break;
-            	        case 4 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:40:52: DISJ
-            	            {
-            	            DISJ38=(Token)input.LT(1);
-            	            match(input,DISJ,FOLLOW_DISJ_in_statement232); 
-            	            DISJ38_tree = (Object)adaptor.create(DISJ38);
-            	            root_0 = (Object)adaptor.becomeRoot(DISJ38_tree, root_0);
-
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    pushFollow(FOLLOW_unary_statement_in_statement236);
-            	    unary_statement39=unary_statement();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, unary_statement39.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop9;
-                }
-            } 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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end statement
-
-    public static class unary_statement_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start unary_statement
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:43:1: unary_statement : ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement );
-    public final unary_statement_return unary_statement() throws RecognitionException {
-        unary_statement_return retval = new unary_statement_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token NOT40=null;
-        Token PAST42=null;
-        Token PRESENT44=null;
-        Token FUTURE46=null;
-        simple_statement_return simple_statement41 = null;
-
-        simple_statement_return simple_statement43 = null;
-
-        simple_statement_return simple_statement45 = null;
-
-        simple_statement_return simple_statement47 = null;
-
-        simple_statement_return simple_statement48 = null;
-
-
-        Object NOT40_tree=null;
-        Object PAST42_tree=null;
-        Object PRESENT44_tree=null;
-        Object FUTURE46_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:44:2: ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement )
-            int alt10=5;
-            switch ( input.LA(1) ) {
-            case NOT:
-                {
-                alt10=1;
-                }
-                break;
-            case PAST:
-                {
-                alt10=2;
-                }
-                break;
-            case PRESENT:
-                {
-                alt10=3;
-                }
-                break;
-            case FUTURE:
-                {
-                alt10=4;
-                }
-                break;
-            case IRI_REF:
-            case PNAME_NS:
-            case LPAREN:
-            case INTEGER:
-            case DECIMAL:
-            case OPEN_BRACE:
-            case LBRACKET:
-            case QUERY_VAR:
-            case STM_VAR:
-            case DOUBLE:
-            case INTEGER_POSITIVE:
-            case DECIMAL_POSITIVE:
-            case DOUBLE_POSITIVE:
-            case INTEGER_NEGATIVE:
-            case DECIMAL_NEGATIVE:
-            case DOUBLE_NEGATIVE:
-            case TRUE:
-            case FALSE:
-            case STRING_LITERAL1:
-            case STRING_LITERAL2:
-            case STRING_LITERAL_LONG1:
-            case STRING_LITERAL_LONG2:
-            case PNAME_LN:
-                {
-                alt10=5;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("43:1: unary_statement : ( NOT simple_statement | PAST simple_statement | PRESENT simple_statement | FUTURE simple_statement | simple_statement );", 10, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt10) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:44:4: NOT simple_statement
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    NOT40=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_unary_statement251); 
-                    NOT40_tree = (Object)adaptor.create(NOT40);
-                    adaptor.addChild(root_0, NOT40_tree);
-
-                    pushFollow(FOLLOW_simple_statement_in_unary_statement253);
-                    simple_statement41=simple_statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, simple_statement41.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:45:4: PAST simple_statement
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    PAST42=(Token)input.LT(1);
-                    match(input,PAST,FOLLOW_PAST_in_unary_statement258); 
-                    PAST42_tree = (Object)adaptor.create(PAST42);
-                    adaptor.addChild(root_0, PAST42_tree);
-
-                    pushFollow(FOLLOW_simple_statement_in_unary_statement260);
-                    simple_statement43=simple_statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, simple_statement43.getTree());
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:46:4: PRESENT simple_statement
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    PRESENT44=(Token)input.LT(1);
-                    match(input,PRESENT,FOLLOW_PRESENT_in_unary_statement265); 
-                    PRESENT44_tree = (Object)adaptor.create(PRESENT44);
-                    adaptor.addChild(root_0, PRESENT44_tree);
-
-                    pushFollow(FOLLOW_simple_statement_in_unary_statement267);
-                    simple_statement45=simple_statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, simple_statement45.getTree());
-
-                    }
-                    break;
-                case 4 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:47:4: FUTURE simple_statement
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    FUTURE46=(Token)input.LT(1);
-                    match(input,FUTURE,FOLLOW_FUTURE_in_unary_statement272); 
-                    FUTURE46_tree = (Object)adaptor.create(FUTURE46);
-                    adaptor.addChild(root_0, FUTURE46_tree);
-
-                    pushFollow(FOLLOW_simple_statement_in_unary_statement274);
-                    simple_statement47=simple_statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, simple_statement47.getTree());
-
-                    }
-                    break;
-                case 5 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:48:4: simple_statement
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_simple_statement_in_unary_statement279);
-                    simple_statement48=simple_statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, simple_statement48.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end unary_statement
-
-    public static class simple_statement_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start simple_statement
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:51:1: simple_statement : term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )? ;
-    public final simple_statement_return simple_statement() throws RecognitionException {
-        simple_statement_return retval = new simple_statement_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token INHERITANCE50=null;
-        Token SIMILARITY51=null;
-        Token INSTANCE52=null;
-        Token PROPERTY53=null;
-        Token INSTANCE_PROPERTY54=null;
-        Token IMPLICATION55=null;
-        Token IMPLICATION_PRED56=null;
-        Token IMPLICATION_RETRO57=null;
-        Token IMPLICATION_CONC58=null;
-        Token EQUIVALENCE59=null;
-        Token EQUIVALENCE_PRED60=null;
-        Token EQUIVALENCE_CONC61=null;
-        term_return term49 = null;
-
-        term_return term62 = null;
-
-
-        Object INHERITANCE50_tree=null;
-        Object SIMILARITY51_tree=null;
-        Object INSTANCE52_tree=null;
-        Object PROPERTY53_tree=null;
-        Object INSTANCE_PROPERTY54_tree=null;
-        Object IMPLICATION55_tree=null;
-        Object IMPLICATION_PRED56_tree=null;
-        Object IMPLICATION_RETRO57_tree=null;
-        Object IMPLICATION_CONC58_tree=null;
-        Object EQUIVALENCE59_tree=null;
-        Object EQUIVALENCE_PRED60_tree=null;
-        Object EQUIVALENCE_CONC61_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:2: ( term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )? )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:4: term ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )?
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_term_in_simple_statement292);
-            term49=term();
-            _fsp--;
-
-            adaptor.addChild(root_0, term49.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:9: ( ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term )?
-            int alt12=2;
-            int LA12_0 = input.LA(1);
-
-            if ( ((LA12_0>=INHERITANCE && LA12_0<=EQUIVALENCE_CONC)) ) {
-                alt12=1;
-            }
-            switch (alt12) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC ) term
-                    {
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC )
-                    int alt11=12;
-                    switch ( input.LA(1) ) {
-                    case INHERITANCE:
-                        {
-                        alt11=1;
-                        }
-                        break;
-                    case SIMILARITY:
-                        {
-                        alt11=2;
-                        }
-                        break;
-                    case INSTANCE:
-                        {
-                        alt11=3;
-                        }
-                        break;
-                    case PROPERTY:
-                        {
-                        alt11=4;
-                        }
-                        break;
-                    case INSTANCE_PROPERTY:
-                        {
-                        alt11=5;
-                        }
-                        break;
-                    case IMPLICATION:
-                        {
-                        alt11=6;
-                        }
-                        break;
-                    case IMPLICATION_PRED:
-                        {
-                        alt11=7;
-                        }
-                        break;
-                    case IMPLICATION_RETRO:
-                        {
-                        alt11=8;
-                        }
-                        break;
-                    case IMPLICATION_CONC:
-                        {
-                        alt11=9;
-                        }
-                        break;
-                    case EQUIVALENCE:
-                        {
-                        alt11=10;
-                        }
-                        break;
-                    case EQUIVALENCE_PRED:
-                        {
-                        alt11=11;
-                        }
-                        break;
-                    case EQUIVALENCE_CONC:
-                        {
-                        alt11=12;
-                        }
-                        break;
-                    default:
-                        NoViableAltException nvae =
-                            new NoViableAltException("52:10: ( INHERITANCE | SIMILARITY | INSTANCE | PROPERTY | INSTANCE_PROPERTY | IMPLICATION | IMPLICATION_PRED | IMPLICATION_RETRO | IMPLICATION_CONC | EQUIVALENCE | EQUIVALENCE_PRED | EQUIVALENCE_CONC )", 11, 0, input);
-
-                        throw nvae;
-                    }
-
-                    switch (alt11) {
-                        case 1 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:11: INHERITANCE
-                            {
-                            INHERITANCE50=(Token)input.LT(1);
-                            match(input,INHERITANCE,FOLLOW_INHERITANCE_in_simple_statement296); 
-                            INHERITANCE50_tree = (Object)adaptor.create(INHERITANCE50);
-                            root_0 = (Object)adaptor.becomeRoot(INHERITANCE50_tree, root_0);
-
-
-                            }
-                            break;
-                        case 2 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:26: SIMILARITY
-                            {
-                            SIMILARITY51=(Token)input.LT(1);
-                            match(input,SIMILARITY,FOLLOW_SIMILARITY_in_simple_statement301); 
-                            SIMILARITY51_tree = (Object)adaptor.create(SIMILARITY51);
-                            root_0 = (Object)adaptor.becomeRoot(SIMILARITY51_tree, root_0);
-
-
-                            }
-                            break;
-                        case 3 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:40: INSTANCE
-                            {
-                            INSTANCE52=(Token)input.LT(1);
-                            match(input,INSTANCE,FOLLOW_INSTANCE_in_simple_statement306); 
-                            INSTANCE52_tree = (Object)adaptor.create(INSTANCE52);
-                            root_0 = (Object)adaptor.becomeRoot(INSTANCE52_tree, root_0);
-
-
-                            }
-                            break;
-                        case 4 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:52: PROPERTY
-                            {
-                            PROPERTY53=(Token)input.LT(1);
-                            match(input,PROPERTY,FOLLOW_PROPERTY_in_simple_statement311); 
-                            PROPERTY53_tree = (Object)adaptor.create(PROPERTY53);
-                            root_0 = (Object)adaptor.becomeRoot(PROPERTY53_tree, root_0);
-
-
-                            }
-                            break;
-                        case 5 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:64: INSTANCE_PROPERTY
-                            {
-                            INSTANCE_PROPERTY54=(Token)input.LT(1);
-                            match(input,INSTANCE_PROPERTY,FOLLOW_INSTANCE_PROPERTY_in_simple_statement316); 
-                            INSTANCE_PROPERTY54_tree = (Object)adaptor.create(INSTANCE_PROPERTY54);
-                            root_0 = (Object)adaptor.becomeRoot(INSTANCE_PROPERTY54_tree, root_0);
-
-
-                            }
-                            break;
-                        case 6 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:85: IMPLICATION
-                            {
-                            IMPLICATION55=(Token)input.LT(1);
-                            match(input,IMPLICATION,FOLLOW_IMPLICATION_in_simple_statement321); 
-                            IMPLICATION55_tree = (Object)adaptor.create(IMPLICATION55);
-                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION55_tree, root_0);
-
-
-                            }
-                            break;
-                        case 7 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:100: IMPLICATION_PRED
-                            {
-                            IMPLICATION_PRED56=(Token)input.LT(1);
-                            match(input,IMPLICATION_PRED,FOLLOW_IMPLICATION_PRED_in_simple_statement326); 
-                            IMPLICATION_PRED56_tree = (Object)adaptor.create(IMPLICATION_PRED56);
-                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_PRED56_tree, root_0);
-
-
-                            }
-                            break;
-                        case 8 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:120: IMPLICATION_RETRO
-                            {
-                            IMPLICATION_RETRO57=(Token)input.LT(1);
-                            match(input,IMPLICATION_RETRO,FOLLOW_IMPLICATION_RETRO_in_simple_statement331); 
-                            IMPLICATION_RETRO57_tree = (Object)adaptor.create(IMPLICATION_RETRO57);
-                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_RETRO57_tree, root_0);
-
-
-                            }
-                            break;
-                        case 9 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:141: IMPLICATION_CONC
-                            {
-                            IMPLICATION_CONC58=(Token)input.LT(1);
-                            match(input,IMPLICATION_CONC,FOLLOW_IMPLICATION_CONC_in_simple_statement336); 
-                            IMPLICATION_CONC58_tree = (Object)adaptor.create(IMPLICATION_CONC58);
-                            root_0 = (Object)adaptor.becomeRoot(IMPLICATION_CONC58_tree, root_0);
-
-
-                            }
-                            break;
-                        case 10 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:161: EQUIVALENCE
-                            {
-                            EQUIVALENCE59=(Token)input.LT(1);
-                            match(input,EQUIVALENCE,FOLLOW_EQUIVALENCE_in_simple_statement341); 
-                            EQUIVALENCE59_tree = (Object)adaptor.create(EQUIVALENCE59);
-                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE59_tree, root_0);
-
-
-                            }
-                            break;
-                        case 11 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:176: EQUIVALENCE_PRED
-                            {
-                            EQUIVALENCE_PRED60=(Token)input.LT(1);
-                            match(input,EQUIVALENCE_PRED,FOLLOW_EQUIVALENCE_PRED_in_simple_statement346); 
-                            EQUIVALENCE_PRED60_tree = (Object)adaptor.create(EQUIVALENCE_PRED60);
-                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE_PRED60_tree, root_0);
-
-
-                            }
-                            break;
-                        case 12 :
-                            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:52:196: EQUIVALENCE_CONC
-                            {
-                            EQUIVALENCE_CONC61=(Token)input.LT(1);
-                            match(input,EQUIVALENCE_CONC,FOLLOW_EQUIVALENCE_CONC_in_simple_statement351); 
-                            EQUIVALENCE_CONC61_tree = (Object)adaptor.create(EQUIVALENCE_CONC61);
-                            root_0 = (Object)adaptor.becomeRoot(EQUIVALENCE_CONC61_tree, root_0);
-
-
-                            }
-                            break;
-
-                    }
-
-                    pushFollow(FOLLOW_term_in_simple_statement355);
-                    term62=term();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, term62.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end simple_statement
-
-    public static class term_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start term
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:1: term : difference ( ( AMPERSAND | BAR ) difference )* ;
-    public final term_return term() throws RecognitionException {
-        term_return retval = new term_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token AMPERSAND64=null;
-        Token BAR65=null;
-        difference_return difference63 = null;
-
-        difference_return difference66 = null;
-
-
-        Object AMPERSAND64_tree=null;
-        Object BAR65_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:7: ( difference ( ( AMPERSAND | BAR ) difference )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:9: difference ( ( AMPERSAND | BAR ) difference )*
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_difference_in_term371);
-            difference63=difference();
-            _fsp--;
-
-            adaptor.addChild(root_0, difference63.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:20: ( ( AMPERSAND | BAR ) difference )*
-            loop14:
-            do {
-                int alt14=2;
-                int LA14_0 = input.LA(1);
-
-                if ( ((LA14_0>=AMPERSAND && LA14_0<=BAR)) ) {
-                    alt14=1;
-                }
-
-
-                switch (alt14) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:21: ( AMPERSAND | BAR ) difference
-            	    {
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:21: ( AMPERSAND | BAR )
-            	    int alt13=2;
-            	    int LA13_0 = input.LA(1);
-
-            	    if ( (LA13_0==AMPERSAND) ) {
-            	        alt13=1;
-            	    }
-            	    else if ( (LA13_0==BAR) ) {
-            	        alt13=2;
-            	    }
-            	    else {
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("56:21: ( AMPERSAND | BAR )", 13, 0, input);
-
-            	        throw nvae;
-            	    }
-            	    switch (alt13) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:22: AMPERSAND
-            	            {
-            	            AMPERSAND64=(Token)input.LT(1);
-            	            match(input,AMPERSAND,FOLLOW_AMPERSAND_in_term375); 
-            	            AMPERSAND64_tree = (Object)adaptor.create(AMPERSAND64);
-            	            root_0 = (Object)adaptor.becomeRoot(AMPERSAND64_tree, root_0);
-
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:56:35: BAR
-            	            {
-            	            BAR65=(Token)input.LT(1);
-            	            match(input,BAR,FOLLOW_BAR_in_term380); 
-            	            BAR65_tree = (Object)adaptor.create(BAR65);
-            	            root_0 = (Object)adaptor.becomeRoot(BAR65_tree, root_0);
-
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    pushFollow(FOLLOW_difference_in_term384);
-            	    difference66=difference();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, difference66.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop14;
-                }
-            } 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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end term
-
-    public static class ext_set_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start ext_set
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:1: ext_set : OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE ;
-    public final ext_set_return ext_set() throws RecognitionException {
-        ext_set_return retval = new ext_set_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token OPEN_BRACE67=null;
-        Token COMMA69=null;
-        Token CLOSE_BRACE71=null;
-        term_return term68 = null;
-
-        term_return term70 = null;
-
-
-        Object OPEN_BRACE67_tree=null;
-        Object COMMA69_tree=null;
-        Object CLOSE_BRACE71_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:9: ( OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:11: OPEN_BRACE ( term ( COMMA term )* )? CLOSE_BRACE
-            {
-            root_0 = (Object)adaptor.nil();
-
-            OPEN_BRACE67=(Token)input.LT(1);
-            match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_ext_set396); 
-            OPEN_BRACE67_tree = (Object)adaptor.create(OPEN_BRACE67);
-            root_0 = (Object)adaptor.becomeRoot(OPEN_BRACE67_tree, root_0);
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:23: ( term ( COMMA term )* )?
-            int alt16=2;
-            int LA16_0 = input.LA(1);
-
-            if ( (LA16_0==IRI_REF||LA16_0==PNAME_NS||(LA16_0>=LPAREN && LA16_0<=INTEGER)||LA16_0==DECIMAL||LA16_0==OPEN_BRACE||LA16_0==LBRACKET||(LA16_0>=QUERY_VAR && LA16_0<=PNAME_LN)) ) {
-                alt16=1;
-            }
-            switch (alt16) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:24: term ( COMMA term )*
-                    {
-                    pushFollow(FOLLOW_term_in_ext_set400);
-                    term68=term();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, term68.getTree());
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:29: ( COMMA term )*
-                    loop15:
-                    do {
-                        int alt15=2;
-                        int LA15_0 = input.LA(1);
-
-                        if ( (LA15_0==COMMA) ) {
-                            alt15=1;
-                        }
-
-
-                        switch (alt15) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:59:30: COMMA term
-                    	    {
-                    	    COMMA69=(Token)input.LT(1);
-                    	    match(input,COMMA,FOLLOW_COMMA_in_ext_set403); 
-                    	    pushFollow(FOLLOW_term_in_ext_set406);
-                    	    term70=term();
-                    	    _fsp--;
-
-                    	    adaptor.addChild(root_0, term70.getTree());
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop15;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-
-            CLOSE_BRACE71=(Token)input.LT(1);
-            match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_ext_set412); 
-
-            }
-
-            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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end ext_set
-
-    public static class int_set_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start int_set
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:1: int_set : LBRACKET ( term ( COMMA term )* )? RBRACKET ;
-    public final int_set_return int_set() throws RecognitionException {
-        int_set_return retval = new int_set_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token LBRACKET72=null;
-        Token COMMA74=null;
-        Token RBRACKET76=null;
-        term_return term73 = null;
-
-        term_return term75 = null;
-
-
-        Object LBRACKET72_tree=null;
-        Object COMMA74_tree=null;
-        Object RBRACKET76_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:9: ( LBRACKET ( term ( COMMA term )* )? RBRACKET )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:11: LBRACKET ( term ( COMMA term )* )? RBRACKET
-            {
-            root_0 = (Object)adaptor.nil();
-
-            LBRACKET72=(Token)input.LT(1);
-            match(input,LBRACKET,FOLLOW_LBRACKET_in_int_set424); 
-            LBRACKET72_tree = (Object)adaptor.create(LBRACKET72);
-            root_0 = (Object)adaptor.becomeRoot(LBRACKET72_tree, root_0);
-
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:21: ( term ( COMMA term )* )?
-            int alt18=2;
-            int LA18_0 = input.LA(1);
-
-            if ( (LA18_0==IRI_REF||LA18_0==PNAME_NS||(LA18_0>=LPAREN && LA18_0<=INTEGER)||LA18_0==DECIMAL||LA18_0==OPEN_BRACE||LA18_0==LBRACKET||(LA18_0>=QUERY_VAR && LA18_0<=PNAME_LN)) ) {
-                alt18=1;
-            }
-            switch (alt18) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:22: term ( COMMA term )*
-                    {
-                    pushFollow(FOLLOW_term_in_int_set428);
-                    term73=term();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, term73.getTree());
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:27: ( COMMA term )*
-                    loop17:
-                    do {
-                        int alt17=2;
-                        int LA17_0 = input.LA(1);
-
-                        if ( (LA17_0==COMMA) ) {
-                            alt17=1;
-                        }
-
-
-                        switch (alt17) {
-                    	case 1 :
-                    	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:62:28: COMMA term
-                    	    {
-                    	    COMMA74=(Token)input.LT(1);
-                    	    match(input,COMMA,FOLLOW_COMMA_in_int_set431); 
-                    	    pushFollow(FOLLOW_term_in_int_set434);
-                    	    term75=term();
-                    	    _fsp--;
-
-                    	    adaptor.addChild(root_0, term75.getTree());
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop17;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-
-            RBRACKET76=(Token)input.LT(1);
-            match(input,RBRACKET,FOLLOW_RBRACKET_in_int_set440); 
-
-            }
-
-            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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end int_set
-
-    public static class difference_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start difference
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:65:1: difference : product ( ( MINUS | TILDE ) product )* ;
-    public final difference_return difference() throws RecognitionException {
-        difference_return retval = new difference_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token MINUS78=null;
-        Token TILDE79=null;
-        product_return product77 = null;
-
-        product_return product80 = null;
-
-
-        Object MINUS78_tree=null;
-        Object TILDE79_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:2: ( product ( ( MINUS | TILDE ) product )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:4: product ( ( MINUS | TILDE ) product )*
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_product_in_difference454);
-            product77=product();
-            _fsp--;
-
-            adaptor.addChild(root_0, product77.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:12: ( ( MINUS | TILDE ) product )*
-            loop20:
-            do {
-                int alt20=2;
-                int LA20_0 = input.LA(1);
-
-                if ( ((LA20_0>=MINUS && LA20_0<=TILDE)) ) {
-                    alt20=1;
-                }
-
-
-                switch (alt20) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:13: ( MINUS | TILDE ) product
-            	    {
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:13: ( MINUS | TILDE )
-            	    int alt19=2;
-            	    int LA19_0 = input.LA(1);
-
-            	    if ( (LA19_0==MINUS) ) {
-            	        alt19=1;
-            	    }
-            	    else if ( (LA19_0==TILDE) ) {
-            	        alt19=2;
-            	    }
-            	    else {
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("66:13: ( MINUS | TILDE )", 19, 0, input);
-
-            	        throw nvae;
-            	    }
-            	    switch (alt19) {
-            	        case 1 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:14: MINUS
-            	            {
-            	            MINUS78=(Token)input.LT(1);
-            	            match(input,MINUS,FOLLOW_MINUS_in_difference458); 
-            	            MINUS78_tree = (Object)adaptor.create(MINUS78);
-            	            root_0 = (Object)adaptor.becomeRoot(MINUS78_tree, root_0);
-
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:66:23: TILDE
-            	            {
-            	            TILDE79=(Token)input.LT(1);
-            	            match(input,TILDE,FOLLOW_TILDE_in_difference463); 
-            	            TILDE79_tree = (Object)adaptor.create(TILDE79);
-            	            root_0 = (Object)adaptor.becomeRoot(TILDE79_tree, root_0);
-
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    pushFollow(FOLLOW_product_in_difference467);
-            	    product80=product();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, product80.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop20;
-                }
-            } 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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end difference
-
-    public static class product_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start product
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:1: product : atomic_term ( STAR atomic_term )* ;
-    public final product_return product() throws RecognitionException {
-        product_return retval = new product_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token STAR82=null;
-        atomic_term_return atomic_term81 = null;
-
-        atomic_term_return atomic_term83 = null;
-
-
-        Object STAR82_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:9: ( atomic_term ( STAR atomic_term )* )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:11: atomic_term ( STAR atomic_term )*
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_atomic_term_in_product480);
-            atomic_term81=atomic_term();
-            _fsp--;
-
-            adaptor.addChild(root_0, atomic_term81.getTree());
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:23: ( STAR atomic_term )*
-            loop21:
-            do {
-                int alt21=2;
-                int LA21_0 = input.LA(1);
-
-                if ( (LA21_0==STAR) ) {
-                    alt21=1;
-                }
-
-
-                switch (alt21) {
-            	case 1 :
-            	    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:69:24: STAR atomic_term
-            	    {
-            	    STAR82=(Token)input.LT(1);
-            	    match(input,STAR,FOLLOW_STAR_in_product483); 
-            	    STAR82_tree = (Object)adaptor.create(STAR82);
-            	    root_0 = (Object)adaptor.becomeRoot(STAR82_tree, root_0);
-
-            	    pushFollow(FOLLOW_atomic_term_in_product486);
-            	    atomic_term83=atomic_term();
-            	    _fsp--;
-
-            	    adaptor.addChild(root_0, atomic_term83.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop21;
-                }
-            } 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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end product
-
-    public static class atomic_term_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start atomic_term
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:72:1: atomic_term : ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal );
-    public final atomic_term_return atomic_term() throws RecognitionException {
-        atomic_term_return retval = new atomic_term_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token LPAREN86=null;
-        Token RPAREN88=null;
-        ext_set_return ext_set84 = null;
-
-        int_set_return int_set85 = null;
-
-        statement_return statement87 = null;
-
-        variable_return variable89 = null;
-
-        iriRef_return iriRef90 = null;
-
-        literal_return literal91 = null;
-
-
-        Object LPAREN86_tree=null;
-        Object RPAREN88_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:73:2: ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal )
-            int alt22=6;
-            switch ( input.LA(1) ) {
-            case OPEN_BRACE:
-                {
-                alt22=1;
-                }
-                break;
-            case LBRACKET:
-                {
-                alt22=2;
-                }
-                break;
-            case LPAREN:
-                {
-                alt22=3;
-                }
-                break;
-            case QUERY_VAR:
-            case STM_VAR:
-                {
-                alt22=4;
-                }
-                break;
-            case IRI_REF:
-            case PNAME_NS:
-            case PNAME_LN:
-                {
-                alt22=5;
-                }
-                break;
-            case INTEGER:
-            case DECIMAL:
-            case DOUBLE:
-            case INTEGER_POSITIVE:
-            case DECIMAL_POSITIVE:
-            case DOUBLE_POSITIVE:
-            case INTEGER_NEGATIVE:
-            case DECIMAL_NEGATIVE:
-            case DOUBLE_NEGATIVE:
-            case TRUE:
-            case FALSE:
-            case STRING_LITERAL1:
-            case STRING_LITERAL2:
-            case STRING_LITERAL_LONG1:
-            case STRING_LITERAL_LONG2:
-                {
-                alt22=6;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("72:1: atomic_term : ( ext_set | int_set | LPAREN statement RPAREN | variable | iriRef | literal );", 22, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt22) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:73:4: ext_set
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_ext_set_in_atomic_term500);
-                    ext_set84=ext_set();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, ext_set84.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:74:4: int_set
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_int_set_in_atomic_term505);
-                    int_set85=int_set();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, int_set85.getTree());
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:75:4: LPAREN statement RPAREN
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    LPAREN86=(Token)input.LT(1);
-                    match(input,LPAREN,FOLLOW_LPAREN_in_atomic_term510); 
-                    pushFollow(FOLLOW_statement_in_atomic_term513);
-                    statement87=statement();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, statement87.getTree());
-                    RPAREN88=(Token)input.LT(1);
-                    match(input,RPAREN,FOLLOW_RPAREN_in_atomic_term515); 
-
-                    }
-                    break;
-                case 4 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:76:4: variable
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_variable_in_atomic_term521);
-                    variable89=variable();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, variable89.getTree());
-
-                    }
-                    break;
-                case 5 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:77:4: iriRef
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_iriRef_in_atomic_term526);
-                    iriRef90=iriRef();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, iriRef90.getTree());
-
-                    }
-                    break;
-                case 6 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:78:4: literal
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_literal_in_atomic_term531);
-                    literal91=literal();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, literal91.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end atomic_term
-
-    public static class variable_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start variable
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:81:1: variable : ( query_variable | statement_variable );
-    public final variable_return variable() throws RecognitionException {
-        variable_return retval = new variable_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        query_variable_return query_variable92 = null;
-
-        statement_variable_return statement_variable93 = null;
-
-
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:82:2: ( query_variable | statement_variable )
-            int alt23=2;
-            int LA23_0 = input.LA(1);
-
-            if ( (LA23_0==QUERY_VAR) ) {
-                alt23=1;
-            }
-            else if ( (LA23_0==STM_VAR) ) {
-                alt23=2;
-            }
-            else {
-                NoViableAltException nvae =
-                    new NoViableAltException("81:1: variable : ( query_variable | statement_variable );", 23, 0, input);
-
-                throw nvae;
-            }
-            switch (alt23) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:82:4: query_variable
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_query_variable_in_variable544);
-                    query_variable92=query_variable();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, query_variable92.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:83:4: statement_variable
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_statement_variable_in_variable549);
-                    statement_variable93=statement_variable();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, statement_variable93.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end variable
-
-    public static class query_variable_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start query_variable
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:86:1: query_variable : QUERY_VAR ;
-    public final query_variable_return query_variable() throws RecognitionException {
-        query_variable_return retval = new query_variable_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token QUERY_VAR94=null;
-
-        Object QUERY_VAR94_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:87:2: ( QUERY_VAR )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:87:4: QUERY_VAR
-            {
-            root_0 = (Object)adaptor.nil();
-
-            QUERY_VAR94=(Token)input.LT(1);
-            match(input,QUERY_VAR,FOLLOW_QUERY_VAR_in_query_variable562); 
-            QUERY_VAR94_tree = (Object)adaptor.create(QUERY_VAR94);
-            adaptor.addChild(root_0, QUERY_VAR94_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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end query_variable
-
-    public static class statement_variable_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start statement_variable
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:90:1: statement_variable : STM_VAR ;
-    public final statement_variable_return statement_variable() throws RecognitionException {
-        statement_variable_return retval = new statement_variable_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token STM_VAR95=null;
-
-        Object STM_VAR95_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:91:2: ( STM_VAR )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:91:4: STM_VAR
-            {
-            root_0 = (Object)adaptor.nil();
-
-            STM_VAR95=(Token)input.LT(1);
-            match(input,STM_VAR,FOLLOW_STM_VAR_in_statement_variable575); 
-            STM_VAR95_tree = (Object)adaptor.create(STM_VAR95);
-            adaptor.addChild(root_0, STM_VAR95_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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end statement_variable
-
-    public static class literal_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start literal
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:96:1: literal : ( numericLiteral | booleanLiteral | string );
-    public final literal_return literal() throws RecognitionException {
-        literal_return retval = new literal_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        numericLiteral_return numericLiteral96 = null;
-
-        booleanLiteral_return booleanLiteral97 = null;
-
-        string_return string98 = null;
-
-
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:97:2: ( numericLiteral | booleanLiteral | string )
-            int alt24=3;
-            switch ( input.LA(1) ) {
-            case INTEGER:
-            case DECIMAL:
-            case DOUBLE:
-            case INTEGER_POSITIVE:
-            case DECIMAL_POSITIVE:
-            case DOUBLE_POSITIVE:
-            case INTEGER_NEGATIVE:
-            case DECIMAL_NEGATIVE:
-            case DOUBLE_NEGATIVE:
-                {
-                alt24=1;
-                }
-                break;
-            case TRUE:
-            case FALSE:
-                {
-                alt24=2;
-                }
-                break;
-            case STRING_LITERAL1:
-            case STRING_LITERAL2:
-            case STRING_LITERAL_LONG1:
-            case STRING_LITERAL_LONG2:
-                {
-                alt24=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("96:1: literal : ( numericLiteral | booleanLiteral | string );", 24, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt24) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:97:4: numericLiteral
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_numericLiteral_in_literal591);
-                    numericLiteral96=numericLiteral();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, numericLiteral96.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:98:4: booleanLiteral
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_booleanLiteral_in_literal596);
-                    booleanLiteral97=booleanLiteral();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, booleanLiteral97.getTree());
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:99:4: string
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_string_in_literal601);
-                    string98=string();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, string98.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end literal
-
-    public static class numericLiteral_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start numericLiteral
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:102:1: numericLiteral : ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative );
-    public final numericLiteral_return numericLiteral() throws RecognitionException {
-        numericLiteral_return retval = new numericLiteral_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        numericLiteralUnsigned_return numericLiteralUnsigned99 = null;
-
-        numericLiteralPositive_return numericLiteralPositive100 = null;
-
-        numericLiteralNegative_return numericLiteralNegative101 = null;
-
-
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:5: ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative )
-            int alt25=3;
-            switch ( input.LA(1) ) {
-            case INTEGER:
-            case DECIMAL:
-            case DOUBLE:
-                {
-                alt25=1;
-                }
-                break;
-            case INTEGER_POSITIVE:
-            case DECIMAL_POSITIVE:
-            case DOUBLE_POSITIVE:
-                {
-                alt25=2;
-                }
-                break;
-            case INTEGER_NEGATIVE:
-            case DECIMAL_NEGATIVE:
-            case DOUBLE_NEGATIVE:
-                {
-                alt25=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("102:1: numericLiteral : ( numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative );", 25, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt25) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:7: numericLiteralUnsigned
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_numericLiteralUnsigned_in_numericLiteral616);
-                    numericLiteralUnsigned99=numericLiteralUnsigned();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, numericLiteralUnsigned99.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:32: numericLiteralPositive
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_numericLiteralPositive_in_numericLiteral620);
-                    numericLiteralPositive100=numericLiteralPositive();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, numericLiteralPositive100.getTree());
-
-                    }
-                    break;
-                case 3 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:103:57: numericLiteralNegative
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_numericLiteralNegative_in_numericLiteral624);
-                    numericLiteralNegative101=numericLiteralNegative();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, numericLiteralNegative101.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end numericLiteral
-
-    public static class numericLiteralUnsigned_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start numericLiteralUnsigned
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:106:1: numericLiteralUnsigned : ( INTEGER | DECIMAL | DOUBLE );
-    public final numericLiteralUnsigned_return numericLiteralUnsigned() throws RecognitionException {
-        numericLiteralUnsigned_return retval = new numericLiteralUnsigned_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set102=null;
-
-        Object set102_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:107:5: ( INTEGER | DECIMAL | DOUBLE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set102=(Token)input.LT(1);
-            if ( input.LA(1)==INTEGER||input.LA(1)==DECIMAL||input.LA(1)==DOUBLE ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set102));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralUnsigned0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end numericLiteralUnsigned
-
-    public static class numericLiteralPositive_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start numericLiteralPositive
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:112:1: numericLiteralPositive : ( INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE );
-    public final numericLiteralPositive_return numericLiteralPositive() throws RecognitionException {
-        numericLiteralPositive_return retval = new numericLiteralPositive_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set103=null;
-
-        Object set103_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:113:5: ( INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set103=(Token)input.LT(1);
-            if ( (input.LA(1)>=INTEGER_POSITIVE && input.LA(1)<=DOUBLE_POSITIVE) ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set103));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralPositive0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end numericLiteralPositive
-
-    public static class numericLiteralNegative_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start numericLiteralNegative
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:118:1: numericLiteralNegative : ( INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE );
-    public final numericLiteralNegative_return numericLiteralNegative() throws RecognitionException {
-        numericLiteralNegative_return retval = new numericLiteralNegative_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set104=null;
-
-        Object set104_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:119:5: ( INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set104=(Token)input.LT(1);
-            if ( (input.LA(1)>=INTEGER_NEGATIVE && input.LA(1)<=DOUBLE_NEGATIVE) ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set104));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_numericLiteralNegative0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end numericLiteralNegative
-
-    public static class booleanLiteral_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start booleanLiteral
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:124:1: booleanLiteral : ( TRUE | FALSE );
-    public final booleanLiteral_return booleanLiteral() throws RecognitionException {
-        booleanLiteral_return retval = new booleanLiteral_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set105=null;
-
-        Object set105_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:125:5: ( TRUE | FALSE )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set105=(Token)input.LT(1);
-            if ( (input.LA(1)>=TRUE && input.LA(1)<=FALSE) ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set105));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_booleanLiteral0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end booleanLiteral
-
-    public static class string_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start string
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:129:1: string : ( STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 );
-    public final string_return string() throws RecognitionException {
-        string_return retval = new string_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set106=null;
-
-        Object set106_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:130:5: ( STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set106=(Token)input.LT(1);
-            if ( (input.LA(1)>=STRING_LITERAL1 && input.LA(1)<=STRING_LITERAL_LONG2) ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set106));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_string0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end string
-
-    public static class iriRef_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start iriRef
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:136:1: iriRef : ( IRI_REF | prefixedName );
-    public final iriRef_return iriRef() throws RecognitionException {
-        iriRef_return retval = new iriRef_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token IRI_REF107=null;
-        prefixedName_return prefixedName108 = null;
-
-
-        Object IRI_REF107_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:137:5: ( IRI_REF | prefixedName )
-            int alt26=2;
-            int LA26_0 = input.LA(1);
-
-            if ( (LA26_0==IRI_REF) ) {
-                alt26=1;
-            }
-            else if ( (LA26_0==PNAME_NS||LA26_0==PNAME_LN) ) {
-                alt26=2;
-            }
-            else {
-                NoViableAltException nvae =
-                    new NoViableAltException("136:1: iriRef : ( IRI_REF | prefixedName );", 26, 0, input);
-
-                throw nvae;
-            }
-            switch (alt26) {
-                case 1 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:137:7: IRI_REF
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    IRI_REF107=(Token)input.LT(1);
-                    match(input,IRI_REF,FOLLOW_IRI_REF_in_iriRef806); 
-                    IRI_REF107_tree = (Object)adaptor.create(IRI_REF107);
-                    adaptor.addChild(root_0, IRI_REF107_tree);
-
-
-                    }
-                    break;
-                case 2 :
-                    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:138:7: prefixedName
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_prefixedName_in_iriRef814);
-                    prefixedName108=prefixedName();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, prefixedName108.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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end iriRef
-
-    public static class prefixedName_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start prefixedName
-    // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:141:1: prefixedName : ( PNAME_LN | PNAME_NS );
-    public final prefixedName_return prefixedName() throws RecognitionException {
-        prefixedName_return retval = new prefixedName_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set109=null;
-
-        Object set109_tree=null;
-
-        try {
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:142:5: ( PNAME_LN | PNAME_NS )
-            // /Users/jgeldart/Documents/Eclipse/open-nars/com/googlecode/opennars/parser/loan/loan.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set109=(Token)input.LT(1);
-            if ( input.LA(1)==PNAME_NS||input.LA(1)==PNAME_LN ) {
-                input.consume();
-                adaptor.addChild(root_0, adaptor.create(set109));
-                errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_prefixedName0);    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);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end prefixedName
-
-
- 
-
-    public static final BitSet FOLLOW_base_rule_in_document27 = new BitSet(new long[]{0x7FFF850003C21FA0L});
-    public static final BitSet FOLLOW_at_rule_in_document31 = new BitSet(new long[]{0x7FFF850003C21FA0L});
-    public static final BitSet FOLLOW_sentence_in_document35 = new BitSet(new long[]{0x7FFF850003C21FA0L});
-    public static final BitSet FOLLOW_EOF_in_document39 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AT_BASE_in_base_rule50 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_IRI_REF_in_base_rule53 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_DOT_in_base_rule55 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AT_IMPORT_in_at_rule66 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_IRI_REF_in_at_rule69 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_DOT_in_at_rule71 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AT_PREFIX_in_at_rule77 = new BitSet(new long[]{0x0000000000000200L});
-    public static final BitSet FOLLOW_PNAME_NS_in_at_rule80 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_IRI_REF_in_at_rule82 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_DOT_in_at_rule84 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AT_DELAY_in_at_rule90 = new BitSet(new long[]{0x0000000000000800L});
-    public static final BitSet FOLLOW_LPAREN_in_at_rule93 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_INTEGER_in_at_rule96 = new BitSet(new long[]{0x0000000000002000L});
-    public static final BitSet FOLLOW_RPAREN_in_at_rule98 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_DOT_in_at_rule101 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_statement_in_sentence114 = new BitSet(new long[]{0x000000000000C040L});
-    public static final BitSet FOLLOW_judgement_in_sentence117 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_question_in_sentence120 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_goal_in_sentence123 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOT_in_judgement138 = new BitSet(new long[]{0x0000000000010002L});
-    public static final BitSet FOLLOW_truthvalue_in_judgement141 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXCLAMATION_in_goal153 = new BitSet(new long[]{0x0000000000010002L});
-    public static final BitSet FOLLOW_truthvalue_in_goal156 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_QUESTION_in_question170 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_PERCENT_in_truthvalue184 = new BitSet(new long[]{0x0000000000021000L});
-    public static final BitSet FOLLOW_set_in_truthvalue187 = new BitSet(new long[]{0x0000000000050000L});
-    public static final BitSet FOLLOW_SEMICOLON_in_truthvalue196 = new BitSet(new long[]{0x0000000000020000L});
-    public static final BitSet FOLLOW_DECIMAL_in_truthvalue198 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_PERCENT_in_truthvalue202 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_unary_statement_in_statement213 = new BitSet(new long[]{0x00000000003C0002L});
-    public static final BitSet FOLLOW_CONJ_in_statement217 = new BitSet(new long[]{0x7FFF850003C21A20L});
-    public static final BitSet FOLLOW_SEMICOLON_in_statement222 = new BitSet(new long[]{0x7FFF850003C21A20L});
-    public static final BitSet FOLLOW_COMMA_in_statement227 = new BitSet(new long[]{0x7FFF850003C21A20L});
-    public static final BitSet FOLLOW_DISJ_in_statement232 = new BitSet(new long[]{0x7FFF850003C21A20L});
-    public static final BitSet FOLLOW_unary_statement_in_statement236 = new BitSet(new long[]{0x00000000003C0002L});
-    public static final BitSet FOLLOW_NOT_in_unary_statement251 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_simple_statement_in_unary_statement253 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_PAST_in_unary_statement258 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_simple_statement_in_unary_statement260 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_PRESENT_in_unary_statement265 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_simple_statement_in_unary_statement267 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUTURE_in_unary_statement272 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_simple_statement_in_unary_statement274 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_statement_in_unary_statement279 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_term_in_simple_statement292 = new BitSet(new long[]{0x0000003FFC000002L});
-    public static final BitSet FOLLOW_INHERITANCE_in_simple_statement296 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_SIMILARITY_in_simple_statement301 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_INSTANCE_in_simple_statement306 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_PROPERTY_in_simple_statement311 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_INSTANCE_PROPERTY_in_simple_statement316 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_IMPLICATION_in_simple_statement321 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_IMPLICATION_PRED_in_simple_statement326 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_IMPLICATION_RETRO_in_simple_statement331 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_IMPLICATION_CONC_in_simple_statement336 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_EQUIVALENCE_in_simple_statement341 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_EQUIVALENCE_PRED_in_simple_statement346 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_EQUIVALENCE_CONC_in_simple_statement351 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_term_in_simple_statement355 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_difference_in_term371 = new BitSet(new long[]{0x000000C000000002L});
-    public static final BitSet FOLLOW_AMPERSAND_in_term375 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_BAR_in_term380 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_difference_in_term384 = new BitSet(new long[]{0x000000C000000002L});
-    public static final BitSet FOLLOW_OPEN_BRACE_in_ext_set396 = new BitSet(new long[]{0x7FFF870000021A20L});
-    public static final BitSet FOLLOW_term_in_ext_set400 = new BitSet(new long[]{0x0000020000100000L});
-    public static final BitSet FOLLOW_COMMA_in_ext_set403 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_term_in_ext_set406 = new BitSet(new long[]{0x0000020000100000L});
-    public static final BitSet FOLLOW_CLOSE_BRACE_in_ext_set412 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LBRACKET_in_int_set424 = new BitSet(new long[]{0x7FFF8D0000021A20L});
-    public static final BitSet FOLLOW_term_in_int_set428 = new BitSet(new long[]{0x0000080000100000L});
-    public static final BitSet FOLLOW_COMMA_in_int_set431 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_term_in_int_set434 = new BitSet(new long[]{0x0000080000100000L});
-    public static final BitSet FOLLOW_RBRACKET_in_int_set440 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_product_in_difference454 = new BitSet(new long[]{0x0000300000000002L});
-    public static final BitSet FOLLOW_MINUS_in_difference458 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_TILDE_in_difference463 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_product_in_difference467 = new BitSet(new long[]{0x0000300000000002L});
-    public static final BitSet FOLLOW_atomic_term_in_product480 = new BitSet(new long[]{0x0000400000000002L});
-    public static final BitSet FOLLOW_STAR_in_product483 = new BitSet(new long[]{0x7FFF850000021A20L});
-    public static final BitSet FOLLOW_atomic_term_in_product486 = new BitSet(new long[]{0x0000400000000002L});
-    public static final BitSet FOLLOW_ext_set_in_atomic_term500 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_int_set_in_atomic_term505 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LPAREN_in_atomic_term510 = new BitSet(new long[]{0x7FFF850003C21A20L});
-    public static final BitSet FOLLOW_statement_in_atomic_term513 = new BitSet(new long[]{0x0000000000002000L});
-    public static final BitSet FOLLOW_RPAREN_in_atomic_term515 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_variable_in_atomic_term521 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_iriRef_in_atomic_term526 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_literal_in_atomic_term531 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_query_variable_in_variable544 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_statement_variable_in_variable549 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_QUERY_VAR_in_query_variable562 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STM_VAR_in_statement_variable575 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_numericLiteral_in_literal591 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_booleanLiteral_in_literal596 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_string_in_literal601 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_numericLiteralUnsigned_in_numericLiteral616 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_numericLiteralPositive_in_numericLiteral620 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_numericLiteralNegative_in_numericLiteral624 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_numericLiteralUnsigned0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_numericLiteralPositive0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_numericLiteralNegative0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_booleanLiteral0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_string0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IRI_REF_in_iriRef806 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_prefixedName_in_iriRef814 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_prefixedName0 = new BitSet(new long[]{0x0000000000000002L});
-
-}
\ No newline at end of file
diff --git a/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java b/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
index 20c9f1f..d94256a 100644
--- a/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
+++ b/open-nars/com/googlecode/opennars/parser/narsese/NarseseParser.java
@@ -381,5 +381,24 @@ public class NarseseParser extends Parser {
         sentence.setInput();
         Task task = new Task(sentence, budget, memory);
         return task;
+	}
+
+	@Override
+	public List<Task> parseTasks(String input, Memory memory)
+			throws InvalidInputException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String serialiseSentence(Sentence task, Memory memory) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String serialiseSentences(List<Sentence> tasks, Memory memory) {
+		// TODO Auto-generated method stub
+		return null;
 	}
 }
diff --git a/open-nars/java_cup/Main.java b/open-nars/java_cup/Main.java
new file mode 100644
index 0000000..50811b5
--- /dev/null
+++ b/open-nars/java_cup/Main.java
@@ -0,0 +1,854 @@
+
+package java_cup;
+
+import java.util.Enumeration; 
+import java.io.*;
+
+/** This class serves as the main driver for the JavaCup system.
+ *  It accepts user options and coordinates overall control flow.
+ *  The main flow of control includes the following activities: 
+ *  <ul>
+ *    <li> Parse user supplied arguments and options.
+ *    <li> Open output files.
+ *    <li> Parse the specification from standard input.
+ *    <li> Check for unused terminals, non-terminals, and productions.
+ *    <li> Build the state machine, tables, etc.
+ *    <li> Output the generated code.
+ *    <li> Close output files.
+ *    <li> Print a summary if requested.
+ *  </ul>
+ *
+ *  Options to the main program include: <dl>
+ *   <dt> -package name  
+ *   <dd> specify package generated classes go in [default none]
+ *   <dt> -parser name   
+ *   <dd> specify parser class name [default "parser"]
+ *   <dt> -symbols name  
+ *   <dd> specify name for symbol constant class [default "sym"]
+ *   <dt> -interface
+ *   <dd> emit symbol constant <i>interface</i>, rather than class
+ *   <dt> -nonterms      
+ *   <dd> put non terminals in symbol constant class
+ *   <dt> -expect #      
+ *   <dd> number of conflicts expected/allowed [default 0]
+ *   <dt> -compact_red   
+ *   <dd> compact tables by defaulting to most frequent reduce
+ *   <dt> -nowarn        
+ *   <dd> don't warn about useless productions, etc.
+ *   <dt> -nosummary     
+ *   <dd> don't print the usual summary of parse states, etc.
+ *   <dt> -progress      
+ *   <dd> print messages to indicate progress of the system
+ *   <dt> -time          
+ *   <dd> print time usage summary
+ *   <dt> -dump_grammar  
+ *   <dd> produce a dump of the symbols and grammar
+ *   <dt> -dump_states   
+ *   <dd> produce a dump of parse state machine
+ *   <dt> -dump_tables   
+ *   <dd> produce a dump of the parse tables
+ *   <dt> -dump          
+ *   <dd> produce a dump of all of the above
+ *   <dt> -debug         
+ *   <dd> turn on debugging messages within JavaCup 
+ *   <dt> -nopositions
+ *   <dd> don't generate the positions code
+ *   <dt> -noscanner
+ *   <dd> don't refer to java_cup.runtime.Scanner in the parser
+ *        (for compatibility with old runtimes)
+ *   <dt> -version
+ *   <dd> print version information for JavaCUP and halt.
+ *   </dl>
+ *
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public class Main {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+  /** Only constructor is private, so we do not allocate any instances of this
+      class. */
+  private Main() { }
+
+  /*-------------------------*/
+  /* Options set by the user */
+  /*-------------------------*/
+  /** User option -- do we print progress messages. */
+  protected static boolean print_progress   = true;
+  /** User option -- do we produce a dump of the state machine */
+  protected static boolean opt_dump_states  = false;
+  /** User option -- do we produce a dump of the parse tables */
+  protected static boolean opt_dump_tables  = false;
+  /** User option -- do we produce a dump of the grammar */
+  protected static boolean opt_dump_grammar = false;
+  /** User option -- do we show timing information as a part of the summary */
+  protected static boolean opt_show_timing  = false;
+  /** User option -- do we run produce extra debugging messages */
+  protected static boolean opt_do_debug     = false;
+  /** User option -- do we compact tables by making most common reduce the 
+      default action */
+  protected static boolean opt_compact_red  = false;
+  /** User option -- should we include non terminal symbol numbers in the 
+      symbol constant class. */
+  protected static boolean include_non_terms = false;
+  /** User option -- do not print a summary. */
+  protected static boolean no_summary = false;
+  /** User option -- number of conflicts to expect */
+  protected static int expect_conflicts = 0;
+
+  /* frankf added this 6/18/96 */
+  /** User option -- should generator generate code for left/right values? */
+  protected static boolean lr_values = true;
+
+  /** User option -- should symbols be put in a class or an interface? [CSA]*/
+  protected static boolean sym_interface = false;
+
+  /** User option -- should generator suppress references to
+   *  java_cup.runtime.Scanner for compatibility with old runtimes? */
+  protected static boolean suppress_scanner = false;
+
+  /*----------------------------------------------------------------------*/
+  /* Timing data (not all of these time intervals are mutually exclusive) */
+  /*----------------------------------------------------------------------*/
+  /** Timing data -- when did we start */
+  protected static long start_time       = 0;
+  /** Timing data -- when did we end preliminaries */
+  protected static long prelim_end       = 0;
+  /** Timing data -- when did we end parsing */
+  protected static long parse_end        = 0;
+  /** Timing data -- when did we end checking */
+  protected static long check_end        = 0;
+  /** Timing data -- when did we end dumping */
+  protected static long dump_end         = 0;
+  /** Timing data -- when did we end state and table building */
+  protected static long build_end        = 0;
+  /** Timing data -- when did we end nullability calculation */
+  protected static long nullability_end  = 0;
+  /** Timing data -- when did we end first set calculation */
+  protected static long first_end        = 0;
+  /** Timing data -- when did we end state machine construction */
+  protected static long machine_end      = 0;
+  /** Timing data -- when did we end table construction */
+  protected static long table_end        = 0;
+  /** Timing data -- when did we end checking for non-reduced productions */
+  protected static long reduce_check_end = 0;
+  /** Timing data -- when did we finish emitting code */
+  protected static long emit_end         = 0;
+  /** Timing data -- when were we completely done */
+  protected static long final_time       = 0;
+
+  /* Additional timing information is also collected in emit */
+
+  /*-----------------------------------------------------------*/
+  /*--- Main Program ------------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The main driver for the system. 
+   * @param argv an array of strings containing command line arguments.
+   */
+  public static void main(String argv[]) 
+    throws internal_error, java.io.IOException, java.lang.Exception
+    {
+      boolean did_output = false;
+
+      start_time = System.currentTimeMillis();
+
+      /* process user options and arguments */
+      parse_args(argv);
+
+      /* frankf 6/18/96
+	 hackish, yes, but works */
+      emit.set_lr_values(lr_values);
+      /* open output files */
+      if (print_progress) System.err.println("Opening files...");
+      /* use a buffered version of standard input */
+      input_file = new BufferedInputStream(System.in);
+
+      prelim_end = System.currentTimeMillis();
+
+      /* parse spec into internal data structures */
+      if (print_progress) 
+	System.err.println("Parsing specification from standard input...");
+      parse_grammar_spec();
+
+      parse_end = System.currentTimeMillis();
+
+      /* don't proceed unless we are error free */
+      if (lexer.error_count == 0)
+	{
+	  /* check for unused bits */
+          if (print_progress) System.err.println("Checking specification...");
+          check_unused();
+
+          check_end = System.currentTimeMillis();
+
+	  /* build the state machine and parse tables */
+          if (print_progress) System.err.println("Building parse tables...");
+          build_parser();
+
+          build_end = System.currentTimeMillis();
+
+	  /* output the generated code, if # of conflicts permits */
+	  if (lexer.error_count != 0) {
+	      // conflicts! don't emit code, don't dump tables.
+	      opt_dump_tables = false;
+	  } else { // everything's okay, emit parser.
+	      if (print_progress) System.err.println("Writing parser...");
+	      open_files();
+	      emit_parser();
+	      did_output = true;
+	  }
+	}
+      /* fix up the times to make the summary easier */
+      emit_end = System.currentTimeMillis();
+
+      /* do requested dumps */
+      if (opt_dump_grammar) dump_grammar();
+      if (opt_dump_states)  dump_machine(); 
+      if (opt_dump_tables)  dump_tables(); 
+
+      dump_end = System.currentTimeMillis();
+
+      /* close input/output files */
+      if (print_progress) System.err.println("Closing files...");
+      close_files();
+
+      /* produce a summary if desired */
+      if (!no_summary) emit_summary(did_output);
+
+      /* If there were errors during the run,
+       * exit with non-zero status (makefile-friendliness). --CSA */
+      if (lexer.error_count != 0)
+	  System.exit(100);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Print a "usage message" that described possible command line options, 
+   *  then exit.
+   * @param message a specific error message to preface the usage message by.
+   */
+  protected static void usage(String message)
+    {
+      System.err.println();
+      System.err.println(message);
+      System.err.println();
+      System.err.println(
+"Usage: " + version.program_name + " [options] [filename]\n" +
+"  and expects a specification file on standard input if no filename is given.\n" +
+"  Legal options include:\n" +
+"    -package name  specify package generated classes go in [default none]\n" +
+"    -parser name   specify parser class name [default \"parser\"]\n" +
+"    -symbols name  specify name for symbol constant class [default \"sym\"]\n"+
+"    -interface     put symbols in an interface, rather than a class\n" +
+"    -nonterms      put non terminals in symbol constant class\n" + 
+"    -expect #      number of conflicts expected/allowed [default 0]\n" + 
+"    -compact_red   compact tables by defaulting to most frequent reduce\n" +
+"    -nowarn        don't warn about useless productions, etc.\n" +
+"    -nosummary     don't print the usual summary of parse states, etc.\n" +
+"    -nopositions   don't propagate the left and right token position values\n" +
+"    -noscanner     don't refer to java_cup.runtime.Scanner\n" +
+"    -progress      print messages to indicate progress of the system\n" +
+"    -time          print time usage summary\n" +
+"    -dump_grammar  produce a human readable dump of the symbols and grammar\n"+
+"    -dump_states   produce a dump of parse state machine\n"+
+"    -dump_tables   produce a dump of the parse tables\n"+
+"    -dump          produce a dump of all of the above\n"+
+"    -version       print the version information for CUP and exit\n"
+      );
+      System.exit(1);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Parse command line options and arguments to set various user-option
+   *  flags and variables. 
+   * @param argv the command line arguments to be parsed.
+   */
+  protected static void parse_args(String argv[])
+    {
+      int len = argv.length;
+      int i;
+
+      /* parse the options */
+      for (i=0; i<len; i++)
+	{
+	  /* try to get the various options */
+	  if (argv[i].equals("-package"))
+	    {
+	      /* must have an arg */
+	      if (++i >= len || argv[i].startsWith("-") || 
+				argv[i].endsWith(".cup")) 
+		usage("-package must have a name argument");
+
+	      /* record the name */
+	      emit.package_name = argv[i];
+	    }
+	  else if (argv[i].equals("-parser"))
+	    {
+	      /* must have an arg */
+	      if (++i >= len || argv[i].startsWith("-") || 
+				argv[i].endsWith(".cup")) 
+		usage("-parser must have a name argument");
+
+	      /* record the name */
+	      emit.parser_class_name = argv[i];
+	    }
+	  else if (argv[i].equals("-symbols"))
+	    {
+	      /* must have an arg */
+	      if (++i >= len || argv[i].startsWith("-") || 
+				argv[i].endsWith(".cup")) 
+		usage("-symbols must have a name argument");
+
+	      /* record the name */
+	      emit.symbol_const_class_name = argv[i];
+	    }
+	  else if (argv[i].equals("-nonterms"))
+	    {
+	      include_non_terms = true;
+	    }
+	  else if (argv[i].equals("-expect"))
+	    {
+	      /* must have an arg */
+	      if (++i >= len || argv[i].startsWith("-") || 
+				argv[i].endsWith(".cup")) 
+		usage("-expect must have a name argument");
+
+	      /* record the number */
+	      try {
+	        expect_conflicts = Integer.parseInt(argv[i]);
+	      } catch (NumberFormatException e) {
+		usage("-expect must be followed by a decimal integer");
+	      }
+	    }
+	  else if (argv[i].equals("-compact_red"))  opt_compact_red = true;
+	  else if (argv[i].equals("-nosummary"))    no_summary = true;
+	  else if (argv[i].equals("-nowarn"))       emit.nowarn = true;
+	  else if (argv[i].equals("-dump_states"))  opt_dump_states = true;
+	  else if (argv[i].equals("-dump_tables"))  opt_dump_tables = true; 
+	  else if (argv[i].equals("-progress"))     print_progress = true;
+	  else if (argv[i].equals("-dump_grammar")) opt_dump_grammar = true;
+	  else if (argv[i].equals("-dump")) 
+	        opt_dump_states = opt_dump_tables = opt_dump_grammar = true; 
+	  else if (argv[i].equals("-time"))         opt_show_timing = true; 
+	  else if (argv[i].equals("-debug"))        opt_do_debug = true;
+	  /* frankf 6/18/96 */
+	  else if (argv[i].equals("-nopositions"))  lr_values = false;
+	  /* CSA 12/21/97 */
+	  else if (argv[i].equals("-interface"))    sym_interface = true;
+	  /* CSA 23-Jul-1999 */
+	  else if (argv[i].equals("-noscanner"))    suppress_scanner = true;
+	  /* CSA 23-Jul-1999 */
+	  else if (argv[i].equals("-version")) {
+	      System.out.println(version.title_str);
+	      System.exit(1);
+	  }
+	  /* CSA 24-Jul-1999; suggestion by Jean Vaucher */
+	  else if (!argv[i].startsWith("-") && i==len-1) {
+	      /* use input from file. */
+	      try {
+		  System.setIn(new FileInputStream(argv[i]));
+	      } catch (java.io.FileNotFoundException e) {
+		  usage("Unable to open \"" + argv[i] +"\" for input");
+	      }
+	  }
+	  else
+	    {
+	      usage("Unrecognized option \"" + argv[i] + "\"");
+	    }
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /*-------*/
+  /* Files */
+  /*-------*/
+
+  /** Input file.  This is a buffered version of System.in. */
+  protected static BufferedInputStream input_file;
+
+  /** Output file for the parser class. */
+  protected static PrintWriter parser_class_file;
+
+  /** Output file for the symbol constant class. */
+  protected static PrintWriter symbol_class_file;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Open various files used by the system. */
+  protected static void open_files()
+    {
+      File fil;
+      String out_name;
+
+      /* open each of the output files */
+
+      /* parser class */
+      out_name = emit.parser_class_name + ".java";
+      fil = new File(out_name);
+      try {
+        parser_class_file = new PrintWriter(
+		 new BufferedOutputStream(new FileOutputStream(fil), 4096));
+      } catch(Exception e) {
+	System.err.println("Can't open \"" + out_name + "\" for output");
+	System.exit(3);
+      }
+
+      /* symbol constants class */
+      out_name = emit.symbol_const_class_name + ".java";
+      fil = new File(out_name);
+      try {
+        symbol_class_file = new PrintWriter(
+		 new BufferedOutputStream(new FileOutputStream(fil), 4096));
+      } catch(Exception e) {
+	System.err.println("Can't open \"" + out_name + "\" for output");
+	System.exit(4);
+      }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Close various files used by the system. */
+  protected static void close_files() throws java.io.IOException
+    {
+      if (input_file != null) input_file.close();
+      if (parser_class_file != null) parser_class_file.close();
+      if (symbol_class_file != null) symbol_class_file.close();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Parse the grammar specification from standard input.  This produces
+   *  sets of terminal, non-terminals, and productions which can be accessed
+   *  via static variables of the respective classes, as well as the setting
+   *  of various variables (mostly in the emit class) for small user supplied
+   *  items such as the code to scan with.
+   */
+  protected static void parse_grammar_spec() throws java.lang.Exception
+    {
+      parser parser_obj;
+
+      /* create a parser and parse with it */
+      parser_obj = new parser();
+      try {
+	if (opt_do_debug)
+          parser_obj.debug_parse();
+	else
+          parser_obj.parse();
+      } catch (Exception e)
+      {
+	/* something threw an exception.  catch it and emit a message so we 
+	   have a line number to work with, then re-throw it */
+	lexer.emit_error("Internal error: Unexpected exception");
+	throw e;
+      }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Check for unused symbols.  Unreduced productions get checked when
+   *  tables are created.
+   */
+  protected static void check_unused()
+    {
+      terminal term;
+      non_terminal nt;
+
+      /* check for unused terminals */
+      for (Enumeration t = terminal.all(); t.hasMoreElements(); )
+	{
+	  term = (terminal)t.nextElement();
+
+	  /* don't issue a message for EOF */
+	  if (term == terminal.EOF) continue;
+
+	  /* or error */
+	  if (term == terminal.error) continue;
+
+	  /* is this one unused */
+	  if (term.use_count() == 0)
+	    {
+	      /* count it and warn if we are doing warnings */
+	      emit.unused_term++;
+	      if (!emit.nowarn) 
+		{
+		  System.err.println("Warning: Terminal \"" + term.name() + 
+				     "\" was declared but never used");
+		  lexer.warning_count++;
+		}
+	    }
+	}
+
+      /* check for unused non terminals */
+      for (Enumeration n = non_terminal.all(); n.hasMoreElements(); )
+	{
+	  nt = (non_terminal)n.nextElement();
+
+	  /* is this one unused */
+	  if (nt.use_count() == 0)
+	    {
+	      /* count and warn if we are doing warnings */
+	      emit.unused_term++;
+	      if (!emit.nowarn) 
+		{
+		  System.err.println("Warning: Non terminal \"" + nt.name() + 
+				     "\" was declared but never used");
+		  lexer.warning_count++;
+		}
+	    }
+	}
+
+    }
+
+  /* . . . . . . . . . . . . . . . . . . . . . . . . .*/
+  /* . . Internal Results of Generating the Parser . .*/
+  /* . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Start state in the overall state machine. */
+  protected static lalr_state start_state;
+
+  /** Resulting parse action table. */
+  protected static parse_action_table action_table;
+
+  /** Resulting reduce-goto table. */
+  protected static parse_reduce_table reduce_table;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Build the (internal) parser from the previously parsed specification.
+   *  This includes:<ul>
+   *    <li> Computing nullability of non-terminals.
+   *    <li> Computing first sets of non-terminals and productions.
+   *    <li> Building the viable prefix recognizer machine.
+   *    <li> Filling in the (internal) parse tables.
+   *    <li> Checking for unreduced productions.
+   *  </ul>
+   */
+  protected static void build_parser() throws internal_error
+    {
+      /* compute nullability of all non terminals */
+      if (opt_do_debug || print_progress) 
+	System.err.println("  Computing non-terminal nullability...");
+      non_terminal.compute_nullability();
+
+      nullability_end = System.currentTimeMillis();
+
+      /* compute first sets of all non terminals */
+      if (opt_do_debug || print_progress) 
+	System.err.println("  Computing first sets...");
+      non_terminal.compute_first_sets();
+
+      first_end = System.currentTimeMillis();
+
+      /* build the LR viable prefix recognition machine */
+      if (opt_do_debug || print_progress) 
+	System.err.println("  Building state machine...");
+      start_state = lalr_state.build_machine(emit.start_production);
+
+      machine_end = System.currentTimeMillis();
+
+      /* build the LR parser action and reduce-goto tables */
+      if (opt_do_debug || print_progress) 
+	System.err.println("  Filling in tables...");
+      action_table = new parse_action_table();
+      reduce_table = new parse_reduce_table();
+      for (Enumeration st = lalr_state.all(); st.hasMoreElements(); )
+	{
+	  lalr_state lst = (lalr_state)st.nextElement();
+	  lst.build_table_entries(
+			                      action_table, reduce_table);
+	}
+
+      table_end = System.currentTimeMillis();
+
+      /* check and warn for non-reduced productions */
+      if (opt_do_debug || print_progress) 
+	System.err.println("  Checking for non-reduced productions...");
+      action_table.check_reductions();
+
+      reduce_check_end = System.currentTimeMillis();
+
+      /* if we have more conflicts than we expected issue a message and die */
+      if (emit.num_conflicts > expect_conflicts)
+	{
+	  System.err.println("*** More conflicts encountered than expected " +
+			     "-- parser generation aborted");
+	  lexer.error_count++; // indicate the problem.
+	  // we'll die on return, after clean up.
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Call the emit routines necessary to write out the generated parser. */
+  protected static void emit_parser() throws internal_error
+    {
+      emit.symbols(symbol_class_file, include_non_terms, sym_interface);
+      emit.parser(parser_class_file, action_table, reduce_table, 
+		  start_state.index(), emit.start_production, opt_compact_red,
+		  suppress_scanner);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Helper routine to optionally return a plural or non-plural ending. 
+   * @param val the numerical value determining plurality.
+   */
+  protected static String plural(int val)
+    {
+      if (val == 1)
+	return "";
+      else
+	return "s";
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit a long summary message to standard error (System.err) which 
+   *  summarizes what was found in the specification, how many states were
+   *  produced, how many conflicts were found, etc.  A detailed timing 
+   *  summary is also produced if it was requested by the user.
+   * @param output_produced did the system get far enough to generate code.
+   */
+  protected static void emit_summary(boolean output_produced)
+    {
+      final_time = System.currentTimeMillis();
+
+      if (no_summary) return;
+
+      System.err.println("------- " + version.title_str + 
+			 " Parser Generation Summary -------");
+
+      /* error and warning count */
+      System.err.println("  " + lexer.error_count + " error" + 
+	 plural(lexer.error_count) + " and " + lexer.warning_count + 
+	 " warning" + plural(lexer.warning_count));
+
+      /* basic stats */
+      System.err.print("  " + terminal.number() + " terminal" + 
+			 plural(terminal.number()) + ", ");
+      System.err.print(non_terminal.number() + " non-terminal" + 
+			 plural(non_terminal.number()) + ", and ");
+      System.err.println(production.number() + " production" + 
+			 plural(production.number()) + " declared, ");
+      System.err.println("  producing " + lalr_state.number() + 
+			 " unique parse states.");
+
+      /* unused symbols */
+      System.err.println("  " + emit.unused_term + " terminal" + 
+			 plural(emit.unused_term) + " declared but not used.");
+      System.err.println("  " + emit.unused_non_term + " non-terminal" + 
+			 plural(emit.unused_term) + " declared but not used.");
+
+      /* productions that didn't reduce */
+      System.err.println("  " + emit.not_reduced + " production" + 
+			 plural(emit.not_reduced) + " never reduced.");
+
+      /* conflicts */
+      System.err.println("  " + emit.num_conflicts + " conflict" +
+			 plural(emit.num_conflicts) + " detected" +
+	                 " (" + expect_conflicts + " expected).");
+
+      /* code location */
+      if (output_produced)
+	System.err.println("  Code written to \"" + emit.parser_class_name + 
+	        ".java\", and \"" + emit.symbol_const_class_name + ".java\".");
+      else
+	System.err.println("  No code produced.");
+
+      if (opt_show_timing) show_times();
+
+      System.err.println(
+	"---------------------------------------------------- (" + 
+	 version.version_str + ")");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce the optional timing summary as part of an overall summary. */
+  protected static void show_times()
+    {
+      long total_time = final_time - start_time;
+
+      System.err.println(". . . . . . . . . . . . . . . . . . . . . . . . . ");
+      System.err.println("  Timing Summary");
+      System.err.println("    Total time       "
+        + timestr(final_time-start_time, total_time));
+      System.err.println("      Startup        "
+	+ timestr(prelim_end-start_time, total_time));
+      System.err.println("      Parse          "
+	+ timestr(parse_end-prelim_end, total_time) );
+      if (check_end != 0)
+        System.err.println("      Checking       "
+	    + timestr(check_end-parse_end, total_time));
+      if (check_end != 0 && build_end != 0)
+        System.err.println("      Parser Build   "
+	    + timestr(build_end-check_end, total_time));
+      if (nullability_end != 0 && check_end != 0)
+        System.err.println("        Nullability  "
+	    + timestr(nullability_end-check_end, total_time));
+      if (first_end != 0 && nullability_end != 0)
+        System.err.println("        First sets   "
+            + timestr(first_end-nullability_end, total_time));
+      if (machine_end != 0 && first_end != 0)
+        System.err.println("        State build  " 
+	    + timestr(machine_end-first_end, total_time)); 
+      if (table_end != 0 && machine_end != 0)
+        System.err.println("        Table build  " 
+	    + timestr(table_end-machine_end, total_time)); 
+      if (reduce_check_end != 0 && table_end != 0)
+        System.err.println("        Checking     " 
+	    + timestr(reduce_check_end-table_end, total_time));
+      if (emit_end != 0 && build_end != 0)
+        System.err.println("      Code Output    "
+	    + timestr(emit_end-build_end, total_time));
+      if (emit.symbols_time != 0)
+	System.err.println("        Symbols      "
+	    + timestr(emit.symbols_time, total_time));
+      if (emit.parser_time != 0)
+	System.err.println("        Parser class "
+	    + timestr(emit.parser_time, total_time));
+      if (emit.action_code_time != 0)
+	System.err.println("          Actions    "
+	    + timestr(emit.action_code_time, total_time));
+      if (emit.production_table_time != 0)
+	System.err.println("          Prod table "
+	    + timestr(emit.production_table_time, total_time));
+      if (emit.action_table_time != 0)
+	System.err.println("          Action tab "
+	    + timestr(emit.action_table_time, total_time));
+      if (emit.goto_table_time != 0)
+	System.err.println("          Reduce tab "
+	    + timestr(emit.goto_table_time, total_time));
+
+      System.err.println("      Dump Output    "
+	+ timestr(dump_end-emit_end, total_time));
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Helper routine to format a decimal based display of seconds and
+   *  percentage of total time given counts of milliseconds.   Note: this
+   *  is broken for use with some instances of negative time (since we don't 
+   *  use any negative time here, we let if be for now).
+   * @param time_val   the value being formatted (in ms).
+   * @param total_time total time percentages are calculated against (in ms).
+   */
+  protected static String timestr(long time_val, long total_time)
+    {
+      boolean neg;
+      long    ms = 0;
+      long    sec = 0;
+      long    percent10;
+      String  pad;
+
+      /* work with positives only */
+      neg = time_val < 0;
+      if (neg) time_val = -time_val;
+
+      /* pull out seconds and ms */
+      ms = time_val % 1000;
+      sec = time_val / 1000;
+
+      /* construct a pad to blank fill seconds out to 4 places */
+      if (sec < 10)   
+	pad = "   ";
+      else if (sec < 100)  
+	pad = "  ";
+      else if (sec < 1000) 
+	pad = " ";
+      else
+	pad = "";
+
+      /* calculate 10 times the percentage of total */
+      percent10 = (time_val*1000)/total_time;
+
+      /* build and return the output string */
+      return (neg ? "-" : "") + pad + sec + "." + 
+	     ((ms%1000)/100) + ((ms%100)/10) + (ms%10) + "sec" +
+	     " (" + percent10/10 + "." + percent10%10 + "%)";
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a human readable dump of the grammar. */
+  public static void dump_grammar() throws internal_error
+    {
+      System.err.println("===== Terminals =====");
+      for (int tidx=0, cnt=0; tidx < terminal.number(); tidx++, cnt++)
+	{
+	  System.err.print("["+tidx+"]"+terminal.find(tidx).name()+" ");
+	  if ((cnt+1) % 5 == 0) System.err.println();
+	}
+      System.err.println();
+      System.err.println();
+
+      System.err.println("===== Non terminals =====");
+      for (int nidx=0, cnt=0; nidx < non_terminal.number(); nidx++, cnt++)
+	{
+	  System.err.print("["+nidx+"]"+non_terminal.find(nidx).name()+" ");
+	  if ((cnt+1) % 5 == 0) System.err.println();
+	}
+      System.err.println();
+      System.err.println();
+
+
+      System.err.println("===== Productions =====");
+      for (int pidx=0; pidx < production.number(); pidx++)
+	{
+	  production prod = production.find(pidx);
+	  System.err.print("["+pidx+"] "+prod.lhs().the_symbol().name() + " ::= ");
+	  for (int i=0; i<prod.rhs_length(); i++)
+	    if (prod.rhs(i).is_action())
+	      System.err.print("{action} ");
+	    else
+	      System.err.print(
+			 ((symbol_part)prod.rhs(i)).the_symbol().name() + " ");
+	  System.err.println();
+	}
+      System.err.println();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a (semi-) human readable dump of the complete viable prefix 
+   *  recognition state machine. 
+   */
+  public static void dump_machine()
+    {
+      lalr_state ordered[] = new lalr_state[lalr_state.number()];
+
+      /* put the states in sorted order for a nicer display */
+      for (Enumeration s = lalr_state.all(); s.hasMoreElements(); )
+	{
+	  lalr_state st = (lalr_state)s.nextElement();
+	  ordered[st.index()] = st;
+	}
+
+      System.err.println("===== Viable Prefix Recognizer =====");
+      for (int i = 0; i<lalr_state.number(); i++)
+	{
+	  if (ordered[i] == start_state) System.err.print("START ");
+          System.err.println(ordered[i]);
+	  System.err.println("-------------------");
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a (semi-) human readable dumps of the parse tables */
+  public static void dump_tables()
+    {
+      System.err.println(action_table);
+      System.err.println(reduce_table);
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
diff --git a/open-nars/java_cup/action_part.java b/open-nars/java_cup/action_part.java
new file mode 100644
index 0000000..69e98f5
--- /dev/null
+++ b/open-nars/java_cup/action_part.java
@@ -0,0 +1,93 @@
+
+package java_cup;
+
+/** 
+ * This class represents a part of a production which contains an
+ * action.  These are eventually eliminated from productions and converted
+ * to trailing actions by factoring out with a production that derives the
+ * empty string (and ends with this action).
+ *
+ * @see java_cup.production
+ * @version last update: 11/25/95
+ * @author Scott Hudson
+ */
+
+public class action_part extends production_part {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructors ------------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. 
+   * @param code_str string containing the actual user code.
+   */
+  public action_part(String code_str)
+    {
+      super(/* never have a label on code */null);
+      _code_string = code_str;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** String containing code for the action in question. */
+  protected String _code_string;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** String containing code for the action in question. */
+  public String code_string() {return _code_string;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Set the code string. */
+  public void set_code_string(String new_str) {_code_string = new_str;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Override to report this object as an action. */
+  public boolean is_action() { return true; }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison for properly typed object. */
+  public boolean equals(action_part other)
+    {
+      /* compare the strings */
+      return other != null && super.equals(other) && 
+	     other.code_string().equals(code_string());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof action_part)) 
+	return false;
+      else
+	return equals((action_part)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a hash code. */
+  public int hashCode()
+    {
+      return super.hashCode() ^ 
+	     (code_string()==null ? 0 : code_string().hashCode());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string.  */
+  public String toString()
+    {
+      return super.toString() + "{" + code_string() + "}";
+    }
+
+  /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/action_production.java b/open-nars/java_cup/action_production.java
new file mode 100644
index 0000000..3c0845f
--- /dev/null
+++ b/open-nars/java_cup/action_production.java
@@ -0,0 +1,39 @@
+
+package java_cup;
+
+/** A specialized version of a production used when we split an existing
+ *  production in order to remove an embedded action.  Here we keep a bit 
+ *  of extra bookkeeping so that we know where we came from.
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+
+public class action_production extends production {
+
+  /** Constructor.
+   * @param base       the production we are being factored out of.
+   * @param lhs_sym    the LHS symbol for this production.
+   * @param rhs_parts  array of production parts for the RHS.
+   * @param rhs_len    how much of the rhs_parts array is valid.
+   * @param action_str the trailing reduce action for this production.
+   */ 
+  public action_production(
+    production      base,
+    non_terminal    lhs_sym, 
+    production_part rhs_parts[],
+    int             rhs_len,
+    String          action_str)
+    throws internal_error
+    {
+      super(lhs_sym, rhs_parts, rhs_len, action_str);
+      _base_production = base;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The production we were taken out of. */
+  protected production _base_production;
+
+  /** The production we were taken out of. */
+  public production base_production() {return _base_production;}
+}
diff --git a/open-nars/java_cup/assoc.java b/open-nars/java_cup/assoc.java
new file mode 100644
index 0000000..8d0b50e
--- /dev/null
+++ b/open-nars/java_cup/assoc.java
@@ -0,0 +1,16 @@
+package java_cup;
+
+/* Defines integers that represent the associativity of terminals
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public class assoc {
+
+  /* various associativities, no_prec being the default value */
+  public final static int left = 0;
+  public final static int right = 1;
+  public final static int nonassoc = 2;
+  public final static int no_prec = -1;
+
+}
\ No newline at end of file
diff --git a/open-nars/java_cup/emit.java b/open-nars/java_cup/emit.java
new file mode 100644
index 0000000..9db9014
--- /dev/null
+++ b/open-nars/java_cup/emit.java
@@ -0,0 +1,897 @@
+package java_cup;
+
+import java.io.PrintWriter;
+import java.util.Stack;
+import java.util.Enumeration;
+import java.util.Date;
+
+/** 
+ * This class handles emitting generated code for the resulting parser.
+ * The various parse tables must be constructed, etc. before calling any 
+ * routines in this class.<p>  
+ *
+ * Three classes are produced by this code:
+ *   <dl>
+ *   <dt> symbol constant class
+ *   <dd>   this contains constant declarations for each terminal (and 
+ *          optionally each non-terminal).
+ *   <dt> action class
+ *   <dd>   this non-public class contains code to invoke all the user actions 
+ *          that were embedded in the parser specification.
+ *   <dt> parser class
+ *   <dd>   the specialized parser class consisting primarily of some user 
+ *          supplied general and initialization code, and the parse tables.
+ *   </dl><p>
+ *
+ *  Three parse tables are created as part of the parser class:
+ *    <dl>
+ *    <dt> production table
+ *    <dd>   lists the LHS non terminal number, and the length of the RHS of 
+ *           each production.
+ *    <dt> action table
+ *    <dd>   for each state of the parse machine, gives the action to be taken
+ *           (shift, reduce, or error) under each lookahead symbol.<br>
+ *    <dt> reduce-goto table
+ *    <dd>   when a reduce on a given production is taken, the parse stack is 
+ *           popped back a number of elements corresponding to the RHS of the 
+ *           production.  This reveals a prior state, which we transition out 
+ *           of under the LHS non terminal symbol for the production (as if we
+ *           had seen the LHS symbol rather than all the symbols matching the 
+ *           RHS).  This table is indexed by non terminal numbers and indicates 
+ *           how to make these transitions. 
+ *    </dl><p>
+ * 
+ * In addition to the method interface, this class maintains a series of 
+ * public global variables and flags indicating how misc. parts of the code 
+ * and other output is to be produced, and counting things such as number of 
+ * conflicts detected (see the source code and public variables below for
+ * more details).<p> 
+ *
+ * This class is "static" (contains only static data and methods).<p> 
+ *
+ * @see java_cup.main
+ * @version last update: 11/25/95
+ * @author Scott Hudson
+ */
+
+/* Major externally callable routines here include:
+     symbols               - emit the symbol constant class 
+     parser                - emit the parser class
+
+   In addition the following major internal routines are provided:
+     emit_package          - emit a package declaration
+     emit_action_code      - emit the class containing the user's actions 
+     emit_production_table - emit declaration and init for the production table
+     do_action_table       - emit declaration and init for the action table
+     do_reduce_table       - emit declaration and init for the reduce-goto table
+
+   Finally, this class uses a number of public instance variables to communicate
+   optional parameters and flags used to control how code is generated,
+   as well as to report counts of various things (such as number of conflicts
+   detected).  These include:
+
+   prefix                  - a prefix string used to prefix names that would 
+			     otherwise "pollute" someone else's name space.
+   package_name            - name of the package emitted code is placed in 
+			     (or null for an unnamed package.
+   symbol_const_class_name - name of the class containing symbol constants.
+   parser_class_name       - name of the class for the resulting parser.
+   action_code             - user supplied declarations and other code to be 
+			     placed in action class.
+   parser_code             - user supplied declarations and other code to be 
+			     placed in parser class.
+   init_code               - user supplied code to be executed as the parser 
+			     is being initialized.
+   scan_code               - user supplied code to get the next Symbol.
+   start_production        - the start production for the grammar.
+   import_list             - list of imports for use with action class.
+   num_conflicts           - number of conflicts detected. 
+   nowarn                  - true if we are not to issue warning messages.
+   not_reduced             - count of number of productions that never reduce.
+   unused_term             - count of unused terminal symbols.
+   unused_non_term         - count of unused non terminal symbols.
+   *_time                  - a series of symbols indicating how long various
+			     sub-parts of code generation took (used to produce
+			     optional time reports in main).
+*/
+
+public class emit {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Only constructor is private so no instances can be created. */
+  private emit() { }
+
+  /*-----------------------------------------------------------*/
+  /*--- Static (Class) Variables ------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The prefix placed on names that pollute someone else's name space. */
+  public static String prefix = "CUP$";
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Package that the resulting code goes into (null is used for unnamed). */
+  public static String package_name = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Name of the generated class for symbol constants. */
+  public static String symbol_const_class_name = "sym";
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Name of the generated parser class. */
+  public static String parser_class_name = "parser";
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User declarations for direct inclusion in user action class. */
+  public static String action_code = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User declarations for direct inclusion in parser class. */
+  public static String parser_code = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User code for user_init() which is called during parser initialization. */
+  public static String init_code = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User code for scan() which is called to get the next Symbol. */
+  public static String scan_code = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The start production of the grammar. */
+  public static production start_production = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** List of imports (Strings containing class names) to go with actions. */
+  public static Stack import_list = new Stack();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Number of conflict found while building tables. */
+  public static int num_conflicts = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do we skip warnings? */
+  public static boolean nowarn = false;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of the number on non-reduced productions found. */
+  public static int not_reduced = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of unused terminals. */
+  public static int unused_term = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of unused non terminals. */
+  public static int unused_non_term = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /* Timing values used to produce timing report in main.*/
+
+  /** Time to produce symbol constant class. */
+  public static long symbols_time          = 0;
+
+  /** Time to produce parser class. */
+  public static long parser_time           = 0;
+
+  /** Time to produce action code class. */
+  public static long action_code_time      = 0;
+
+  /** Time to produce the production table. */
+  public static long production_table_time = 0;
+
+  /** Time to produce the action table. */
+  public static long action_table_time     = 0;
+
+  /** Time to produce the reduce-goto table. */
+  public static long goto_table_time       = 0;
+
+  /* frankf 6/18/96 */
+  protected static boolean _lr_values;
+
+  /** whether or not to emit code for left and right values */
+  public static boolean lr_values() {return _lr_values;}
+  protected static void set_lr_values(boolean b) { _lr_values = b;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Build a string with the standard prefix. 
+   * @param str string to prefix.
+   */
+  protected static String pre(String str) {
+    return prefix + parser_class_name + "$" + str;
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit a package spec if the user wants one. 
+   * @param out stream to produce output on.
+   */
+  protected static void emit_package(PrintWriter out)
+    {
+      /* generate a package spec if we have a name for one */
+      if (package_name != null) {
+	out.println("package " + package_name + ";"); out.println();
+      }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit code for the symbol constant class, optionally including non terms,
+   *  if they have been requested.  
+   * @param out            stream to produce output on.
+   * @param emit_non_terms do we emit constants for non terminals?
+   * @param sym_interface  should we emit an interface, rather than a class?
+   */
+  public static void symbols(PrintWriter out, 
+			     boolean emit_non_terms, boolean sym_interface)
+    {
+      terminal term;
+      non_terminal nt;
+      String class_or_interface = (sym_interface)?"interface":"class";
+
+      long start_time = System.currentTimeMillis();
+
+      /* top of file */
+      out.println();
+      out.println("//----------------------------------------------------"); 
+      out.println("// The following code was generated by " + 
+							   version.title_str);
+      out.println("// " + new Date());
+      out.println("//----------------------------------------------------"); 
+      out.println();
+      emit_package(out);
+
+      /* class header */
+      out.println("/** CUP generated " + class_or_interface + 
+		  " containing symbol constants. */");
+      out.println("public " + class_or_interface + " " + 
+		  symbol_const_class_name + " {");
+
+      out.println("  /* terminals */");
+
+      /* walk over the terminals */              /* later might sort these */
+      for (Enumeration e = terminal.all(); e.hasMoreElements(); )
+	{
+	  term = (terminal)e.nextElement();
+
+	  /* output a constant decl for the terminal */
+	  out.println("  public static final int " + term.name() + " = " + 
+		      term.index() + ";");
+	}
+
+      /* do the non terminals if they want them (parser doesn't need them) */
+      if (emit_non_terms)
+	{
+          out.println();
+          out.println("  /* non terminals */");
+
+          /* walk over the non terminals */       /* later might sort these */
+          for (Enumeration e = non_terminal.all(); e.hasMoreElements(); )
+	    {
+	      nt = (non_terminal)e.nextElement();
+    
+	      /* output a constant decl for the terminal */
+	      out.println("  static final int " + nt.name() + " = " + 
+		          nt.index() + ";");
+	    }
+	}
+
+      /* end of class */
+      out.println("}");
+      out.println();
+
+      symbols_time = System.currentTimeMillis() - start_time;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit code for the non-public class holding the actual action code. 
+   * @param out        stream to produce output on.
+   * @param start_prod the start production of the grammar.
+   */
+  protected static void emit_action_code(PrintWriter out, production start_prod)
+    throws internal_error
+    {
+      production prod;
+
+      long start_time = System.currentTimeMillis();
+
+      /* class header */
+      out.println();
+      out.println(
+       "/** Cup generated class to encapsulate user supplied action code.*/"
+      );  
+      out.println("class " +  pre("actions") + " {");
+
+      /* user supplied code */
+      if (action_code != null)
+	{
+	  out.println();
+          out.println(action_code);
+	}
+
+      /* field for parser object */
+      out.println("  private final "+parser_class_name+" parser;");
+
+      /* constructor */
+      out.println();
+      out.println("  /** Constructor */");
+      out.println("  " + pre("actions") + "("+parser_class_name+" parser) {");
+      out.println("    this.parser = parser;");
+      out.println("  }");
+
+      /* action method head */
+      out.println();
+      out.println("  /** Method with the actual generated action code. */");
+      out.println("  public final java_cup.runtime.Symbol " + 
+		     pre("do_action") + "(");
+      out.println("    int                        " + pre("act_num,"));
+      out.println("    java_cup.runtime.lr_parser " + pre("parser,"));
+      out.println("    java.util.Stack            " + pre("stack,"));
+      out.println("    int                        " + pre("top)"));
+      out.println("    throws java.lang.Exception");
+      out.println("    {");
+
+      /* declaration of result symbol */
+      /* New declaration!! now return Symbol
+	 6/13/96 frankf */
+      out.println("      /* Symbol object for return from actions */");
+      out.println("      java_cup.runtime.Symbol " + pre("result") + ";");
+      out.println();
+
+      /* switch top */
+      out.println("      /* select the action based on the action number */");
+      out.println("      switch (" + pre("act_num") + ")");
+      out.println("        {");
+
+      /* emit action code for each production as a separate case */
+      for (Enumeration p = production.all(); p.hasMoreElements(); )
+	{
+	  prod = (production)p.nextElement();
+
+	  /* case label */
+          out.println("          /*. . . . . . . . . . . . . . . . . . . .*/");
+          out.println("          case " + prod.index() + ": // " + 
+					  prod.to_simple_string());
+
+	  /* give them their own block to work in */
+	  out.println("            {");
+
+	  /* create the result symbol */
+	  /*make the variable RESULT which will point to the new Symbol (see below)
+	    and be changed by action code
+	    6/13/96 frankf */
+	  out.println("              " +  prod.lhs().the_symbol().stack_type() +
+		      " RESULT = null;");
+
+	  /* Add code to propagate RESULT assignments that occur in
+	   * action code embedded in a production (ie, non-rightmost
+	   * action code). 24-Mar-1998 CSA
+	   */
+	  for (int i=0; i<prod.rhs_length(); i++) {
+	    // only interested in non-terminal symbols.
+	    if (!(prod.rhs(i) instanceof symbol_part)) continue;
+	    symbol s = ((symbol_part)prod.rhs(i)).the_symbol();
+	    if (!(s instanceof non_terminal)) continue;
+	    // skip this non-terminal unless it corresponds to
+	    // an embedded action production.
+	    if (((non_terminal)s).is_embedded_action == false) continue;
+	    // OK, it fits.  Make a conditional assignment to RESULT.
+	    int index = prod.rhs_length() - i - 1; // last rhs is on top.
+	    out.println("              " + "// propagate RESULT from " +
+			s.name());
+	    out.println("              " + "if ( " +
+	      "((java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt("
+              + emit.pre("top") + "-" + index + ")).value != null )");
+	    out.println("                " + "RESULT = " +
+	      "(" + prod.lhs().the_symbol().stack_type() + ") " +
+	      "((java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt("
+              + emit.pre("top") + "-" + index + ")).value;");
+	  }
+
+        /* if there is an action string, emit it */
+          if (prod.action() != null && prod.action().code_string() != null &&
+              !prod.action().equals(""))
+            out.println(prod.action().code_string());
+
+	  /* here we have the left and right values being propagated.  
+		must make this a command line option.
+	     frankf 6/18/96 */
+
+         /* Create the code that assigns the left and right values of
+            the new Symbol that the production is reducing to */
+	  if (emit.lr_values()) {	    
+	    int loffset;
+	    String leftstring, rightstring;
+	    int roffset = 0;
+	    rightstring = "((java_cup.runtime.Symbol)" + emit.pre("stack") + ".elementAt(" + 
+	      emit.pre("top") + "-" + roffset + ")).right";	  
+	    if (prod.rhs_length() == 0) 
+	      leftstring = rightstring;
+	    else {
+	      loffset = prod.rhs_length() - 1;
+	      leftstring = "((java_cup.runtime.Symbol)" + emit.pre("stack") + ".elementAt(" + 
+		emit.pre("top") + "-" + loffset + ")).left";	  
+	    }
+	    out.println("              " + pre("result") + " = new java_cup.runtime.Symbol(" + 
+			prod.lhs().the_symbol().index() + "/*" +
+			prod.lhs().the_symbol().name() + "*/" + 
+			", " + leftstring + ", " + rightstring + ", RESULT);");
+	  } else {
+	    out.println("              " + pre("result") + " = new java_cup.runtime.Symbol(" + 
+			prod.lhs().the_symbol().index() + "/*" +
+			prod.lhs().the_symbol().name() + "*/" + 
+			", RESULT);");
+	  }
+	  
+	  /* end of their block */
+	  out.println("            }");
+
+	  /* if this was the start production, do action for accept */
+	  if (prod == start_prod)
+	    {
+	      out.println("          /* ACCEPT */");
+	      out.println("          " + pre("parser") + ".done_parsing();");
+	    }
+
+	  /* code to return lhs symbol */
+	  out.println("          return " + pre("result") + ";");
+	  out.println();
+	}
+
+      /* end of switch */
+      out.println("          /* . . . . . .*/");
+      out.println("          default:");
+      out.println("            throw new Exception(");
+      out.println("               \"Invalid action number found in " +
+				  "internal parse table\");");
+      out.println();
+      out.println("        }");
+
+      /* end of method */
+      out.println("    }");
+
+      /* end of class */
+      out.println("}");
+      out.println();
+
+      action_code_time = System.currentTimeMillis() - start_time;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit the production table. 
+   * @param out stream to produce output on.
+   */
+  protected static void emit_production_table(PrintWriter out)
+    {
+      production all_prods[];
+      production prod;
+
+      long start_time = System.currentTimeMillis();
+
+      /* collect up the productions in order */
+      all_prods = new production[production.number()];
+      for (Enumeration p = production.all(); p.hasMoreElements(); )
+	{
+	  prod = (production)p.nextElement();
+	  all_prods[prod.index()] = prod;
+	}
+
+      // make short[][]
+      short[][] prod_table = new short[production.number()][2];
+      for (int i = 0; i<production.number(); i++)
+	{
+	  prod = all_prods[i];
+	  // { lhs symbol , rhs size }
+	  prod_table[i][0] = (short) prod.lhs().the_symbol().index();
+	  prod_table[i][1] = (short) prod.rhs_length();
+	}
+      /* do the top of the table */
+      out.println();
+      out.println("  /** Production table. */");
+      out.println("  protected static final short _production_table[][] = ");
+      out.print  ("    unpackFromStrings(");
+      do_table_as_string(out, prod_table);
+      out.println(");");
+
+      /* do the public accessor method */
+      out.println();
+      out.println("  /** Access to production table. */");
+      out.println("  public short[][] production_table() " + 
+						 "{return _production_table;}");
+
+      production_table_time = System.currentTimeMillis() - start_time;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit the action table. 
+   * @param out             stream to produce output on.
+   * @param act_tab         the internal representation of the action table.
+   * @param compact_reduces do we use the most frequent reduce as default?
+   */
+  protected static void do_action_table(
+    PrintWriter        out, 
+    parse_action_table act_tab,
+    boolean            compact_reduces)
+    throws internal_error
+    {
+      parse_action_row row;
+      parse_action     act;
+      int              red;
+
+      long start_time = System.currentTimeMillis();
+
+      /* collect values for the action table */
+      short[][] action_table = new short[act_tab.num_states()][];
+      /* do each state (row) of the action table */
+      for (int i = 0; i < act_tab.num_states(); i++)
+	{
+	  /* get the row */
+	  row = act_tab.under_state[i];
+
+	  /* determine the default for the row */
+	  if (compact_reduces)
+	    row.compute_default();
+	  else
+	    row.default_reduce = -1;
+
+	  /* make temporary table for the row. */
+	  short[] temp_table = new short[2*row.size()];
+	  int nentries = 0;
+
+	  /* do each column */
+	  for (int j = 0; j < row.size(); j++)
+	    {
+	      /* extract the action from the table */
+	      act = row.under_term[j];
+
+	      /* skip error entries these are all defaulted out */
+	      if (act.kind() != parse_action.ERROR)
+		{
+		  /* first put in the symbol index, then the actual entry */
+
+		  /* shifts get positive entries of state number + 1 */
+		  if (act.kind() == parse_action.SHIFT)
+		    {
+		      /* make entry */
+		      temp_table[nentries++] = (short) j;
+		      temp_table[nentries++] = (short)
+			(((shift_action)act).shift_to().index() + 1);
+		    }
+
+		  /* reduce actions get negated entries of production# + 1 */
+		  else if (act.kind() == parse_action.REDUCE)
+		    {
+		      /* if its the default entry let it get defaulted out */
+		      red = ((reduce_action)act).reduce_with().index();
+		      if (red != row.default_reduce) {
+			/* make entry */
+			temp_table[nentries++] = (short) j;
+			temp_table[nentries++] = (short) (-(red+1));
+		      }
+		    } else if (act.kind() == parse_action.NONASSOC)
+		      {
+			/* do nothing, since we just want a syntax error */
+		      }
+		  /* shouldn't be anything else */
+		  else
+		    throw new internal_error("Unrecognized action code " + 
+					     act.kind() + " found in parse table");
+		}
+	    }
+
+	  /* now we know how big to make the row */
+	  action_table[i] = new short[nentries + 2];
+	  System.arraycopy(temp_table, 0, action_table[i], 0, nentries);
+
+	  /* finish off the row with a default entry */
+	  action_table[i][nentries++] = -1;
+	  if (row.default_reduce != -1)
+	    action_table[i][nentries++] = (short) (-(row.default_reduce+1));
+	  else
+	    action_table[i][nentries++] = 0;
+	}
+
+      /* finish off the init of the table */
+      out.println();
+      out.println("  /** Parse-action table. */");
+      out.println("  protected static final short[][] _action_table = "); 
+      out.print  ("    unpackFromStrings(");
+      do_table_as_string(out, action_table);
+      out.println(");");
+
+      /* do the public accessor method */
+      out.println();
+      out.println("  /** Access to parse-action table. */");
+      out.println("  public short[][] action_table() {return _action_table;}");
+
+      action_table_time = System.currentTimeMillis() - start_time;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit the reduce-goto table. 
+   * @param out     stream to produce output on.
+   * @param red_tab the internal representation of the reduce-goto table.
+   */
+  protected static void do_reduce_table(
+    PrintWriter out, 
+    parse_reduce_table red_tab)
+    {
+      lalr_state       goto_st;
+      parse_action     act;
+
+      long start_time = System.currentTimeMillis();
+
+      /* collect values for reduce-goto table */
+      short[][] reduce_goto_table = new short[red_tab.num_states()][];
+      /* do each row of the reduce-goto table */
+      for (int i=0; i<red_tab.num_states(); i++)
+	{
+	  /* make temporary table for the row. */
+	  short[] temp_table = new short[2*red_tab.under_state[i].size()];
+	  int nentries = 0;
+	  /* do each entry in the row */
+	  for (int j=0; j<red_tab.under_state[i].size(); j++)
+	    {
+	      /* get the entry */
+	      goto_st = red_tab.under_state[i].under_non_term[j];
+
+	      /* if we have none, skip it */
+	      if (goto_st != null)
+		{
+		  /* make entries for the index and the value */
+		  temp_table[nentries++] = (short) j;
+		  temp_table[nentries++] = (short) goto_st.index();
+		}
+	    }
+	  /* now we know how big to make the row. */
+	  reduce_goto_table[i] = new short[nentries+2];
+	  System.arraycopy(temp_table, 0, reduce_goto_table[i], 0, nentries);
+
+	  /* end row with default value */
+	  reduce_goto_table[i][nentries++] = -1;
+	  reduce_goto_table[i][nentries++] = -1;
+	}
+
+      /* emit the table. */
+      out.println();
+      out.println("  /** <code>reduce_goto</code> table. */");
+      out.println("  protected static final short[][] _reduce_table = "); 
+      out.print  ("    unpackFromStrings(");
+      do_table_as_string(out, reduce_goto_table);
+      out.println(");");
+
+      /* do the public accessor method */
+      out.println();
+      out.println("  /** Access to <code>reduce_goto</code> table. */");
+      out.println("  public short[][] reduce_table() {return _reduce_table;}");
+      out.println();
+
+      goto_table_time = System.currentTimeMillis() - start_time;
+    }
+
+  // print a string array encoding the given short[][] array.
+  protected static void do_table_as_string(PrintWriter out, short[][] sa) {
+    out.println("new String[] {");
+    out.print("    \"");
+    int nchar=0, nbytes=0;
+    nbytes+=do_escaped(out, (char)(sa.length>>16));
+    nchar  =do_newline(out, nchar, nbytes);
+    nbytes+=do_escaped(out, (char)(sa.length&0xFFFF));
+    nchar  =do_newline(out, nchar, nbytes);
+    for (int i=0; i<sa.length; i++) {
+	nbytes+=do_escaped(out, (char)(sa[i].length>>16));
+	nchar  =do_newline(out, nchar, nbytes);
+	nbytes+=do_escaped(out, (char)(sa[i].length&0xFFFF));
+	nchar  =do_newline(out, nchar, nbytes);
+	for (int j=0; j<sa[i].length; j++) {
+	  // contents of string are (value+2) to allow for common -1, 0 cases
+	  // (UTF-8 encoding is most efficient for 0<c<0x80)
+	  nbytes+=do_escaped(out, (char)(2+sa[i][j]));
+	  nchar  =do_newline(out, nchar, nbytes);
+	}
+    }
+    out.print("\" }");
+  }
+  // split string if it is very long; start new line occasionally for neatness
+  protected static int do_newline(PrintWriter out, int nchar, int nbytes) {
+    if (nbytes > 65500)  { out.println("\", "); out.print("    \""); }
+    else if (nchar > 11) { out.println("\" +"); out.print("    \""); }
+    else return nchar+1;
+    return 0;
+  }
+  // output an escape sequence for the given character code.
+  protected static int do_escaped(PrintWriter out, char c) {
+    StringBuffer escape = new StringBuffer();
+    if (c <= 0xFF) {
+      escape.append(Integer.toOctalString(c));
+      while(escape.length() < 3) escape.insert(0, '0');
+    } else {
+      escape.append(Integer.toHexString(c));
+      while(escape.length() < 4) escape.insert(0, '0');
+      escape.insert(0, 'u');
+    }
+    escape.insert(0, '\\');
+    out.print(escape.toString());
+
+    // return number of bytes this takes up in UTF-8 encoding.
+    if (c == 0) return 2;
+    if (c >= 0x01 && c <= 0x7F) return 1;
+    if (c >= 0x80 && c <= 0x7FF) return 2;
+    return 3;
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit the parser subclass with embedded tables. 
+   * @param out             stream to produce output on.
+   * @param action_table    internal representation of the action table.
+   * @param reduce_table    internal representation of the reduce-goto table.
+   * @param start_st        start state of the parse machine.
+   * @param start_prod      start production of the grammar.
+   * @param compact_reduces do we use most frequent reduce as default?
+   * @param suppress_scanner should scanner be suppressed for compatibility?
+   */
+  public static void parser(
+    PrintWriter        out, 
+    parse_action_table action_table,
+    parse_reduce_table reduce_table,
+    int                start_st,
+    production         start_prod,
+    boolean            compact_reduces,
+    boolean            suppress_scanner)
+    throws internal_error
+    {
+      long start_time = System.currentTimeMillis();
+
+      /* top of file */
+      out.println();
+      out.println("//----------------------------------------------------"); 
+      out.println("// The following code was generated by " + 
+							version.title_str);
+      out.println("// " + new Date());
+      out.println("//----------------------------------------------------"); 
+      out.println();
+      emit_package(out);
+
+      /* user supplied imports */
+      for (int i = 0; i < import_list.size(); i++)
+	out.println("import " + import_list.elementAt(i) + ";");
+
+      /* class header */
+      out.println();
+      out.println("/** "+version.title_str+" generated parser.");
+      out.println("  * @version " + new Date());
+      out.println("  */");
+      out.println("public class " + parser_class_name + 
+		  " extends java_cup.runtime.lr_parser {");
+
+      /* constructors [CSA/davidm, 24-jul-99] */
+      out.println();
+      out.println("  /** Default constructor. */");
+      out.println("  public " + parser_class_name + "() {super();}");
+      if (!suppress_scanner) {
+	  out.println();
+	  out.println("  /** Constructor which sets the default scanner. */");
+	  out.println("  public " + parser_class_name + 
+		      "(java_cup.runtime.Scanner s) {super(s);}");
+      }
+
+      /* emit the various tables */
+      emit_production_table(out);
+      do_action_table(out, action_table, compact_reduces);
+      do_reduce_table(out, reduce_table);
+
+      /* instance of the action encapsulation class */
+      out.println("  /** Instance of action encapsulation class. */");
+      out.println("  protected " + pre("actions") + " action_obj;");
+      out.println();
+
+      /* action object initializer */
+      out.println("  /** Action encapsulation object initializer. */");
+      out.println("  protected void init_actions()");
+      out.println("    {");
+      out.println("      action_obj = new " + pre("actions") + "(this);");
+      out.println("    }");
+      out.println();
+
+      /* access to action code */
+      out.println("  /** Invoke a user supplied parse action. */");
+      out.println("  public java_cup.runtime.Symbol do_action(");
+      out.println("    int                        act_num,");
+      out.println("    java_cup.runtime.lr_parser parser,");
+      out.println("    java.util.Stack            stack,");
+      out.println("    int                        top)");
+      out.println("    throws java.lang.Exception");
+      out.println("  {");
+      out.println("    /* call code in generated class */");
+      out.println("    return action_obj." + pre("do_action(") +
+                  "act_num, parser, stack, top);");
+      out.println("  }");
+      out.println("");
+
+
+      /* method to tell the parser about the start state */
+      out.println("  /** Indicates start state. */");
+      out.println("  public int start_state() {return " + start_st + ";}");
+
+      /* method to indicate start production */
+      out.println("  /** Indicates start production. */");
+      out.println("  public int start_production() {return " + 
+		     start_production.index() + ";}");
+      out.println();
+
+      /* methods to indicate EOF and error symbol indexes */
+      out.println("  /** <code>EOF</code> Symbol index. */");
+      out.println("  public int EOF_sym() {return " + terminal.EOF.index() + 
+					  ";}");
+      out.println();
+      out.println("  /** <code>error</code> Symbol index. */");
+      out.println("  public int error_sym() {return " + terminal.error.index() +
+					  ";}");
+      out.println();
+
+      /* user supplied code for user_init() */
+      if (init_code != null)
+	{
+          out.println();
+	  out.println("  /** User initialization code. */");
+	  out.println("  public void user_init() throws java.lang.Exception");
+	  out.println("    {");
+	  out.println(init_code);
+	  out.println("    }");
+	}
+
+      /* user supplied code for scan */
+      if (scan_code != null)
+	{
+          out.println();
+	  out.println("  /** Scan to get the next Symbol. */");
+	  out.println("  public java_cup.runtime.Symbol scan()");
+	  out.println("    throws java.lang.Exception");
+	  out.println("    {");
+	  out.println(scan_code);
+	  out.println("    }");
+	}
+
+      /* user supplied code */
+      if (parser_code != null)
+	{
+	  out.println();
+          out.println(parser_code);
+	}
+
+      /* end of class */
+      out.println("}");
+
+      /* put out the action code class */
+      emit_action_code(out, start_prod);
+
+      parser_time = System.currentTimeMillis() - start_time;
+    }
+
+    /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/internal_error.java b/open-nars/java_cup/internal_error.java
new file mode 100644
index 0000000..4d3e7c2
--- /dev/null
+++ b/open-nars/java_cup/internal_error.java
@@ -0,0 +1,22 @@
+
+package java_cup;
+
+/** Exception subclass for reporting internal errors in JavaCup. */
+public class internal_error extends Exception
+  {
+    /** Constructor with a message */
+    public internal_error(String msg)
+      {
+	super(msg);
+      }
+
+    /** Method called to do a forced error exit on an internal error
+	for cases when we can't actually throw the exception.  */
+    public void crash()
+      {
+	System.err.println("JavaCUP Fatal Internal Error Detected");
+	System.err.println(getMessage());
+	printStackTrace();
+	System.exit(-1);
+      }
+  }
diff --git a/open-nars/java_cup/lalr_item.java b/open-nars/java_cup/lalr_item.java
new file mode 100644
index 0000000..fe92054
--- /dev/null
+++ b/open-nars/java_cup/lalr_item.java
@@ -0,0 +1,330 @@
+package java_cup;
+
+import java.util.Stack;
+import java.util.Enumeration;
+
+/** This class represents an LALR item. Each LALR item consists of 
+ *  a production, a "dot" at a position within that production, and
+ *  a set of lookahead symbols (terminal).  (The first two of these parts
+ *  are provide by the super class).  An item is designed to represent a 
+ *  configuration that the parser may be in.  For example, an item of the 
+ *  form: <pre>
+ *    [A ::= B * C d E  , {a,b,c}]
+ *  </pre>
+ *  indicates that the parser is in the middle of parsing the production <pre>
+ *    A ::= B C d E
+ *  </pre>
+ *  that B has already been parsed, and that we will expect to see a lookahead 
+ *  of either a, b, or c once the complete RHS of this production has been 
+ *  found.<p>
+ *
+ *  Items may initially be missing some items from their lookahead sets.  
+ *  Links are maintained from each item to the set of items that would need 
+ *  to be updated if symbols are added to its lookahead set.  During 
+ *  "lookahead propagation", we add symbols to various lookahead sets and 
+ *  propagate these changes across these dependency links as needed. 
+ *  
+ * @see     java_cup.lalr_item_set
+ * @see     java_cup.lalr_state
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class lalr_item extends lr_item_core {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor. 
+   * @param prod the production for the item.
+   * @param pos  the position of the "dot" within the production.
+   * @param look the set of lookahead symbols.
+   */
+  public lalr_item(production prod, int pos, terminal_set look) 
+    throws internal_error
+    {
+      super(prod, pos);
+      _lookahead = look;
+      _propagate_items = new Stack();
+      needs_propagation = true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with default position (dot at start). 
+   * @param prod the production for the item.
+   * @param look the set of lookahead symbols.
+   */
+  public lalr_item(production prod, terminal_set look) throws internal_error
+    {
+      this(prod,0,look);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with default position and empty lookahead set. 
+   * @param prod the production for the item.
+   */
+  public lalr_item(production prod) throws internal_error
+    {
+      this(prod,0,new terminal_set());
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The lookahead symbols of the item. */
+  protected terminal_set _lookahead;
+
+  /** The lookahead symbols of the item. */
+  public terminal_set lookahead() {return _lookahead;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Links to items that the lookahead needs to be propagated to. */
+  protected Stack _propagate_items; 
+
+  /** Links to items that the lookahead needs to be propagated to */
+  public Stack propagate_items() {return _propagate_items;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Flag to indicate that this item needs to propagate its lookahead 
+   *  (whether it has changed or not). 
+   */
+  protected boolean needs_propagation;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a new item to the set of items we propagate to. */
+  public void add_propagate(lalr_item prop_to)
+    {
+      _propagate_items.push(prop_to);
+      needs_propagation = true;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Propagate incoming lookaheads through this item to others need to 
+   *  be changed.
+   * @params incoming symbols to potentially be added to lookahead of this item.
+   */
+  public void propagate_lookaheads(terminal_set incoming) throws internal_error
+    {
+      boolean change = false;
+
+      /* if we don't need to propagate, then bail out now */
+      if (!needs_propagation && (incoming == null || incoming.empty()))
+	return;
+
+      /* if we have null incoming, treat as an empty set */
+      if (incoming != null)
+	{
+	  /* add the incoming to the lookahead of this item */
+	  change = lookahead().add(incoming);
+	}
+
+      /* if we changed or need it anyway, propagate across our links */
+      if (change || needs_propagation)
+	{
+          /* don't need to propagate again */
+          needs_propagation = false;
+
+	  /* propagate our lookahead into each item we are linked to */
+	  for (int i = 0; i < propagate_items().size(); i++)
+	    ((lalr_item)propagate_items().elementAt(i))
+					  .propagate_lookaheads(lookahead());
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce the new lalr_item that results from shifting the dot one position
+   *  to the right. 
+   */
+  public lalr_item shift() throws internal_error
+    {
+      lalr_item result;
+
+      /* can't shift if we have dot already at the end */
+      if (dot_at_end())
+	throw new internal_error("Attempt to shift past end of an lalr_item");
+
+      /* create the new item w/ the dot shifted by one */
+      result = new lalr_item(the_production(), dot_pos()+1, 
+					    new terminal_set(lookahead()));
+
+      /* change in our lookahead needs to be propagated to this item */
+      add_propagate(result);
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Calculate lookahead representing symbols that could appear after the
+   *   symbol that the dot is currently in front of.  Note: this routine must
+   *   not be invoked before first sets and nullability has been calculated
+   *   for all non terminals. 
+   */ 
+  public terminal_set calc_lookahead(terminal_set lookahead_after) 
+    throws internal_error
+    {
+      terminal_set    result;
+      int             pos;
+      production_part part;
+      symbol          sym;
+
+      /* sanity check */
+      if (dot_at_end())
+	throw new internal_error(
+	  "Attempt to calculate a lookahead set with a completed item");
+
+      /* start with an empty result */
+      result = new terminal_set();
+
+      /* consider all nullable symbols after the one to the right of the dot */
+      for (pos = dot_pos()+1; pos < the_production().rhs_length(); pos++) 
+	{
+	   part = the_production().rhs(pos);
+
+	   /* consider what kind of production part it is -- skip actions */ 
+	   if (!part.is_action())
+	     {
+	       sym = ((symbol_part)part).the_symbol();
+
+	       /* if its a terminal add it in and we are done */
+	       if (!sym.is_non_term())
+		 {
+		   result.add((terminal)sym);
+		   return result;
+		 }
+	       else
+		 {
+		   /* otherwise add in first set of the non terminal */
+		   result.add(((non_terminal)sym).first_set());
+
+		   /* if its nullable we continue adding, if not, we are done */
+		   if (!((non_terminal)sym).nullable())
+		     return result;
+		 }
+	     }
+	}
+
+      /* if we get here everything past the dot was nullable 
+         we add in the lookahead for after the production and we are done */
+      result.add(lookahead_after);
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if everything from the symbol one beyond the dot all the 
+   *  way to the  end of the right hand side is nullable.  This would indicate
+   *  that the lookahead of this item must be included in the lookaheads of
+   *  all items produced as a closure of this item.  Note: this routine should 
+   *  not be invoked until after first sets and nullability have been 
+   *  calculated for all non terminals. 
+   */
+  public boolean lookahead_visible() throws internal_error
+    {
+      production_part part;
+      symbol          sym;
+
+      /* if the dot is at the end, we have a problem, but the cleanest thing
+	 to do is just return true. */
+      if (dot_at_end()) return true;
+
+      /* walk down the rhs and bail if we get a non-nullable symbol */
+      for (int pos = dot_pos() + 1; pos < the_production().rhs_length(); pos++)
+	{
+	  part = the_production().rhs(pos);
+
+	  /* skip actions */
+	  if (!part.is_action())
+	    {
+	      sym = ((symbol_part)part).the_symbol();
+
+	      /* if its a terminal we fail */
+	      if (!sym.is_non_term()) return false;
+
+	      /* if its not nullable we fail */
+	      if (!((non_terminal)sym).nullable()) return false;
+	    }
+	}
+
+      /* if we get here its all nullable */
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison -- here we only require the cores to be equal since
+   *   we need to do sets of items based only on core equality (ignoring 
+   *   lookahead sets). 
+   */
+  public boolean equals(lalr_item other)
+    {
+      if (other == null) return false;
+      return super.equals(other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof lalr_item)) 
+	return false;
+      else
+	return equals((lalr_item)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return a hash code -- here we only hash the core since we only test core
+   *  matching in LALR items. 
+   */
+  public int hashCode()
+    {
+      return super.hashCode();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to string. */
+  public String toString()
+    {
+      String result = "";
+
+      // additional output for debugging:
+      // result += "(" + obj_hash() + ")"; 
+      result += "[";
+      result += super.toString();
+      result += ", ";
+      if (lookahead() != null)
+	{
+	  result += "{";
+	  for (int t = 0; t < terminal.number(); t++)
+	    if (lookahead().contains(t))
+	      result += terminal.find(t).name() + " ";
+	  result += "}";
+	}
+      else
+	result += "NULL LOOKAHEAD!!";
+      result += "]";
+
+      // additional output for debugging:
+      // result += " -> ";
+      // for (int i = 0; i<propagate_items().size(); i++)
+      //   result+=((lalr_item)(propagate_items().elementAt(i))).obj_hash()+" ";
+      //
+      // if (needs_propagation) result += " NP";
+
+      return result;
+    }
+    /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/lalr_item_set.java b/open-nars/java_cup/lalr_item_set.java
new file mode 100644
index 0000000..233a68f
--- /dev/null
+++ b/open-nars/java_cup/lalr_item_set.java
@@ -0,0 +1,371 @@
+
+package java_cup;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/** This class represents a set of LALR items.  For purposes of building
+ *  these sets, items are considered unique only if they have unique cores
+ *  (i.e., ignoring differences in their lookahead sets).<p>
+ *
+ *  This class provides fairly conventional set oriented operations (union,
+ *  sub/super-set tests, etc.), as well as an LALR "closure" operation (see 
+ *  compute_closure()).
+ *
+ * @see     java_cup.lalr_item
+ * @see     java_cup.lalr_state
+ * @version last updated: 3/6/96
+ * @author  Scott Hudson
+ */
+
+public class lalr_item_set {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constructor for an empty set. */
+  public lalr_item_set() { }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor for cloning from another set. 
+   * @param other indicates set we should copy from.
+   */
+  public lalr_item_set(lalr_item_set other) 
+    throws internal_error
+    {
+      not_null(other);
+      _all = (Hashtable)other._all.clone();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** A hash table to implement the set.  We store the items using themselves
+   *  as keys. 
+   */
+  protected Hashtable _all = new Hashtable(11);
+
+  /** Access to all elements of the set. */
+  public Enumeration all() {return _all.elements();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Cached hashcode for this set. */
+  protected Integer hashcode_cache = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Size of the set */
+  public int size() {return _all.size();}
+
+  /*-----------------------------------------------------------*/
+  /*--- Set Operation Methods ---------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Does the set contain a particular item? 
+   * @param itm the item in question.
+   */
+  public boolean contains(lalr_item itm) {return _all.containsKey(itm);}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return the item in the set matching a particular item (or null if not 
+   *  found) 
+   *  @param itm the item we are looking for.
+   */
+  public lalr_item find(lalr_item itm) {return (lalr_item)_all.get(itm);}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Is this set an (improper) subset of another? 
+   * @param other the other set in question.
+   */
+  public boolean is_subset_of(lalr_item_set other) throws internal_error
+    {
+      not_null(other);
+
+      /* walk down our set and make sure every element is in the other */
+      for (Enumeration e = all(); e.hasMoreElements(); )
+	if (!other.contains((lalr_item)e.nextElement()))
+	  return false;
+
+      /* they were all there */
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Is this set an (improper) superset of another? 
+   * @param other the other set in question.
+   */
+  public boolean is_superset_of(lalr_item_set other) throws internal_error
+    {
+      not_null(other);
+      return other.is_subset_of(this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a singleton item, merging lookahead sets if the item is already 
+   *  part of the set.  returns the element of the set that was added or 
+   *  merged into.
+   * @param itm the item being added.
+   */
+  public lalr_item add(lalr_item itm) throws internal_error
+    {
+      lalr_item other;
+
+      not_null(itm); 
+
+      /* see if an item with a matching core is already there */
+      other = (lalr_item)_all.get(itm);
+
+      /* if so, merge this lookahead into the original and leave it */
+      if (other != null)
+	{
+	  other.lookahead().add(itm.lookahead());
+	  return other;
+	}
+      /* otherwise we just go in the set */
+      else
+	{
+          /* invalidate cached hashcode */
+          hashcode_cache = null;
+
+          _all.put(itm,itm);
+	  return itm;
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove a single item if it is in the set. 
+   * @param itm the item to remove.
+   */
+  public void remove(lalr_item itm) throws internal_error
+    {
+      not_null(itm); 
+
+      /* invalidate cached hashcode */
+      hashcode_cache = null;
+
+      /* remove it from hash table implementing set */
+      _all.remove(itm);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a complete set, merging lookaheads where items are already in 
+   *  the set 
+   * @param other the set to be added.
+   */
+  public void add(lalr_item_set other) throws internal_error
+    {
+      not_null(other);
+
+      /* walk down the other set and do the adds individually */
+      for (Enumeration e = other.all(); e.hasMoreElements(); )
+	add((lalr_item)e.nextElement());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove (set subtract) a complete set. 
+   * @param other the set to remove.
+   */
+  public void remove(lalr_item_set other) throws internal_error
+    {
+      not_null(other);
+
+      /* walk down the other set and do the removes individually */
+      for (Enumeration e = other.all(); e.hasMoreElements(); )
+	remove((lalr_item)e.nextElement());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove and return one item from the set (done in hash order). */
+  public lalr_item get_one() throws internal_error
+    {
+      Enumeration the_set;
+      lalr_item result;
+
+      the_set = all();
+      if (the_set.hasMoreElements())
+	{
+          result = (lalr_item)the_set.nextElement();
+          remove(result);
+	  return result;
+	}
+      else
+	return null;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Helper function for null test.  Throws an interal_error exception if its
+   *  parameter is null.
+   *  @param obj the object we are testing.
+   */
+  protected void not_null(Object obj) throws internal_error
+    {
+      if (obj == null) 
+	throw new internal_error("Null object used in set operation");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute the closure of the set using the LALR closure rules.  Basically
+   *  for every item of the form: <pre>
+   *    [L ::= a *N alpha, l] 
+   *  </pre>
+   *  (where N is a a non terminal and alpha is a string of symbols) make 
+   *  sure there are also items of the form:  <pre>
+   *    [N ::= *beta, first(alpha l)] 
+   *  </pre>
+   *  corresponding to each production of N.  Items with identical cores but 
+   *  differing lookahead sets are merged by creating a new item with the same 
+   *  core and the union of the lookahead sets (the LA in LALR stands for 
+   *  "lookahead merged" and this is where the merger is).  This routine 
+   *  assumes that nullability and first sets have been computed for all 
+   *  productions before it is called.
+   */
+  public void compute_closure()
+    throws internal_error
+    {
+      lalr_item_set consider;
+      lalr_item     itm, new_itm, add_itm;
+      non_terminal  nt;
+      terminal_set  new_lookaheads;
+      Enumeration   p;
+      production    prod;
+      boolean       need_prop;
+
+
+
+      /* invalidate cached hashcode */
+      hashcode_cache = null;
+
+      /* each current element needs to be considered */
+      consider = new lalr_item_set(this);
+
+      /* repeat this until there is nothing else to consider */
+      while (consider.size() > 0)
+	{
+	  /* get one item to consider */
+	  itm = consider.get_one(); 
+
+	  /* do we have a dot before a non terminal */
+	  nt = itm.dot_before_nt();
+	  if (nt != null)
+	    {
+	      /* create the lookahead set based on first after dot */
+	      new_lookaheads = itm.calc_lookahead(itm.lookahead());
+
+	      /* are we going to need to propagate our lookahead to new item */
+	      need_prop = itm.lookahead_visible();
+
+	      /* create items for each production of that non term */
+	      for (p = nt.productions(); p.hasMoreElements(); )
+		{
+		  prod = (production)p.nextElement();
+
+		  /* create new item with dot at start and that lookahead */
+		  new_itm = new lalr_item(prod, 
+					     new terminal_set(new_lookaheads));
+
+		  /* add/merge item into the set */
+		  add_itm = add(new_itm);
+		  /* if propagation is needed link to that item */
+		  if (need_prop)
+		    itm.add_propagate(add_itm);
+
+		  /* was this was a new item*/
+		  if (add_itm == new_itm)
+		    {
+		      /* that may need further closure, consider it also */ 
+		      consider.add(new_itm);
+		    } 
+		} 
+	    } 
+	} 
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(lalr_item_set other)
+    {
+      if (other == null || other.size() != size()) return false;
+
+      /* once we know they are the same size, then improper subset does test */
+      try {
+        return is_subset_of(other);
+      } catch (internal_error e) {
+	/* can't throw error from here (because superclass doesn't) so crash */
+	e.crash();
+	return false;
+      }
+
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof lalr_item_set))
+	return false;
+      else
+	return equals((lalr_item_set)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return hash code. */
+  public int hashCode()
+    {
+      int result = 0;
+      Enumeration e;
+      int cnt;
+
+      /* only compute a new one if we don't have it cached */
+      if (hashcode_cache == null)
+	{
+          /* hash together codes from at most first 5 elements */
+	  //   CSA fix! we'd *like* to hash just a few elements, but
+	  //   that means equal sets will have inequal hashcodes, which
+	  //   we're not allowed (by contract) to do.  So hash them all.
+          for (e = all(), cnt=0 ; e.hasMoreElements() /*&& cnt<5*/; cnt++)
+	    result ^= ((lalr_item)e.nextElement()).hashCode();
+
+	  hashcode_cache = new Integer(result);
+	}
+
+      return hashcode_cache.intValue();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to string. */
+  public String toString()
+    {
+      StringBuffer result = new StringBuffer();
+
+      result.append("{\n");
+      for (Enumeration e=all(); e.hasMoreElements(); ) 
+ 	{
+ 	  result.append("  " + (lalr_item)e.nextElement() + "\n");
+ 	}
+       result.append("}");
+
+       return result.toString();
+    }
+    /*-----------------------------------------------------------*/
+}
+
diff --git a/open-nars/java_cup/lalr_state.java b/open-nars/java_cup/lalr_state.java
new file mode 100644
index 0000000..5298e87
--- /dev/null
+++ b/open-nars/java_cup/lalr_state.java
@@ -0,0 +1,884 @@
+
+package java_cup;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Stack;
+
+/** This class represents a state in the LALR viable prefix recognition machine.
+ *  A state consists of an LALR item set and a set of transitions to other 
+ *  states under terminal and non-terminal symbols.  Each state represents
+ *  a potential configuration of the parser.  If the item set of a state 
+ *  includes an item such as: <pre>
+ *    [A ::= B * C d E , {a,b,c}]
+ *  </pre> 
+ *  this indicates that when the parser is in this state it is currently 
+ *  looking for an A of the given form, has already seen the B, and would
+ *  expect to see an a, b, or c after this sequence is complete.  Note that
+ *  the parser is normally looking for several things at once (represented
+ *  by several items).  In our example above, the state would also include
+ *  items such as: <pre>
+ *    [C ::= * X e Z, {d}]
+ *    [X ::= * f, {e}]
+ *  </pre> 
+ *  to indicate that it was currently looking for a C followed by a d (which
+ *  would be reduced into a C, matching the first symbol in our production 
+ *  above), and the terminal f followed by e.<p>
+ *
+ *  At runtime, the parser uses a viable prefix recognition machine made up
+ *  of these states to parse.  The parser has two operations, shift and reduce.
+ *  In a shift, it consumes one Symbol and makes a transition to a new state.
+ *  This corresponds to "moving the dot past" a terminal in one or more items
+ *  in the state (these new shifted items will then be found in the state at
+ *  the end of the transition).  For a reduce operation, the parser is 
+ *  signifying that it is recognizing the RHS of some production.  To do this
+ *  it first "backs up" by popping a stack of previously saved states.  It 
+ *  pops off the same number of states as are found in the RHS of the 
+ *  production.  This leaves the machine in the same state is was in when the
+ *  parser first attempted to find the RHS.  From this state it makes a 
+ *  transition based on the non-terminal on the LHS of the production.  This
+ *  corresponds to placing the parse in a configuration equivalent to having 
+ *  replaced all the symbols from the the input corresponding to the RHS with 
+ *  the symbol on the LHS.
+ *
+ * @see     java_cup.lalr_item
+ * @see     java_cup.lalr_item_set
+ * @see     java_cup.lalr_transition
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ *  
+ */
+
+public class lalr_state {
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** Constructor for building a state from a set of items.
+   * @param itms the set of items that makes up this state.
+   */
+  public lalr_state(lalr_item_set itms) throws internal_error
+   {
+     /* don't allow null or duplicate item sets */
+     if (itms == null)
+       throw new internal_error(
+	 "Attempt to construct an LALR state from a null item set");
+
+     if (find_state(itms) != null)
+       throw new internal_error(
+	 "Attempt to construct a duplicate LALR state");
+
+     /* assign a unique index */
+      _index = next_index++;
+
+     /* store the items */
+     _items = itms;
+
+     /* add to the global collection, keyed with its item set */
+     _all.put(_items,this);
+   }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Collection of all states. */
+  protected static Hashtable _all = new Hashtable();
+
+  /** Collection of all states. */
+  public static Enumeration all() {return _all.elements();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indicate total number of states there are. */
+  public static int number() {return _all.size();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Hash table to find states by their kernels (i.e, the original, 
+   *  unclosed, set of items -- which uniquely define the state).  This table 
+   *  stores state objects using (a copy of) their kernel item sets as keys. 
+   */
+  protected static Hashtable _all_kernels = new Hashtable();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Find and return state with a given a kernel item set (or null if not 
+   *  found).  The kernel item set is the subset of items that were used to
+   *  originally create the state.  These items are formed by "shifting the
+   *  dot" within items of other states that have a transition to this one.
+   *  The remaining elements of this state's item set are added during closure.
+   * @param itms the kernel set of the state we are looking for. 
+   */
+  public static lalr_state find_state(lalr_item_set itms)
+    {
+      if (itms == null) 
+  	return null;
+      else
+  	return (lalr_state)_all.get(itms);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Static counter for assigning unique state indexes. */
+  protected static int next_index = 0;
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The item set for this state. */
+  protected lalr_item_set _items;
+
+  /** The item set for this state. */
+  public lalr_item_set items() {return _items;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** List of transitions out of this state. */
+  protected lalr_transition _transitions = null;
+
+  /** List of transitions out of this state. */
+  public lalr_transition transitions() {return _transitions;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Index of this state in the parse tables */
+  protected int _index;
+
+  /** Index of this state in the parse tables */
+  public int index() {return _index;}
+
+  /*-----------------------------------------------------------*/
+  /*--- Static Methods ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Helper routine for debugging -- produces a dump of the given state
+    * onto System.out.
+    */
+  protected static void dump_state(lalr_state st) throws internal_error
+    {
+      lalr_item_set itms;
+      lalr_item itm;
+      production_part part;
+
+      if (st == null) 
+	{
+	  System.out.println("NULL lalr_state");
+	  return;
+	}
+
+      System.out.println("lalr_state [" + st.index() + "] {");
+      itms = st.items();
+      for (Enumeration e = itms.all(); e.hasMoreElements(); )
+	{
+	  itm = (lalr_item)e.nextElement();
+	  System.out.print("  [");
+	  System.out.print(itm.the_production().lhs().the_symbol().name());
+	  System.out.print(" ::= ");
+	  for (int i = 0; i<itm.the_production().rhs_length(); i++)
+	    {
+	      if (i == itm.dot_pos()) System.out.print("(*) ");
+	      part = itm.the_production().rhs(i);
+	      if (part.is_action()) 
+		System.out.print("{action} ");
+	      else
+		System.out.print(((symbol_part)part).the_symbol().name() + " ");
+	    }
+	  if (itm.dot_at_end()) System.out.print("(*) ");
+	  System.out.println("]");
+	}
+      System.out.println("}");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Propagate lookahead sets through the constructed viable prefix 
+   *  recognizer.  When the machine is constructed, each item that results
+      in the creation of another such that its lookahead is included in the
+      other's will have a propagate link set up for it.  This allows additions
+      to the lookahead of one item to be included in other items that it 
+      was used to directly or indirectly create.
+   */
+  protected static void propagate_all_lookaheads() throws internal_error
+    {
+      /* iterate across all states */
+      for (Enumeration st = all(); st.hasMoreElements(); )
+	{
+	  /* propagate lookaheads out of that state */
+	  ((lalr_state)st.nextElement()).propagate_lookaheads();
+	}
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Add a transition out of this state to another.
+   * @param on_sym the symbol the transition is under.
+   * @param to_st  the state the transition goes to.
+   */
+  public void add_transition(symbol on_sym, lalr_state to_st) 
+    throws internal_error
+    {
+      lalr_transition trans;
+
+      /* create a new transition object and put it in our list */
+      trans = new lalr_transition(on_sym, to_st, _transitions);
+      _transitions = trans;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Build an LALR viable prefix recognition machine given a start 
+   *  production.  This method operates by first building a start state
+   *  from the start production (based on a single item with the dot at
+   *  the beginning and EOF as expected lookahead).  Then for each state
+   *  it attempts to extend the machine by creating transitions out of
+   *  the state to new or existing states.  When considering extension
+   *  from a state we make a transition on each symbol that appears before
+   *  the dot in some item.  For example, if we have the items: <pre>
+   *    [A ::= a b * X c, {d,e}]
+   *    [B ::= a b * X d, {a,b}]
+   *  </pre>
+   *  in some state, then we would be making a transition under X to a new
+   *  state.  This new state would be formed by a "kernel" of items 
+   *  corresponding to moving the dot past the X.  In this case: <pre>
+   *    [A ::= a b X * c, {d,e}]
+   *    [B ::= a b X * Y, {a,b}]
+   *  </pre>
+   *  The full state would then be formed by "closing" this kernel set of 
+   *  items so that it included items that represented productions of things
+   *  the parser was now looking for.  In this case we would items 
+   *  corresponding to productions of Y, since various forms of Y are expected
+   *  next when in this state (see lalr_item_set.compute_closure() for details 
+   *  on closure). <p>
+   *
+   *  The process of building the viable prefix recognizer terminates when no
+   *  new states can be added.  However, in order to build a smaller number of
+   *  states (i.e., corresponding to LALR rather than canonical LR) the state 
+   *  building process does not maintain full loookaheads in all items.  
+   *  Consequently, after the machine is built, we go back and propagate 
+   *  lookaheads through the constructed machine using a call to 
+   *  propagate_all_lookaheads().  This makes use of propagation links 
+   *  constructed during the closure and transition process.
+   *
+   * @param start_prod the start production of the grammar
+   * @see   java_cup.lalr_item_set#compute_closure
+   * @see   java_cup.lalr_state#propagate_all_lookaheads
+   */
+
+  public static lalr_state build_machine(production start_prod) 
+    throws internal_error
+    {
+      lalr_state    start_state;
+      lalr_item_set start_items;
+      lalr_item_set new_items;
+      lalr_item_set linked_items;
+      lalr_item_set kernel;
+      Stack         work_stack = new Stack();
+      lalr_state    st, new_st;
+      symbol_set    outgoing;
+      lalr_item     itm, new_itm, existing, fix_itm;
+      symbol        sym, sym2;
+      Enumeration   i, s, fix;
+
+      /* sanity check */
+      if (start_prod == null)
+	throw new internal_error(
+ 	  "Attempt to build viable prefix recognizer using a null production");
+
+      /* build item with dot at front of start production and EOF lookahead */
+      start_items = new lalr_item_set();
+
+      itm = new lalr_item(start_prod);
+      itm.lookahead().add(terminal.EOF);
+
+      start_items.add(itm);
+
+      /* create copy the item set to form the kernel */
+      kernel = new lalr_item_set(start_items);
+
+      /* create the closure from that item set */
+      start_items.compute_closure();
+
+      /* build a state out of that item set and put it in our work set */
+      start_state = new lalr_state(start_items);
+      work_stack.push(start_state);
+
+      /* enter the state using the kernel as the key */
+      _all_kernels.put(kernel, start_state);
+
+      /* continue looking at new states until we have no more work to do */
+      while (!work_stack.empty())
+	{
+	  /* remove a state from the work set */
+	  st = (lalr_state)work_stack.pop();
+
+	  /* gather up all the symbols that appear before dots */
+	  outgoing = new symbol_set();
+	  for (i = st.items().all(); i.hasMoreElements(); )
+	    {
+	      itm = (lalr_item)i.nextElement();
+
+	      /* add the symbol before the dot (if any) to our collection */
+	      sym = itm.symbol_after_dot();
+	      if (sym != null) outgoing.add(sym);
+	    }
+
+	  /* now create a transition out for each individual symbol */
+	  for (s = outgoing.all(); s.hasMoreElements(); )
+	    {
+	      sym = (symbol)s.nextElement();
+
+	      /* will be keeping the set of items with propagate links */
+	      linked_items = new lalr_item_set();
+
+	      /* gather up shifted versions of all the items that have this
+		 symbol before the dot */
+	      new_items = new lalr_item_set();
+	      for (i = st.items().all(); i.hasMoreElements();)
+		{
+		  itm = (lalr_item)i.nextElement();
+
+		  /* if this is the symbol we are working on now, add to set */
+		  sym2 = itm.symbol_after_dot();
+		  if (sym.equals(sym2))
+		    {
+		      /* add to the kernel of the new state */
+		      new_items.add(itm.shift());
+
+		      /* remember that itm has propagate link to it */
+		      linked_items.add(itm);
+		    }
+		}
+
+	      /* use new items as state kernel */
+	      kernel = new lalr_item_set(new_items);
+
+	      /* have we seen this one already? */
+	      new_st = (lalr_state)_all_kernels.get(kernel);
+
+	      /* if we haven't, build a new state out of the item set */
+	      if (new_st == null)
+		{
+	          /* compute closure of the kernel for the full item set */
+	          new_items.compute_closure();
+
+		  /* build the new state */
+		  new_st = new lalr_state(new_items);
+
+		  /* add the new state to our work set */
+		  work_stack.push(new_st);
+
+		  /* put it in our kernel table */
+		  _all_kernels.put(kernel, new_st);
+		}
+	      /* otherwise relink propagation to items in existing state */
+	      else 
+		{
+		  /* walk through the items that have links to the new state */
+		  for (fix = linked_items.all(); fix.hasMoreElements(); )
+		    {
+		      fix_itm = (lalr_item)fix.nextElement();
+
+		      /* look at each propagate link out of that item */
+		      for (int l =0; l < fix_itm.propagate_items().size(); l++)
+			{
+			  /* pull out item linked to in the new state */
+			  new_itm = 
+			    (lalr_item)fix_itm.propagate_items().elementAt(l);
+
+			  /* find corresponding item in the existing state */
+			  existing = new_st.items().find(new_itm);
+
+			  /* fix up the item so it points to the existing set */
+			  if (existing != null)
+			    fix_itm.propagate_items().setElementAt(existing ,l);
+			}
+		    }
+		}
+
+	      /* add a transition from current state to that state */
+	      st.add_transition(sym, new_st);
+	    }
+	}
+
+      /* all done building states */
+
+      /* propagate complete lookahead sets throughout the states */
+      propagate_all_lookaheads();
+
+      return start_state;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Propagate lookahead sets out of this state. This recursively 
+   *  propagates to all items that have propagation links from some item 
+   *  in this state. 
+   */
+  protected void propagate_lookaheads() throws internal_error
+    {
+      /* recursively propagate out from each item in the state */
+      for (Enumeration itm = items().all(); itm.hasMoreElements(); )
+	((lalr_item)itm.nextElement()).propagate_lookaheads(null);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Fill in the parse table entries for this state.  There are two 
+   *  parse tables that encode the viable prefix recognition machine, an 
+   *  action table and a reduce-goto table.  The rows in each table 
+   *  correspond to states of the machine.  The columns of the action table
+   *  are indexed by terminal symbols and correspond to either transitions 
+   *  out of the state (shift entries) or reductions from the state to some
+   *  previous state saved on the stack (reduce entries).  All entries in the
+   *  action table that are not shifts or reduces, represent errors.    The
+   *  reduce-goto table is indexed by non terminals and represents transitions 
+   *  out of a state on that non-terminal.<p>
+   *  Conflicts occur if more than one action needs to go in one entry of the
+   *  action table (this cannot happen with the reduce-goto table).  Conflicts
+   *  are resolved by always shifting for shift/reduce conflicts and choosing
+   *  the lowest numbered production (hence the one that appeared first in
+   *  the specification) in reduce/reduce conflicts.  All conflicts are 
+   *  reported and if more conflicts are detected than were declared by the
+   *  user, code generation is aborted.
+   *
+   * @param act_table    the action table to put entries in.
+   * @param reduce_table the reduce-goto table to put entries in.
+   */
+  public void build_table_entries(
+    parse_action_table act_table, 
+    parse_reduce_table reduce_table)
+    throws internal_error
+    {
+      parse_action_row our_act_row;
+      parse_reduce_row our_red_row;
+      lalr_item        itm;
+      parse_action     act, other_act;
+      symbol           sym;
+      terminal_set     conflict_set = new terminal_set();
+
+      /* pull out our rows from the tables */
+      our_act_row = act_table.under_state[index()];
+      our_red_row = reduce_table.under_state[index()];
+
+      /* consider each item in our state */
+      for (Enumeration i = items().all(); i.hasMoreElements(); )
+	{
+	  itm = (lalr_item)i.nextElement();
+	 
+
+	  /* if its completed (dot at end) then reduce under the lookahead */
+	  if (itm.dot_at_end())
+	    {
+	      act = new reduce_action(itm.the_production());
+
+	      /* consider each lookahead symbol */
+	      for (int t = 0; t < terminal.number(); t++)
+		{
+		  /* skip over the ones not in the lookahead */
+		  if (!itm.lookahead().contains(t)) continue;
+
+	          /* if we don't already have an action put this one in */
+	          if (our_act_row.under_term[t].kind() == 
+		      parse_action.ERROR)
+		    {
+	              our_act_row.under_term[t] = act;
+		    }
+	          else
+		    {
+		      /* we now have at least one conflict */
+		      terminal term = terminal.find(t);
+		      other_act = our_act_row.under_term[t];
+
+		      /* if the other act was not a shift */
+		      if ((other_act.kind() != parse_action.SHIFT) && 
+			  (other_act.kind() != parse_action.NONASSOC))
+		        {
+		        /* if we have lower index hence priority, replace it*/
+		          if (itm.the_production().index() < 
+			      ((reduce_action)other_act).reduce_with().index())
+			    {
+			      /* replace the action */
+			      our_act_row.under_term[t] = act;
+			    }
+		        } else {
+			  /*  Check precedences,see if problem is correctable */
+			  if(fix_with_precedence(itm.the_production(), 
+						 t, our_act_row, act)) {
+			    term = null;
+			  }
+			}
+		      if(term!=null) {
+
+			conflict_set.add(term);
+		      }
+		    }
+		}
+	    }
+	}
+
+      /* consider each outgoing transition */
+      for (lalr_transition trans=transitions(); trans!=null; trans=trans.next())
+	{
+	  /* if its on an terminal add a shift entry */
+	  sym = trans.on_symbol();
+	  if (!sym.is_non_term())
+	    {
+	      act = new shift_action(trans.to_state());
+
+	      /* if we don't already have an action put this one in */
+	      if ( our_act_row.under_term[sym.index()].kind() == 
+		   parse_action.ERROR)
+		{
+	          our_act_row.under_term[sym.index()] = act;
+		}
+	      else
+		{
+		  /* we now have at least one conflict */
+		  production p = ((reduce_action)our_act_row.under_term[sym.index()]).reduce_with();
+
+		  /* shift always wins */
+		  if (!fix_with_precedence(p, sym.index(), our_act_row, act)) {
+		    our_act_row.under_term[sym.index()] = act;
+		    conflict_set.add(terminal.find(sym.index()));
+		  }
+		}
+	    }
+	  else
+	    {
+	      /* for non terminals add an entry to the reduce-goto table */
+	      our_red_row.under_non_term[sym.index()] = trans.to_state();
+	    }
+	}
+
+      /* if we end up with conflict(s), report them */
+      if (!conflict_set.empty())
+        report_conflicts(conflict_set);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+    
+  /** Procedure that attempts to fix a shift/reduce error by using
+   * precedences.  --frankf 6/26/96
+   *  
+   *  if a production (also called rule) or the lookahead terminal
+   *  has a precedence, then the table can be fixed.  if the rule
+   *  has greater precedence than the terminal, a reduce by that rule
+   *  in inserted in the table.  If the terminal has a higher precedence, 
+   *  it is shifted.  if they have equal precedence, then the associativity
+   *  of the precedence is used to determine what to put in the table:
+   *  if the precedence is left associative, the action is to reduce. 
+   *  if the precedence is right associative, the action is to shift.
+   *  if the precedence is non associative, then it is a syntax error.
+   *
+   *  @param p           the production
+   *  @param term_index  the index of the lokahead terminal
+   *  @param parse_action_row  a row of the action table
+   *  @param act         the rule in conflict with the table entry
+   */
+
+    protected boolean fix_with_precedence(
+		        production       p,
+			int              term_index,
+			parse_action_row table_row,
+			parse_action     act)
+
+      throws internal_error {
+
+      terminal term = terminal.find(term_index);
+
+      /* if the production has a precedence number, it can be fixed */
+      if (p.precedence_num() > assoc.no_prec) {
+
+	/* if production precedes terminal, put reduce in table */
+	if (p.precedence_num() > term.precedence_num()) {
+	  table_row.under_term[term_index] = 
+	    insert_reduce(table_row.under_term[term_index],act);
+	  return true;
+	} 
+
+	/* if terminal precedes rule, put shift in table */
+	else if (p.precedence_num() < term.precedence_num()) {
+	  table_row.under_term[term_index] = 
+	    insert_shift(table_row.under_term[term_index],act);
+	  return true;
+	} 
+	else {  /* they are == precedence */
+
+	  /* equal precedences have equal sides, so only need to 
+	     look at one: if it is right, put shift in table */
+	  if (term.precedence_side() == assoc.right) {
+	  table_row.under_term[term_index] = 
+	    insert_shift(table_row.under_term[term_index],act);
+	    return true;
+	  }
+
+	  /* if it is left, put reduce in table */
+	  else if (term.precedence_side() == assoc.left) {
+	    table_row.under_term[term_index] = 
+	      insert_reduce(table_row.under_term[term_index],act);
+	    return true;
+	  }
+
+	  /* if it is nonassoc, we're not allowed to have two nonassocs
+	     of equal precedence in a row, so put in NONASSOC */
+	  else if (term.precedence_side() == assoc.nonassoc) {
+            table_row.under_term[term_index] = new nonassoc_action();
+	    return true;
+	  } else {
+	    /* something really went wrong */
+	    throw new internal_error("Unable to resolve conflict correctly");
+	  }
+	}
+      }
+      /* check if terminal has precedence, if so, shift, since 
+	 rule does not have precedence */
+      else if (term.precedence_num() > assoc.no_prec) {
+	 table_row.under_term[term_index] = 
+	   insert_shift(table_row.under_term[term_index],act);
+	 return true;
+      }
+       
+      /* otherwise, neither the rule nor the terminal has a precedence,
+	 so it can't be fixed. */
+      return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+
+  /*  given two actions, and an action type, return the 
+      action of that action type.  give an error if they are of
+      the same action, because that should never have tried
+      to be fixed 
+     
+  */
+    protected parse_action insert_action(
+					parse_action a1,
+					parse_action a2,
+					int act_type) 
+      throws internal_error
+    {
+      if ((a1.kind() == act_type) && (a2.kind() == act_type)) {
+	throw new internal_error("Conflict resolution of bogus actions");
+      } else if (a1.kind() == act_type) {
+	return a1;
+      } else if (a2.kind() == act_type) {
+	return a2;
+      } else {
+	throw new internal_error("Conflict resolution of bogus actions");
+      }
+    }
+
+    /* find the shift in the two actions */
+    protected parse_action insert_shift(
+					parse_action a1,
+					parse_action a2) 
+      throws internal_error  
+    {
+      return insert_action(a1, a2, parse_action.SHIFT);
+    }
+
+    /* find the reduce in the two actions */
+    protected parse_action insert_reduce(
+					parse_action a1,
+					parse_action a2) 
+      throws internal_error
+    {
+      return insert_action(a1, a2, parse_action.REDUCE);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce warning messages for all conflicts found in this state.  */
+  protected void report_conflicts(terminal_set conflict_set)
+    throws internal_error
+    {
+      lalr_item    itm, compare;
+      symbol       shift_sym;
+
+      boolean      after_itm;
+
+      /* consider each element */
+      for (Enumeration itms = items().all(); itms.hasMoreElements(); )
+	{
+	  itm = (lalr_item)itms.nextElement();
+
+	  /* clear the S/R conflict set for this item */
+
+	  /* if it results in a reduce, it could be a conflict */
+	  if (itm.dot_at_end())
+	    {
+	      /* not yet after itm */
+	      after_itm = false;
+
+	      /* compare this item against all others looking for conflicts */
+	      for (Enumeration comps = items().all(); comps.hasMoreElements(); )
+		{
+		  compare = (lalr_item)comps.nextElement();
+
+		  /* if this is the item, next one is after it */
+		  if (itm == compare) after_itm = true;
+
+		  /* only look at it if its not the same item */
+		  if (itm != compare)
+		    {
+		      /* is it a reduce */
+		      if (compare.dot_at_end())
+			{
+			  /* only look at reduces after itm */
+			  if (after_itm)
+                            /* does the comparison item conflict? */
+                            if (compare.lookahead().intersects(itm.lookahead()))
+                              /* report a reduce/reduce conflict */
+                              report_reduce_reduce(itm, compare);
+			}
+		    }
+		}
+	      /* report S/R conflicts under all the symbols we conflict under */
+	      for (int t = 0; t < terminal.number(); t++)
+		if (conflict_set.contains(t))
+		  report_shift_reduce(itm,t);
+	    }
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a warning message for one reduce/reduce conflict. 
+   *
+   * @param itm1 first item in conflict.
+   * @param itm2 second item in conflict.
+   */
+  protected void report_reduce_reduce(lalr_item itm1, lalr_item itm2)
+    throws internal_error
+    {
+      boolean comma_flag = false;
+
+      System.err.println("*** Reduce/Reduce conflict found in state #"+index());
+      System.err.print  ("  between ");
+      System.err.println(itm1.to_simple_string());
+      System.err.print  ("  and     ");
+      System.err.println(itm2.to_simple_string());
+      System.err.print("  under symbols: {" );
+      for (int t = 0; t < terminal.number(); t++)
+	{
+	  if (itm1.lookahead().contains(t) && itm2.lookahead().contains(t))
+	    {
+	      if (comma_flag) System.err.print(", "); else comma_flag = true;
+	      System.err.print(terminal.find(t).name());
+	    }
+	}
+      System.err.println("}");
+      System.err.print("  Resolved in favor of ");
+      if (itm1.the_production().index() < itm2.the_production().index())
+	System.err.println("the first production.\n");
+      else
+	System.err.println("the second production.\n");
+
+      /* count the conflict */
+      emit.num_conflicts++;
+      lexer.warning_count++;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a warning message for one shift/reduce conflict.
+   *
+   * @param red_itm      the item with the reduce.
+   * @param conflict_sym the index of the symbol conflict occurs under.
+   */
+  protected void report_shift_reduce(
+    lalr_item red_itm, 
+    int       conflict_sym)
+    throws internal_error
+    {
+      lalr_item    itm;
+      symbol       shift_sym;
+
+      /* emit top part of message including the reduce item */
+      System.err.println("*** Shift/Reduce conflict found in state #"+index());
+      System.err.print  ("  between ");
+      System.err.println(red_itm.to_simple_string());
+
+      /* find and report on all items that shift under our conflict symbol */
+      for (Enumeration itms = items().all(); itms.hasMoreElements(); )
+	{
+	  itm = (lalr_item)itms.nextElement();
+
+	  /* only look if its not the same item and not a reduce */
+	  if (itm != red_itm && !itm.dot_at_end())
+	    {
+	      /* is it a shift on our conflicting terminal */
+	      shift_sym = itm.symbol_after_dot();
+	      if (!shift_sym.is_non_term() && shift_sym.index() == conflict_sym)
+	        {
+		  /* yes, report on it */
+                  System.err.println("  and     " + itm.to_simple_string());
+		}
+	    }
+	}
+      System.err.println("  under symbol "+ terminal.find(conflict_sym).name());
+      System.err.println("  Resolved in favor of shifting.\n");
+
+      /* count the conflict */
+      emit.num_conflicts++;
+      lexer.warning_count++;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(lalr_state other)
+    {
+      /* we are equal if our item sets are equal */
+      return other != null && items().equals(other.items());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof lalr_state))
+	return false;
+      else
+	return equals((lalr_state)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a hash code. */
+  public int hashCode()
+    {
+      /* just use the item set hash code */
+      return items().hashCode();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      String result;
+      lalr_transition tr;
+
+      /* dump the item set */
+      result = "lalr_state [" + index() + "]: " + _items + "\n";
+
+      /* do the transitions */
+      for (tr = transitions(); tr != null; tr = tr.next())
+	{
+	  result += tr;
+	  result += "\n";
+	}
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/lalr_transition.java b/open-nars/java_cup/lalr_transition.java
new file mode 100644
index 0000000..1c941bd
--- /dev/null
+++ b/open-nars/java_cup/lalr_transition.java
@@ -0,0 +1,93 @@
+package java_cup;
+
+/** This class represents a transition in an LALR viable prefix recognition 
+ *  machine.  Transitions can be under terminals for non-terminals.  They are
+ *  internally linked together into singly linked lists containing all the 
+ *  transitions out of a single state via the _next field.
+ *
+ * @see     java_cup.lalr_state
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ *
+ */
+public class lalr_transition {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor.
+   * @param on_sym  symbol we are transitioning on.
+   * @param to_st   state we transition to.
+   * @param nxt     next transition in linked list.
+   */
+  public lalr_transition(symbol on_sym, lalr_state to_st, lalr_transition nxt)
+    throws internal_error
+    {
+      /* sanity checks */
+      if (on_sym == null)
+	throw new internal_error("Attempt to create transition on null symbol");
+      if (to_st == null)
+	throw new internal_error("Attempt to create transition to null state");
+
+      /* initialize */
+      _on_symbol = on_sym;
+      _to_state  = to_st;
+      _next      = nxt;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with null next. 
+   * @param on_sym  symbol we are transitioning on.
+   * @param to_st   state we transition to.
+   */
+  public lalr_transition(symbol on_sym, lalr_state to_st) throws internal_error
+    {
+      this(on_sym, to_st, null);
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The symbol we make the transition on. */
+  protected symbol _on_symbol;
+
+  /** The symbol we make the transition on. */
+  public symbol on_symbol() {return _on_symbol;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The state we transition to. */
+  protected lalr_state _to_state;
+
+  /** The state we transition to. */
+  public lalr_state to_state() {return _to_state;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Next transition in linked list of transitions out of a state */
+  protected lalr_transition _next;
+
+  /** Next transition in linked list of transitions out of a state */
+  public lalr_transition next() {return _next;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      String result;
+
+      result = "transition on " + on_symbol().name() + " to state [";
+      result += _to_state.index();
+      result += "]";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/lexer.java b/open-nars/java_cup/lexer.java
new file mode 100644
index 0000000..2230d12
--- /dev/null
+++ b/open-nars/java_cup/lexer.java
@@ -0,0 +1,543 @@
+package java_cup;
+
+import java_cup.runtime.Symbol;
+import java.util.Hashtable;
+
+/** This class implements a small scanner (aka lexical analyzer or lexer) for
+ *  the JavaCup specification.  This scanner reads characters from standard 
+ *  input (System.in) and returns integers corresponding to the terminal 
+ *  number of the next Symbol. Once end of input is reached the EOF Symbol is 
+ *  returned on every subsequent call.<p>
+ *  Symbols currently returned include: <pre>
+ *    Symbol        Constant Returned     Symbol        Constant Returned
+ *    ------        -----------------     ------        -----------------
+ *    "package"     PACKAGE               "import"      IMPORT 
+ *    "code"        CODE                  "action"      ACTION 
+ *    "parser"      PARSER                "terminal"    TERMINAL
+ *    "non"         NON                   "init"        INIT 
+ *    "scan"        SCAN                  "with"        WITH
+ *    "start"       START                 "precedence"  PRECEDENCE
+ *    "left"        LEFT		  "right"       RIGHT
+ *    "nonassoc"    NONASSOC		  "%prec        PRECENT_PREC  
+ *      [           LBRACK                  ]           RBRACK
+ *      ;           SEMI 
+ *      ,           COMMA                   *           STAR 
+ *      .           DOT                     :           COLON
+ *      ::=         COLON_COLON_EQUALS      |           BAR
+ *    identifier    ID                    {:...:}       CODE_STRING
+ *    "nonterminal" NONTERMINAL
+ *  </pre>
+ *  All symbol constants are defined in sym.java which is generated by 
+ *  JavaCup from parser.cup.<p>
+ * 
+ *  In addition to the scanner proper (called first via init() then with
+ *  next_token() to get each Symbol) this class provides simple error and 
+ *  warning routines and keeps a count of errors and warnings that is 
+ *  publicly accessible.<p>
+ *  
+ *  This class is "static" (i.e., it has only static members and methods).
+ *
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+public class lexer {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The only constructor is private, so no instances can be created. */
+  private lexer() { }
+
+  /*-----------------------------------------------------------*/
+  /*--- Static (Class) Variables ------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** First character of lookahead. */
+  protected static int next_char; 
+
+  /** Second character of lookahead. */
+  protected static int next_char2;
+
+  /** Second character of lookahead. */
+  protected static int next_char3;
+
+  /** Second character of lookahead. */
+  protected static int next_char4;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** EOF constant. */
+  protected static final int EOF_CHAR = -1;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Table of keywords.  Keywords are initially treated as identifiers.
+   *  Just before they are returned we look them up in this table to see if
+   *  they match one of the keywords.  The string of the name is the key here,
+   *  which indexes Integer objects holding the symbol number. 
+   */
+  protected static Hashtable keywords = new Hashtable(23);
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Table of single character symbols.  For ease of implementation, we 
+   *  store all unambiguous single character Symbols in this table of Integer
+   *  objects keyed by Integer objects with the numerical value of the 
+   *  appropriate char (currently Character objects have a bug which precludes
+   *  their use in tables).
+   */
+  protected static Hashtable char_symbols = new Hashtable(11);
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Current line number for use in error messages. */
+  protected static int current_line = 1;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Character position in current line. */
+  protected static int current_position = 1;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Character position in current line. */
+  protected static int absolute_position = 1;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of total errors detected so far. */
+  public static int error_count = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of warnings issued so far */
+  public static int warning_count = 0;
+
+  /*-----------------------------------------------------------*/
+  /*--- Static Methods ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Initialize the scanner.  This sets up the keywords and char_symbols
+    * tables and reads the first two characters of lookahead.  
+    */
+  public static void init() throws java.io.IOException
+    {
+      /* set up the keyword table */
+      keywords.put("package",    new Integer(sym.PACKAGE));
+      keywords.put("import",     new Integer(sym.IMPORT));
+      keywords.put("code",       new Integer(sym.CODE));
+      keywords.put("action",     new Integer(sym.ACTION));
+      keywords.put("parser",     new Integer(sym.PARSER));
+      keywords.put("terminal",   new Integer(sym.TERMINAL));
+      keywords.put("non",        new Integer(sym.NON));
+      keywords.put("nonterminal",new Integer(sym.NONTERMINAL));// [CSA]
+      keywords.put("init",       new Integer(sym.INIT));
+      keywords.put("scan",       new Integer(sym.SCAN));
+      keywords.put("with",       new Integer(sym.WITH));
+      keywords.put("start",      new Integer(sym.START));
+      keywords.put("precedence", new Integer(sym.PRECEDENCE));
+      keywords.put("left",       new Integer(sym.LEFT));
+      keywords.put("right",      new Integer(sym.RIGHT));
+      keywords.put("nonassoc",   new Integer(sym.NONASSOC));
+
+      /* set up the table of single character symbols */
+      char_symbols.put(new Integer(';'), new Integer(sym.SEMI));
+      char_symbols.put(new Integer(','), new Integer(sym.COMMA));
+      char_symbols.put(new Integer('*'), new Integer(sym.STAR));
+      char_symbols.put(new Integer('.'), new Integer(sym.DOT));
+      char_symbols.put(new Integer('|'), new Integer(sym.BAR));
+      char_symbols.put(new Integer('['), new Integer(sym.LBRACK));
+      char_symbols.put(new Integer(']'), new Integer(sym.RBRACK));
+
+      /* read two characters of lookahead */
+      next_char = System.in.read();
+      if (next_char == EOF_CHAR) {
+	next_char2 = EOF_CHAR;
+        next_char3 = EOF_CHAR;
+        next_char4 = EOF_CHAR;
+      } else {
+	next_char2 = System.in.read();
+	if (next_char2 == EOF_CHAR) {
+	  next_char3 = EOF_CHAR;
+	  next_char4 = EOF_CHAR;
+	} else {
+	  next_char3 = System.in.read();
+	  if (next_char3 == EOF_CHAR) {
+	    next_char4 = EOF_CHAR;
+	  } else {
+	    next_char4 = System.in.read();
+	  }
+	}
+      }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Advance the scanner one character in the input stream.  This moves
+   * next_char2 to next_char and then reads a new next_char2.  
+   */
+  protected static void advance() throws java.io.IOException
+    {
+      int old_char;
+
+      old_char = next_char;
+      next_char = next_char2;
+      if (next_char == EOF_CHAR) {
+	next_char2 = EOF_CHAR;
+        next_char3 = EOF_CHAR;
+	next_char4 = EOF_CHAR;
+      } else {
+	next_char2 = next_char3;
+	if (next_char2 == EOF_CHAR) {
+	  next_char3 = EOF_CHAR;
+	  next_char4 = EOF_CHAR;
+	} else {
+	  next_char3 = next_char4;
+	  if (next_char3 == EOF_CHAR) {
+	    next_char4 = EOF_CHAR;
+	  } else {
+	    next_char4 = System.in.read();
+	  }
+	}
+      }
+
+      /* count this */
+      absolute_position++;
+      current_position++;
+      if (old_char == '\n' || (old_char == '\r' && next_char!='\n'))
+	{
+	  current_line++;
+	  current_position = 1;
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit an error message.  The message will be marked with both the 
+   *  current line number and the position in the line.  Error messages
+   *  are printed on standard error (System.err).
+   * @param message the message to print.
+   */
+  public static void emit_error(String message)
+    {
+      System.err.println("Error at " + current_line + "(" + current_position +
+			 "): " + message);
+      error_count++;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Emit a warning message.  The message will be marked with both the 
+   *  current line number and the position in the line.  Messages are 
+   *  printed on standard error (System.err).
+   * @param message the message to print.
+   */
+  public static void emit_warn(String message)
+    {
+      System.err.println("Warning at " + current_line + "(" + current_position +
+			 "): " + message);
+      warning_count++;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if a character is ok to start an id. 
+   * @param ch the character in question.
+   */
+  protected static boolean id_start_char(int ch)
+    {
+      /* allow for % in identifiers.  a hack to allow my
+	 %prec in.  Should eventually make lex spec for this 
+	 frankf */
+      return (ch >= 'a' &&  ch <= 'z') || (ch >= 'A' && ch <= 'Z') || 
+	     (ch == '_');
+
+      // later need to deal with non-8-bit chars here
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if a character is ok for the middle of an id.
+   * @param ch the character in question. 
+   */
+  protected static boolean id_char(int ch)
+    {
+      return id_start_char(ch) || (ch >= '0' && ch <= '9');
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Try to look up a single character symbol, returns -1 for not found. 
+   * @param ch the character in question.
+   */
+  protected static int find_single_char(int ch)
+    {
+      Integer result;
+
+      result = (Integer)char_symbols.get(new Integer((char)ch));
+      if (result == null) 
+	return -1;
+      else
+	return result.intValue();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Handle swallowing up a comment.  Both old style C and new style C++
+   *  comments are handled.
+   */
+  protected static void swallow_comment() throws java.io.IOException
+    {
+      /* next_char == '/' at this point */
+
+      /* is it a traditional comment */
+      if (next_char2 == '*')
+	{
+	  /* swallow the opener */
+	  advance(); advance();
+
+	  /* swallow the comment until end of comment or EOF */
+	  for (;;)
+	    {
+	      /* if its EOF we have an error */
+	      if (next_char == EOF_CHAR)
+		{
+		  emit_error("Specification file ends inside a comment");
+		  return;
+		}
+
+	      /* if we can see the closer we are done */
+	      if (next_char == '*' && next_char2 == '/')
+		{
+		  advance();
+		  advance();
+		  return;
+		}
+
+	      /* otherwise swallow char and move on */
+	      advance();
+	    }
+	}
+
+      /* is its a new style comment */
+      if (next_char2 == '/')
+	{
+	  /* swallow the opener */
+	  advance(); advance();
+
+	  /* swallow to '\n', '\r', '\f', or EOF */ 
+	  while (next_char != '\n' && next_char != '\r' && 
+		 next_char != '\f' && next_char!=EOF_CHAR)
+	    advance();
+
+	  return;
+
+	}
+
+      /* shouldn't get here, but... if we get here we have an error */
+      emit_error("Malformed comment in specification -- ignored");
+      advance();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Swallow up a code string.  Code strings begin with "{:" and include
+      all characters up to the first occurrence of ":}" (there is no way to 
+      include ":}" inside a code string).  The routine returns a String
+      object suitable for return by the scanner.
+   */
+  protected static Symbol do_code_string() throws java.io.IOException
+    {
+      StringBuffer result = new StringBuffer();
+
+      /* at this point we have lookahead of "{:" -- swallow that */
+      advance(); advance();
+
+      /* save chars until we see ":}" */
+      while (!(next_char == ':' && next_char2 == '}'))
+	{
+	  /* if we have run off the end issue a message and break out of loop */
+	  if (next_char == EOF_CHAR)
+	    {
+	      emit_error("Specification file ends inside a code string");
+	      break;
+	    }
+
+	  /* otherwise record the char and move on */
+	  result.append(new Character((char)next_char));
+	  advance();
+	}
+
+      /* advance past the closer and build a return Symbol */
+      advance(); advance();
+      return new Symbol(sym.CODE_STRING, result.toString());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Process an identifier.  Identifiers begin with a letter, underscore,
+   *  or dollar sign, which is followed by zero or more letters, numbers,
+   *  underscores or dollar signs.  This routine returns a String suitable
+   *  for return by the scanner.
+   */
+  protected static Symbol do_id() throws java.io.IOException
+    {
+      StringBuffer result = new StringBuffer();
+      String       result_str;
+      Integer      keyword_num;
+      char         buffer[] = new char[1];
+
+      /* next_char holds first character of id */
+      buffer[0] = (char)next_char;
+      result.append(buffer,0,1);
+      advance();
+
+      /* collect up characters while they fit in id */ 
+      while(id_char(next_char))
+	{
+          buffer[0] = (char)next_char;
+	  result.append(buffer,0,1);
+	  advance();
+	}
+
+      /* extract a string and try to look it up as a keyword */
+      result_str = result.toString();
+      keyword_num = (Integer)keywords.get(result_str);
+
+      /* if we found something, return that keyword */
+      if (keyword_num != null)
+	return new Symbol(keyword_num.intValue());
+
+      /* otherwise build and return an id Symbol with an attached string */
+      return new Symbol(sym.ID, result_str);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return one Symbol.  This is the main external interface to the scanner.
+   *  It consumes sufficient characters to determine the next input Symbol
+   *  and returns it.  To help with debugging, this routine actually calls
+   *  real_next_token() which does the work.  If you need to debug the 
+   *  parser, this can be changed to call debug_next_token() which prints
+   *  a debugging message before returning the Symbol.
+   */
+  public static Symbol next_token() throws java.io.IOException
+    {
+      return real_next_token();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Debugging version of next_token().  This routine calls the real scanning
+   *  routine, prints a message on System.out indicating what the Symbol is,
+   *  then returns it.
+   */
+  public static Symbol debug_next_token() throws java.io.IOException
+    {
+      Symbol result = real_next_token();
+      System.out.println("# next_Symbol() => " + result.sym);
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The actual routine to return one Symbol.  This is normally called from
+   *  next_token(), but for debugging purposes can be called indirectly from
+   *  debug_next_token(). 
+   */
+  protected static Symbol real_next_token() throws java.io.IOException
+    {
+      int sym_num;
+
+      for (;;)
+	{
+	  /* look for white space */
+	  if (next_char == ' ' || next_char == '\t' || next_char == '\n' ||
+	      next_char == '\f' ||  next_char == '\r')
+	    {
+	      /* advance past it and try the next character */
+	      advance();
+	      continue;
+	    }
+
+	  /* look for a single character symbol */
+	  sym_num = find_single_char(next_char);
+	  if (sym_num != -1)
+	    {
+	      /* found one -- advance past it and return a Symbol for it */
+	      advance();
+	      return new Symbol(sym_num);
+	    }
+
+	  /* look for : or ::= */
+	  if (next_char == ':')
+	    {
+	      /* if we don't have a second ':' return COLON */
+	      if (next_char2 != ':') 
+		{
+		  advance();
+		  return new Symbol(sym.COLON);
+		}
+
+	      /* move forward and look for the '=' */
+	      advance();
+	      if (next_char2 == '=') 
+		{
+		  advance(); advance();
+		  return new Symbol(sym.COLON_COLON_EQUALS);
+		}
+	      else
+		{
+		  /* return just the colon (already consumed) */
+		  return new Symbol(sym.COLON);
+		}
+	    }
+
+	  /* find a "%prec" string and return it.  otherwise, a '%' was found,
+	     which has no right being in the specification otherwise */
+	  if (next_char == '%') {
+	    advance();
+	    if ((next_char == 'p') && (next_char2 == 'r') && (next_char3 == 'e') && 
+		(next_char4 == 'c')) {
+	      advance();
+	      advance();
+	      advance();
+	      advance();
+	      return new Symbol(sym.PERCENT_PREC);
+	    } else {
+	      emit_error("Found extraneous percent sign");
+	    }
+	  }
+
+	  /* look for a comment */
+	  if (next_char == '/' && (next_char2 == '*' || next_char2 == '/'))
+	    {
+	      /* swallow then continue the scan */
+	      swallow_comment();
+	      continue;
+	    }
+
+	  /* look for start of code string */
+	  if (next_char == '{' && next_char2 == ':')
+	    return do_code_string();
+
+	  /* look for an id or keyword */
+	  if (id_start_char(next_char)) return do_id();
+
+	  /* look for EOF */
+	  if (next_char == EOF_CHAR) return new Symbol(sym.EOF);
+
+	  /* if we get here, we have an unrecognized character */
+	  emit_warn("Unrecognized character '" + 
+	    new Character((char)next_char) + "'(" + next_char + 
+	    ") -- ignored");
+
+	  /* advance past it */
+	  advance();
+	}
+    }
+
+  /*-----------------------------------------------------------*/
+}
+
diff --git a/open-nars/java_cup/lr_item_core.java b/open-nars/java_cup/lr_item_core.java
new file mode 100644
index 0000000..c0fa656
--- /dev/null
+++ b/open-nars/java_cup/lr_item_core.java
@@ -0,0 +1,280 @@
+
+package java_cup;
+
+/** The "core" of an LR item.  This includes a production and the position
+ *  of a marker (the "dot") within the production.  Typically item cores 
+ *  are written using a production with an embedded "dot" to indicate their 
+ *  position.  For example: <pre>
+ *     A ::= B * C d E
+ *  </pre>
+ *  This represents a point in a parse where the parser is trying to match
+ *  the given production, and has succeeded in matching everything before the 
+ *  "dot" (and hence is expecting to see the symbols after the dot next).  See 
+ *  lalr_item, lalr_item_set, and lalr_start for full details on the meaning 
+ *  and use of items.
+ *
+ * @see     java_cup.lalr_item
+ * @see     java_cup.lalr_item_set
+ * @see     java_cup.lalr_state
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+*/
+
+public class lr_item_core {
+   
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor.
+   * @param prod production this item uses.
+   * @param pos  position of the "dot" within the item.
+   */
+  public lr_item_core(production prod, int pos) throws internal_error
+    {
+      symbol          after_dot = null;
+      production_part part;
+
+      if (prod == null)
+	throw new internal_error(
+	  "Attempt to create an lr_item_core with a null production");
+
+      _the_production = prod;
+
+      if (pos < 0 || pos > _the_production.rhs_length())
+	throw new internal_error(
+	  "Attempt to create an lr_item_core with a bad dot position");
+
+      _dot_pos = pos;
+
+      /* compute and cache hash code now */
+      _core_hash_cache = 13*_the_production.hashCode() + pos;
+
+      /* cache the symbol after the dot */
+      if (_dot_pos < _the_production.rhs_length())
+	{
+	  part = _the_production.rhs(_dot_pos);
+	  if (!part.is_action())
+	    _symbol_after_dot = ((symbol_part)part).the_symbol();
+	}
+    } 
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor for dot at start of right hand side. 
+   * @param prod production this item uses.
+   */
+  public lr_item_core(production prod) throws internal_error
+    {
+      this(prod,0);
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The production for the item. */
+  protected production _the_production;
+
+  /** The production for the item. */
+  public production the_production() {return _the_production;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The position of the "dot" -- this indicates the part of the production 
+   *  that the marker is before, so 0 indicates a dot at the beginning of 
+   *  the RHS.
+   */
+  protected int _dot_pos;
+
+  /** The position of the "dot" -- this indicates the part of the production 
+   *  that the marker is before, so 0 indicates a dot at the beginning of 
+   *  the RHS.
+   */
+  public int dot_pos() {return _dot_pos;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Cache of the hash code. */
+  protected int _core_hash_cache;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Cache of symbol after the dot. */
+  protected symbol _symbol_after_dot = null;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Is the dot at the end of the production? */
+  public boolean dot_at_end() 
+    {
+       return _dot_pos >= _the_production.rhs_length();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return the symbol after the dot.  If there is no symbol after the dot
+   *  we return null. */
+  public symbol symbol_after_dot()
+    {
+      /* use the cached symbol */
+      return _symbol_after_dot;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if we have a dot before a non terminal, and if so which one 
+   *  (return null or the non terminal). 
+   */
+  public non_terminal dot_before_nt()
+    {
+      symbol sym;
+
+      /* get the symbol after the dot */
+      sym = symbol_after_dot();
+
+      /* if it exists and is a non terminal, return it */
+      if (sym != null && sym.is_non_term())
+	return (non_terminal)sym;
+      else
+	return null;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a new lr_item_core that results from shifting the dot one 
+   *  position to the right. 
+   */
+  public lr_item_core shift_core() throws internal_error
+    {
+      if (dot_at_end()) 
+	throw new internal_error(
+	  "Attempt to shift past end of an lr_item_core");
+
+      return new lr_item_core(_the_production, _dot_pos+1);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison for the core only.  This is separate out because we 
+   *  need separate access in a super class. 
+   */
+  public boolean core_equals(lr_item_core other)
+    {
+      return other != null && 
+	     _the_production.equals(other._the_production) && 
+	     _dot_pos == other._dot_pos;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(lr_item_core other) {return core_equals(other);}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof lr_item_core))
+	return false;
+      else
+	return equals((lr_item_core)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Hash code for the core (separated so we keep non overridden version). */
+  public int core_hashCode()
+    {
+      return _core_hash_cache;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Hash code for the item. */
+  public int hashCode() 
+    {
+      return _core_hash_cache;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return the hash code that object would have provided for us so we have 
+   *  a (nearly) unique id for debugging.
+   */
+  protected int obj_hash()
+    {
+      return super.hashCode();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string (separated out from toString() so we can call it
+   *  from subclass that overrides toString()).
+   */
+  public String to_simple_string() throws internal_error
+    {
+      String result;
+      production_part part;
+
+      if (_the_production.lhs() != null && 
+	  _the_production.lhs().the_symbol() != null &&
+	  _the_production.lhs().the_symbol().name() != null)
+	result = _the_production.lhs().the_symbol().name();
+      else
+	result = "$$NULL$$";
+
+      result += " ::= ";
+
+      for (int i = 0; i<_the_production.rhs_length(); i++)
+	{
+	  /* do we need the dot before this one? */
+	  if (i == _dot_pos)
+	    result += "(*) ";
+	  
+	  /* print the name of the part */
+	  if (_the_production.rhs(i) == null)
+	    {
+	      result += "$$NULL$$ ";
+	    }
+	  else
+	    {
+	      part = _the_production.rhs(i);
+	      if (part == null)
+		result += "$$NULL$$ ";
+	      else if (part.is_action())
+		result += "{ACTION} ";
+	      else if (((symbol_part)part).the_symbol() != null &&
+                       ((symbol_part)part).the_symbol().name() != null)
+		result += ((symbol_part)part).the_symbol().name() + " ";
+	      else
+		result += "$$NULL$$ ";
+	    }
+	}
+
+      /* put the dot after if needed */
+      if (_dot_pos == _the_production.rhs_length())
+	result += "(*) ";
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string */
+  public String toString() 
+    {
+      /* can't throw here since super class doesn't, so we crash instead */
+      try {
+        return to_simple_string();
+      } catch(internal_error e) {
+	e.crash();
+	return null;
+      }
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+   
diff --git a/open-nars/java_cup/non_terminal.java b/open-nars/java_cup/non_terminal.java
new file mode 100644
index 0000000..9354a7f
--- /dev/null
+++ b/open-nars/java_cup/non_terminal.java
@@ -0,0 +1,301 @@
+package java_cup;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/** This class represents a non-terminal symbol in the grammar.  Each
+ *  non terminal has a textual name, an index, and a string which indicates
+ *  the type of object it will be implemented with at runtime (i.e. the class
+ *  of object that will be pushed on the parse stack to represent it). 
+ *
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+
+public class non_terminal extends symbol {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor.
+   * @param nm  the name of the non terminal.
+   * @param tp  the type string for the non terminal.
+   */
+  public non_terminal(String nm, String tp) 
+    {
+      /* super class does most of the work */
+      super(nm, tp);
+
+      /* add to set of all non terminals and check for duplicates */
+      Object conflict = _all.put(nm,this);
+      if (conflict != null)
+	// can't throw an exception here because these are used in static
+	// initializers, so we crash instead
+	// was: 
+	// throw new internal_error("Duplicate non-terminal ("+nm+") created");
+	(new internal_error("Duplicate non-terminal ("+nm+") created")).crash();
+
+      /* assign a unique index */
+      _index = next_index++;
+
+      /* add to by_index set */
+      _all_by_index.put(new Integer(_index), this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with default type. 
+   * @param nm  the name of the non terminal.
+   */
+  public non_terminal(String nm) 
+    {
+      this(nm, null);
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Table of all non-terminals -- elements are stored using name strings 
+   *  as the key 
+   */
+  protected static Hashtable _all = new Hashtable();
+
+  /** Access to all non-terminals. */
+  public static Enumeration all() {return _all.elements();}
+
+  /** lookup a non terminal by name string */ 
+  public static non_terminal find(String with_name)
+    {
+      if (with_name == null)
+        return null;
+      else 
+        return (non_terminal)_all.get(with_name);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Table of all non terminals indexed by their index number. */
+  protected static Hashtable _all_by_index = new Hashtable();
+
+  /** Lookup a non terminal by index. */
+  public static non_terminal find(int indx)
+    {
+      Integer the_indx = new Integer(indx);
+
+      return (non_terminal)_all_by_index.get(the_indx);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Total number of non-terminals. */
+  public static int number() {return _all.size();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Static counter to assign unique indexes. */
+  protected static int next_index = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Static counter for creating unique non-terminal names */
+  static protected int next_nt = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** special non-terminal for start symbol */
+  public static final non_terminal START_nt = new non_terminal("$START");
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** flag non-terminals created to embed action productions */
+  public boolean is_embedded_action = false; /* added 24-Mar-1998, CSA */
+
+  /*-----------------------------------------------------------*/
+  /*--- Static Methods ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+	 
+  /** Method for creating a new uniquely named hidden non-terminal using 
+   *  the given string as a base for the name (or "NT$" if null is passed).
+   * @param prefix base name to construct unique name from. 
+   */
+  static non_terminal create_new(String prefix) throws internal_error
+    {
+      if (prefix == null) prefix = "NT$";
+      return new non_terminal(prefix + next_nt++);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** static routine for creating a new uniquely named hidden non-terminal */
+  static non_terminal create_new() throws internal_error
+    { 
+      return create_new(null); 
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute nullability of all non-terminals. */
+  public static void compute_nullability() throws internal_error
+    {
+      boolean      change = true;
+      non_terminal nt;
+      Enumeration  e;
+      production   prod;
+
+      /* repeat this process until there is no change */
+      while (change)
+	{
+	  /* look for a new change */
+	  change = false;
+
+	  /* consider each non-terminal */
+	  for (e=all(); e.hasMoreElements(); )
+	    {
+	      nt = (non_terminal)e.nextElement();
+
+	      /* only look at things that aren't already marked nullable */
+	      if (!nt.nullable())
+		{
+		  if (nt.looks_nullable())
+		    {
+		      nt._nullable = true;
+		      change = true;
+		    }
+		}
+	    }
+	}
+      
+      /* do one last pass over the productions to finalize all of them */
+      for (e=production.all(); e.hasMoreElements(); )
+	{
+	  prod = (production)e.nextElement();
+	  prod.set_nullable(prod.check_nullable());
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute first sets for all non-terminals.  This assumes nullability has
+   *  already computed.
+   */
+  public static void compute_first_sets() throws internal_error
+    {
+      boolean      change = true;
+      Enumeration  n;
+      Enumeration  p;
+      non_terminal nt;
+      production   prod;
+      terminal_set prod_first;
+
+      /* repeat this process until we have no change */
+      while (change)
+	{
+	  /* look for a new change */
+	  change = false;
+
+	  /* consider each non-terminal */
+	  for (n = all(); n.hasMoreElements(); )
+	    {
+	      nt = (non_terminal)n.nextElement();
+
+	      /* consider every production of that non terminal */
+	      for (p = nt.productions(); p.hasMoreElements(); )
+		{
+		  prod = (production)p.nextElement();
+
+		  /* get the updated first of that production */
+		  prod_first = prod.check_first_set();
+
+		  /* if this going to add anything, add it */
+		  if (!prod_first.is_subset_of(nt._first_set))
+		    {
+		      change = true;
+		      nt._first_set.add(prod_first);
+		    }
+		}
+	    }
+	}
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Table of all productions with this non terminal on the LHS. */
+  protected Hashtable _productions = new Hashtable(11);
+
+  /** Access to productions with this non terminal on the LHS. */
+  public Enumeration productions() {return _productions.elements();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Total number of productions with this non terminal on the LHS. */
+  public int num_productions() {return _productions.size();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a production to our set of productions. */
+  public void add_production(production prod) throws internal_error
+    {
+      /* catch improper productions */
+      if (prod == null || prod.lhs() == null || prod.lhs().the_symbol() != this)
+	throw new internal_error(
+	  "Attempt to add invalid production to non terminal production table");
+
+      /* add it to the table, keyed with itself */
+      _productions.put(prod,prod);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Nullability of this non terminal. */
+  protected boolean _nullable;
+
+  /** Nullability of this non terminal. */
+  public boolean nullable() {return _nullable;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** First set for this non-terminal. */
+  protected terminal_set _first_set = new terminal_set();
+
+  /** First set for this non-terminal. */
+  public terminal_set first_set() {return _first_set;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Indicate that this symbol is a non-terminal. */
+  public boolean is_non_term() 
+    {
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Test to see if this non terminal currently looks nullable. */
+  protected boolean looks_nullable() throws internal_error
+    {
+      /* look and see if any of the productions now look nullable */
+      for (Enumeration e = productions(); e.hasMoreElements(); )
+	/* if the production can go to empty, we are nullable */
+	if (((production)e.nextElement()).check_nullable())
+	  return true;
+
+      /* none of the productions can go to empty, so we are not nullable */
+      return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** convert to string */
+  public String toString()
+    {
+      return super.toString() + "[" + index() + "]" + (nullable() ? "*" : "");
+    }
+
+  /*-----------------------------------------------------------*/
+}
diff --git a/open-nars/java_cup/nonassoc_action.java b/open-nars/java_cup/nonassoc_action.java
new file mode 100644
index 0000000..3882324
--- /dev/null
+++ b/open-nars/java_cup/nonassoc_action.java
@@ -0,0 +1,71 @@
+
+package java_cup;
+
+/** This class represents a shift/reduce nonassociative error within the 
+ *  parse table.  If action_table element is assign to type
+ *  nonassoc_action, it cannot be changed, and signifies that there 
+ *  is a conflict between shifting and reducing a production and a
+ *  terminal that shouldn't be next to each other.
+ *
+ * @version last updated: 7/2/96
+ * @author  Frank Flannery
+ */
+public class nonassoc_action extends parse_action {
+ 
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. 
+   */
+  public nonassoc_action() throws internal_error
+    {
+	/* don't need to set anything, since it signifies error */
+    }
+
+    /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Quick access to type of action. */
+  public int kind() {return NONASSOC;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality test. */
+  public boolean equals(parse_action other)
+    {
+      return other != null && other.kind() == NONASSOC;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality test. */
+  public boolean equals(Object other)
+    {
+      if (other instanceof parse_action)
+	return equals((parse_action)other);
+      else
+       return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute a hash code. */
+  public int hashCode()
+    {
+      /* all objects of this class hash together */
+      return 0xCafe321;
+    }
+
+
+
+  /** Convert to string. */
+  public String toString() 
+    {
+      return "NONASSOC";
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/parse_action.java b/open-nars/java_cup/parse_action.java
new file mode 100644
index 0000000..9228663
--- /dev/null
+++ b/open-nars/java_cup/parse_action.java
@@ -0,0 +1,92 @@
+
+package java_cup;
+
+/** This class serves as the base class for entries in a parse action table.  
+ *  Full entries will either be SHIFT(state_num), REDUCE(production), NONASSOC,
+ *  or ERROR. Objects of this base class will default to ERROR, while
+ *  the other three types will be represented by subclasses. 
+ * 
+ * @see     java_cup.reduce_action
+ * @see     java_cup.shift_action
+ * @version last updated: 7/2/96
+ * @author  Frank Flannery
+ */
+
+public class parse_action {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. */
+  public parse_action()
+    {
+      /* nothing to do in the base class */
+    }
+
+ 
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constant for action type -- error action. */
+  public static final int ERROR = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constant for action type -- shift action. */
+  public static final int SHIFT = 1;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constants for action type -- reduce action. */
+  public static final int REDUCE = 2;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constants for action type -- reduce action. */
+  public static final int NONASSOC = 3;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+	 
+  /** Quick access to the type -- base class defaults to error. */
+  public int kind() {return ERROR;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality test. */
+  public boolean equals(parse_action other)
+    {
+      /* we match all error actions */
+      return other != null && other.kind() == ERROR;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality test. */
+  public boolean equals(Object other)
+    {
+      if (other instanceof parse_action)
+	return equals((parse_action)other);
+      else
+	return false;
+    }
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute a hash code. */
+  public int hashCode()
+    {
+      /* all objects of this class hash together */
+      return 0xCafe123;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to string. */
+  public String toString() {return "ERROR";}
+
+  /*-----------------------------------------------------------*/
+}
+    
diff --git a/open-nars/java_cup/parse_action_row.java b/open-nars/java_cup/parse_action_row.java
new file mode 100644
index 0000000..817b8c5
--- /dev/null
+++ b/open-nars/java_cup/parse_action_row.java
@@ -0,0 +1,106 @@
+
+package java_cup;
+
+/** This class represents one row (corresponding to one machine state) of the 
+ *  parse action table.
+ */
+public class parse_action_row {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+	       
+  /** Simple constructor.  Note: this should not be used until the number of
+   *  terminals in the grammar has been established.
+   */
+  public parse_action_row()
+    {
+      /* make sure the size is set */
+      if (_size <= 0 )  _size = terminal.number();
+
+      /* allocate the array */
+      under_term = new parse_action[size()];
+
+      /* set each element to an error action */
+      for (int i=0; i<_size; i++)
+	under_term[i] = new parse_action();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Number of columns (terminals) in every row. */
+  protected static int _size = 0;
+
+  /** Number of columns (terminals) in every row. */
+  public static int size() {return _size;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Table of reduction counts (reused by compute_default()). */
+  protected static int reduction_count[] = null;
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Actual action entries for the row. */
+  public parse_action under_term[];
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Default (reduce) action for this row.  -1 will represent default 
+   *  of error. 
+   */
+  public int default_reduce;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+	
+  /** Compute the default (reduce) action for this row and store it in 
+   *  default_reduce.  In the case of non-zero default we will have the 
+   *  effect of replacing all errors by that reduction.  This may cause 
+   *  us to do erroneous reduces, but will never cause us to shift past 
+   *  the point of the error and never cause an incorrect parse.  -1 will 
+   *  be used to encode the fact that no reduction can be used as a 
+   *  default (in which case error will be used).
+   */
+  public void compute_default()
+    {
+      int i, prod, max_prod, max_red;
+
+      /* if we haven't allocated the count table, do so now */
+      if (reduction_count == null) 
+	reduction_count = new int[production.number()];
+
+      /* clear the reduction count table and maximums */
+      for (i = 0; i < production.number(); i++)
+	reduction_count[i] = 0;
+      max_prod = -1;
+      max_red = 0;
+     
+      /* walk down the row and look at the reduces */
+      for (i = 0; i < size(); i++)
+	if (under_term[i].kind() == parse_action.REDUCE)
+	  {
+	    /* count the reduce in the proper production slot and keep the 
+	       max up to date */
+	    prod = ((reduce_action)under_term[i]).reduce_with().index();
+	    reduction_count[prod]++;
+	    if (reduction_count[prod] > max_red)
+	      {
+		max_red = reduction_count[prod];
+		max_prod = prod;
+	      }
+	  }
+
+       /* record the max as the default (or -1 for not found) */
+       default_reduce = max_prod;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
diff --git a/open-nars/java_cup/parse_action_table.java b/open-nars/java_cup/parse_action_table.java
new file mode 100644
index 0000000..1e0edb2
--- /dev/null
+++ b/open-nars/java_cup/parse_action_table.java
@@ -0,0 +1,143 @@
+
+package java_cup;
+
+import java.util.Enumeration;
+
+/** This class represents the complete "action" table of the parser. 
+ *  It has one row for each state in the parse machine, and a column for
+ *  each terminal symbol.  Each entry in the table represents a shift,
+ *  reduce, or an error.  
+ *
+ * @see     java_cup.parse_action
+ * @see     java_cup.parse_action_row
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class parse_action_table {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor.  All terminals, non-terminals, and productions must 
+   *  already have been entered, and the viable prefix recognizer should
+   *  have been constructed before this is called.
+   */
+  public parse_action_table()
+    {
+      /* determine how many states we are working with */
+      _num_states = lalr_state.number();
+
+      /* allocate the array and fill it in with empty rows */
+      under_state = new parse_action_row[_num_states];
+      for (int i=0; i<_num_states; i++)
+	under_state[i] = new parse_action_row();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** How many rows/states are in the machine/table. */
+  protected int _num_states;
+
+  /** How many rows/states are in the machine/table. */
+  public int num_states() {return _num_states;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Actual array of rows, one per state. */
+  public  parse_action_row[] under_state;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Check the table to ensure that all productions have been reduced. 
+   *  Issue a warning message (to System.err) for each production that
+   *  is never reduced.
+   */
+  public void check_reductions()
+    throws internal_error
+    {
+      parse_action act;
+      production   prod;
+
+      /* tabulate reductions -- look at every table entry */
+      for (int row = 0; row < num_states(); row++)
+	{
+	  for (int col = 0; col < under_state[row].size(); col++)
+	    {
+	      /* look at the action entry to see if its a reduce */
+	      act = under_state[row].under_term[col];
+	      if (act != null && act.kind() == parse_action.REDUCE)
+		{
+		  /* tell production that we used it */
+		  ((reduce_action)act).reduce_with().note_reduction_use();
+		}
+	    }
+	}
+
+      /* now go across every production and make sure we hit it */
+      for (Enumeration p = production.all(); p.hasMoreElements(); )
+	{
+	  prod = (production)p.nextElement();
+
+	  /* if we didn't hit it give a warning */
+	  if (prod.num_reductions() == 0)
+	    {
+	      /* count it *
+	      emit.not_reduced++;
+
+	      /* give a warning if they haven't been turned off */
+	      if (!emit.nowarn)
+		{
+		  System.err.println("*** Production \"" + 
+				  prod.to_simple_string() + "\" never reduced");
+		  lexer.warning_count++;
+		}
+	    }
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      String result;
+      int cnt;
+
+      result = "-------- ACTION_TABLE --------\n";
+      for (int row = 0; row < num_states(); row++)
+	{
+	  result += "From state #" + row + "\n";
+	  cnt = 0;
+	  for (int col = 0; col < under_state[row].size(); col++)
+	    {
+	      /* if the action is not an error print it */ 
+	      if (under_state[row].under_term[col].kind() != parse_action.ERROR)
+		{
+		  result += " [term " + col + ":" + under_state[row].under_term[col] + "]";
+
+		  /* end the line after the 2nd one */
+		  cnt++;
+		  if (cnt == 2)
+		    {
+		      result += "\n";
+		      cnt = 0;
+		    }
+		}
+	    }
+          /* finish the line if we haven't just done that */
+	  if (cnt != 0) result += "\n";
+	}
+      result += "------------------------------";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
diff --git a/open-nars/java_cup/parse_reduce_row.java b/open-nars/java_cup/parse_reduce_row.java
new file mode 100644
index 0000000..57d978e
--- /dev/null
+++ b/open-nars/java_cup/parse_reduce_row.java
@@ -0,0 +1,41 @@
+
+package java_cup;
+
+/** This class represents one row (corresponding to one machine state) of the 
+ *  reduce-goto parse table. 
+ */
+public class parse_reduce_row {
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. Note: this should not be used until the number
+   *  of terminals in the grammar has been established.
+   */
+  public parse_reduce_row()
+    {
+      /* make sure the size is set */
+      if (_size <= 0 )  _size = non_terminal.number();
+
+      /* allocate the array */
+      under_non_term = new lalr_state[size()];
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Number of columns (non terminals) in every row. */
+  protected static int _size = 0;
+
+  /** Number of columns (non terminals) in every row. */
+  public static int size() {return _size;}
+   
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Actual entries for the row. */
+  public lalr_state under_non_term[];
+}
+
diff --git a/open-nars/java_cup/parse_reduce_table.java b/open-nars/java_cup/parse_reduce_table.java
new file mode 100644
index 0000000..9ac1b11
--- /dev/null
+++ b/open-nars/java_cup/parse_reduce_table.java
@@ -0,0 +1,99 @@
+
+package java_cup;
+
+import java.util.Enumeration;
+
+/** This class represents the complete "reduce-goto" table of the parser.
+ *  It has one row for each state in the parse machines, and a column for
+ *  each terminal symbol.  Each entry contains a state number to shift to
+ *  as the last step of a reduce. 
+ *
+ * @see     java_cup.parse_reduce_row
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class parse_reduce_table {
+ 
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor.  Note: all terminals, non-terminals, and productions 
+   *  must already have been entered, and the viable prefix recognizer should
+   *  have been constructed before this is called.
+   */
+  public parse_reduce_table()
+    {
+      /* determine how many states we are working with */
+      _num_states = lalr_state.number();
+
+      /* allocate the array and fill it in with empty rows */
+      under_state = new parse_reduce_row[_num_states];
+      for (int i=0; i<_num_states; i++)
+	under_state[i] = new parse_reduce_row();
+    }
+
+   
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** How many rows/states in the machine/table. */
+  protected int _num_states;
+
+  /** How many rows/states in the machine/table. */
+  public int num_states() {return _num_states;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Actual array of rows, one per state */
+  public  parse_reduce_row[] under_state;
+ 
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      String result;
+      lalr_state goto_st;
+      int cnt;
+
+      result = "-------- REDUCE_TABLE --------\n";
+      for (int row = 0; row < num_states(); row++)
+	{
+	  result += "From state #" + row + "\n";
+	  cnt = 0;
+	  for (int col = 0; col < under_state[row].size(); col++)
+	    {
+	      /* pull out the table entry */
+	      goto_st = under_state[row].under_non_term[col];
+
+	      /* if it has action in it, print it */
+	      if (goto_st != null)
+		{
+		  result += " [non term " + col + "->"; 
+		  result += "state " + goto_st.index() + "]";
+
+		  /* end the line after the 3rd one */
+		  cnt++;
+		  if (cnt == 3)
+		    {
+		      result += "\n";
+		      cnt = 0;
+		    }
+		}
+	    }
+          /* finish the line if we haven't just done that */
+	  if (cnt != 0) result += "\n";
+	}
+      result += "-----------------------------";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
diff --git a/open-nars/java_cup/parser.cup b/open-nars/java_cup/parser.cup
new file mode 100644
index 0000000..8af0d05
--- /dev/null
+++ b/open-nars/java_cup/parser.cup
@@ -0,0 +1,863 @@
+
+/*================================================================*/ 
+/* 
+  JavaCup Specification for the JavaCup Specification Language
+  by Scott Hudson, GVU Center, Georgia Tech, August 1995
+  and Frank Flannery, Department of Computer Science, Princeton Univ,
+  July 1996
+  Bug Fixes: C. Scott Ananian, Dept of Electrical Engineering, Princeton
+  University, October 1996. [later Massachusetts Institute of Technology]
+
+
+  This JavaCup specification is used to implement JavaCup itself.
+  It specifies the parser for the JavaCup specification language.
+  (It also serves as a reasonable example of what a typical JavaCup
+  spec looks like).
+
+  The specification has the following parts:
+    Package and import declarations
+      These serve the same purpose as in a normal Java source file
+      (and will appear in the generated code for the parser). In this 
+      case we are part of the java_cup package and we import both the
+      java_cup runtime system and Hashtable from the standard Java
+      utilities package.
+
+    Action code
+      This section provides code that is included with the class encapsulating
+      the various pieces of user code embedded in the grammar (i.e., the
+      semantic actions).  This provides a series of helper routines and
+      data structures that the semantic actions use.
+
+    Parser code    
+      This section provides code included in the parser class itself.  In
+      this case we override the default error reporting routines.
+
+    Init with and scan with 
+      These sections provide small bits of code that initialize, then 
+      indicate how to invoke the scanner.
+
+    Symbols and grammar
+      These sections declare all the terminal and non terminal symbols 
+      and the types of objects that they will be represented by at runtime,
+      then indicate the start symbol of the grammar (), and finally provide
+      the grammar itself (with embedded actions).
+
+    Operation of the parser
+      The parser acts primarily by accumulating data structures representing
+      various parts of the specification.  Various small parts (e.g., single
+      code strings) are stored as static variables of the emit class and
+      in a few cases as variables declared in the action code section.  
+      Terminals, non terminals, and productions, are maintained as collection
+      accessible via static methods of those classes.  In addition, two 
+      symbol tables are kept:  
+	symbols   maintains the name to object mapping for all symbols
+	non_terms maintains a separate mapping containing only the non terms
+
+      Several intermediate working structures are also declared in the action
+      code section.  These include: rhs_parts, rhs_pos, and lhs_nt which
+      build up parts of the current production while it is being parsed.
+	
+  Author(s)
+    Scott Hudson, GVU Center, Georgia Tech.
+    Frank Flannery, Department of Computer Science, Princeton Univ.
+    C. Scott Ananian, Department of Electrical Engineering, Princeton Univ.
+
+  Revisions
+    v0.9a   First released version                     [SEH] 8/29/95
+    v0.9b   Updated for beta language (throws clauses) [SEH] 11/25/95
+    v0.10a  Made many improvements/changes. now offers:
+              return value
+              left/right positions and propagations
+              cleaner label references
+              precedence and associativity for terminals
+              contextual precedence for productions
+              [FF] 7/3/96
+    v0.10b  Fixed %prec directive so it works like it's supposed to.
+              [CSA] 10/10/96
+    v0.10g   Added support for array types on symbols.
+              [CSA] 03/23/98
+    v0.10i  Broaden set of IDs allowed in multipart_id and label_id so
+            that only java reserved words (and not CUP reserved words like
+            'parser' and 'start') are prohibited.  Allow reordering of
+	    action code, parser code, init code, and scan with sections,
+	    and made closing semicolon optional for these sections.
+	    Added 'nonterminal' as a terminal symbol, finally fixing a
+	    spelling mistake that's been around since the beginning.
+	    For backwards compatibility, you can still misspell the
+	    word if you like.
+*/
+/*================================================================*/ 
+
+package java_cup;
+import java_cup.runtime.*;
+import java.util.Hashtable;
+
+/*----------------------------------------------------------------*/ 
+
+action code {:
+  /** helper routine to clone a new production part adding a given label */
+  protected production_part add_lab(production_part part, String lab)
+    throws internal_error
+    {
+      /* if there is no label, or this is an action, just return the original */
+      if (lab == null || part.is_action()) return part;
+
+      /* otherwise build a new one with the given label attached */
+      return new symbol_part(((symbol_part)part).the_symbol(),lab);
+    }
+
+  /** max size of right hand side we will support */
+  protected final int MAX_RHS = 200;
+
+  /** array for accumulating right hand side parts */
+  protected production_part[] rhs_parts = new production_part[MAX_RHS];
+
+  /** where we are currently in building a right hand side */
+  protected int rhs_pos = 0;
+
+  /** start a new right hand side */
+  protected void new_rhs() {rhs_pos = 0; }
+
+  /** add a new right hand side part */
+  protected void add_rhs_part(production_part part) throws java.lang.Exception
+    {
+      if (rhs_pos >= MAX_RHS)
+	throw new Exception("Internal Error: Productions limited to " + 
+			     MAX_RHS + " symbols and actions"); 
+
+      rhs_parts[rhs_pos] = part;
+      rhs_pos++;
+    }
+
+  /** string to build up multiple part names */
+  protected String multipart_name = new String();
+
+  /** append a new name segment to the accumulated multipart name */
+  protected void append_multipart(String name)
+    {
+      String dot = "";
+
+      /* if we aren't just starting out, put on a dot */
+      if (multipart_name.length() != 0)  dot = ".";
+
+      multipart_name = multipart_name.concat(dot + name);
+    }
+
+  /** table of declared symbols -- contains production parts indexed by name */
+  protected Hashtable symbols = new Hashtable();
+
+  /** table of just non terminals -- contains non_terminals indexed by name */
+  protected Hashtable non_terms = new Hashtable();
+
+  /** declared start non_terminal */
+  protected non_terminal start_nt = null;
+
+  /** left hand side non terminal of the current production */
+  protected non_terminal lhs_nt;
+
+  /** Current precedence number */
+  int _cur_prec = 0;
+
+  /** Current precedence side */
+  int _cur_side = assoc.no_prec;
+
+  /** update the precedences we are declaring */
+  protected void update_precedence(int p) {
+    _cur_side = p;
+    _cur_prec++;
+  }
+  /** add relevant data to terminals */ 
+  protected void add_precedence(String term) {
+    if (term == null) {
+      System.err.println("Unable to add precedence to nonexistent terminal");
+    } else {
+      symbol_part sp = (symbol_part)symbols.get(term);
+      if (sp == null) {
+	System.err.println("Could find terminal " + term + " while declaring precedence");
+      } else {
+	java_cup.symbol sym = sp.the_symbol();
+	if (sym instanceof terminal) 
+	  ((terminal)sym).set_precedence(_cur_side, _cur_prec);
+	else System.err.println("Precedence declaration: Can't find terminal " + term);
+      }
+    }
+  }
+:};
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+parser code {:
+
+  /* override error routines */
+
+  public void report_fatal_error(
+    String   message,
+    Object   info)
+    {
+      done_parsing();
+      lexer.emit_error(message);
+      System.err.println("Can't recover from previous error(s), giving up.");
+      System.exit(1);
+    }
+
+    public void report_error(String message, Object info)
+    {
+      lexer.emit_error(message);
+    }
+:};
+
+/*----------------------------------------------------------------*/ 
+
+init with {: lexer.init(); :};
+scan with {: return lexer.next_token(); :};
+
+/*----------------------------------------------------------------*/ 
+
+terminal
+  PACKAGE, IMPORT, CODE, ACTION, PARSER, TERMINAL, NON, INIT, SCAN, WITH, 
+  START, SEMI, COMMA, STAR, DOT, COLON, COLON_COLON_EQUALS, BAR, PRECEDENCE,
+  LEFT, RIGHT, NONASSOC, PERCENT_PREC, LBRACK, RBRACK, NONTERMINAL;
+
+terminal String  ID, CODE_STRING;
+
+non terminal
+  spec, package_spec, import_list, action_code_part, 
+  code_parts, code_part, opt_semi, non_terminal,
+  parser_code_part, symbol_list, start_spec, production_list, 
+  multipart_id, import_spec, import_id, init_code, scan_code, symbol, 
+  type_id, term_name_list, non_term_name_list, production, prod_part_list, 
+  prod_part, new_term_id, new_non_term_id, rhs_list, rhs, empty,
+  precedence_list, preced, terminal_list, precedence_l, declares_term, 
+  declares_non_term;
+
+non terminal String  nt_id, symbol_id, label_id, opt_label, terminal_id,
+                     term_id, robust_id;
+
+/*----------------------------------------------------------------*/ 
+
+start with spec;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+spec ::= 
+	{:
+          /* declare "error" as a terminal */
+          symbols.put("error", new symbol_part(terminal.error));
+
+          /* declare start non terminal */
+          non_terms.put("$START", non_terminal.START_nt);
+	:}
+	package_spec
+	import_list
+	code_parts
+	symbol_list
+	precedence_list
+	start_spec
+	production_list
+	|
+	/* error recovery assuming something went wrong before symbols 
+	   and we have TERMINAL or NON TERMINAL to sync on.  if we get
+	   an error after that, we recover inside symbol_list or 
+	   production_list 
+	*/
+	error 
+	symbol_list
+	precedence_list
+	start_spec
+	production_list
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+package_spec ::= 
+	PACKAGE
+	multipart_id
+	{:
+	  /* save the package name */
+	  emit.package_name = multipart_name;
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	|
+	empty
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+import_list ::=
+	import_list
+	import_spec
+	|
+	empty
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+import_spec ::=
+	IMPORT 
+	import_id 
+	{: 
+	  /* save this import on the imports list */
+	  emit.import_list.push(multipart_name);
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+// allow any order; all parts are optional. [CSA, 23-Jul-1999]
+// (we check in the part action to make sure we don't have 2 of any part)
+code_part ::=
+	action_code_part | parser_code_part | init_code | scan_code ;
+code_parts ::= 
+	| code_parts code_part;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+action_code_part ::= 
+	ACTION CODE CODE_STRING:user_code opt_semi
+	{:
+	  if (emit.action_code!=null)
+	    lexer.emit_error("Redundant action code (skipping)");
+	  else /* save the user included code string */
+	    emit.action_code = user_code;
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+parser_code_part ::= 
+	PARSER CODE CODE_STRING:user_code opt_semi
+	{:
+	  if (emit.parser_code!=null)
+	    lexer.emit_error("Redundant parser code (skipping)");
+	  else /* save the user included code string */
+	    emit.parser_code = user_code;
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+init_code ::= 
+	INIT WITH CODE_STRING:user_code opt_semi
+	{: 
+	  if (emit.init_code!=null)
+	    lexer.emit_error("Redundant init code (skipping)");
+	  else /* save the user code */
+	    emit.init_code = user_code;
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+scan_code ::=
+	SCAN WITH CODE_STRING:user_code opt_semi
+	{: 
+	  if (emit.scan_code!=null)
+	    lexer.emit_error("Redundant scan code (skipping)");
+	  else /* save the user code */
+	    emit.scan_code = user_code;
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+symbol_list ::= symbol_list symbol | symbol;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+symbol ::= 
+	TERMINAL
+	type_id	
+	declares_term
+	|
+	TERMINAL
+	declares_term
+	|
+	non_terminal
+	type_id
+	declares_non_term
+	|
+	non_terminal
+	declares_non_term
+	|
+	/* error recovery productions -- sync on semicolon */
+
+	TERMINAL
+	error 
+	{:
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	|
+	non_terminal
+	error 
+	{:
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+declares_term ::=
+	term_name_list
+	{: 
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	;
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+declares_non_term ::=
+	non_term_name_list
+	{: 
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	:}
+	SEMI
+	;
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+term_name_list ::= term_name_list COMMA new_term_id | new_term_id;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+non_term_name_list ::=
+	non_term_name_list
+	COMMA
+	new_non_term_id
+	|
+	new_non_term_id
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+
+precedence_list ::= precedence_l | empty; 
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+precedence_l ::= precedence_l preced | preced;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+preced ::= 
+	PRECEDENCE LEFT 
+	{:
+	  update_precedence(assoc.left);
+	:}	
+        terminal_list SEMI
+	|
+	PRECEDENCE RIGHT 
+	{:
+	  update_precedence(assoc.right);
+	:}	
+        terminal_list SEMI
+	|
+	PRECEDENCE NONASSOC 
+	{:
+	  update_precedence(assoc.nonassoc);
+	:}	
+        terminal_list SEMI
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+terminal_list ::= terminal_list COMMA terminal_id
+	|
+	terminal_id
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+terminal_id ::= term_id:sym
+	{:	
+	  add_precedence(sym);
+	  RESULT = sym;
+	:};
+	  
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+term_id ::= symbol_id:sym
+        {:
+	  /* check that the symbol_id is a terminal */
+	  if (symbols.get(sym) == null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error("Terminal \"" + sym + 
+			   "\" has not been declared");
+	    }
+          RESULT = sym;
+         :};
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+start_spec ::= 
+	START WITH nt_id:start_name 
+	{: 
+	  /* verify that the name has been declared as a non terminal */
+	  non_terminal nt = (non_terminal)non_terms.get(start_name);
+	  if (nt == null)
+	    {
+	      lexer.emit_error( "Start non terminal \"" + start_name + 
+	  		         "\" has not been declared");
+	    }
+          else
+	    {
+	      /* remember the non-terminal for later */
+	      start_nt = nt;
+
+	      /* build a special start production */
+	      new_rhs();
+	      add_rhs_part(add_lab(new symbol_part(start_nt), "start_val"));
+	      add_rhs_part(new symbol_part(terminal.EOF));
+	      add_rhs_part(new action_part("RESULT = start_val;"));
+	      emit.start_production = 
+		     new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+	      new_rhs();
+	    }
+	:}
+	SEMI
+	|
+	empty
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+production_list ::= production_list production | production;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+production ::=
+	nt_id:lhs_id
+	{:
+	  /* lookup the lhs nt */
+	  lhs_nt = (non_terminal)non_terms.get(lhs_id);
+
+          /* if it wasn't declared, emit a message */
+	  if (lhs_nt == null)
+	    {
+	      if (lexer.error_count == 0)
+	        lexer.emit_error("LHS non terminal \"" + lhs_id + 
+			       "\" has not been declared");
+	    }
+
+	  /* reset the rhs accumulation */
+	  new_rhs();
+	:}
+	COLON_COLON_EQUALS
+	{: :}
+	rhs_list
+	SEMI
+	|
+	error
+	{: lexer.emit_error("Syntax Error"); :}
+	SEMI
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+rhs_list ::= rhs_list BAR rhs | rhs;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+rhs ::= 
+	prod_part_list PERCENT_PREC term_id:term_name 
+	{:
+	  java_cup.symbol sym = null;
+	  if (lhs_nt != null) 
+	    {
+	      /* Find the precedence symbol */
+	      if (term_name == null) {
+		System.err.println("No terminal for contextual precedence");
+		sym = null;
+	      } else {
+		sym = ((symbol_part)symbols.get(term_name)).the_symbol();
+	      }
+	      /* build the production */
+	      production p;
+	      if ((sym!=null) && (sym instanceof terminal)) {
+		p = new production(lhs_nt, rhs_parts, rhs_pos,
+				   ((terminal)sym).precedence_num(),
+				   ((terminal)sym).precedence_side());
+		((symbol_part)symbols.get(term_name)).the_symbol().note_use();
+	      } else {
+		System.err.println("Invalid terminal " + term_name + 
+				   " for contextual precedence assignment");
+		p = new production(lhs_nt, rhs_parts, rhs_pos);
+	      }
+
+	      /* if we have no start non-terminal declared and this is 
+		 the first production, make its lhs nt the start_nt 
+		 and build a special start production for it. */
+              if (start_nt == null)
+		{
+		  start_nt = lhs_nt;
+
+	          /* build a special start production */
+	          new_rhs();
+	          add_rhs_part(add_lab(new symbol_part(start_nt),"start_val"));
+	          add_rhs_part(new symbol_part(terminal.EOF));
+		  add_rhs_part(new action_part("RESULT = start_val;"));
+		  if ((sym!=null) && (sym instanceof terminal)) {
+		    emit.start_production = 
+		      new production(non_terminal.START_nt, rhs_parts, 
+				     rhs_pos, ((terminal)sym).precedence_num(),
+				     ((terminal)sym).precedence_side());
+		  } else {
+		    emit.start_production = 
+		      new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+		  }
+	          new_rhs();
+		}
+	    }
+
+	  /* reset the rhs accumulation in any case */
+	  new_rhs();
+	:}
+	|
+	prod_part_list 
+	{: 
+	  if (lhs_nt != null) 
+	    {
+	      /* build the production */
+	      production p = new production(lhs_nt, rhs_parts, rhs_pos);
+
+	      /* if we have no start non-terminal declared and this is 
+		 the first production, make its lhs nt the start_nt 
+		 and build a special start production for it. */
+              if (start_nt == null)
+		{
+		  start_nt = lhs_nt;
+
+	          /* build a special start production */
+	          new_rhs();
+	          add_rhs_part(add_lab(new symbol_part(start_nt),"start_val"));
+	          add_rhs_part(new symbol_part(terminal.EOF));
+		  add_rhs_part(new action_part("RESULT = start_val;"));
+	          emit.start_production = 
+		     new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+
+	          new_rhs();
+		}
+	    }
+	  
+	  /* reset the rhs accumulation in any case */
+	  new_rhs();
+	:} 
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+prod_part_list ::= prod_part_list prod_part | empty;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+prod_part ::=
+	symbol_id:symid opt_label:labid
+	{: 
+	  /* try to look up the id */
+	  production_part symb = (production_part)symbols.get(symid);
+
+	  /* if that fails, symbol is undeclared */
+	  if (symb == null)
+	    {
+	      if (lexer.error_count == 0)
+	        lexer.emit_error("java_cup.runtime.Symbol \"" + symid + 
+			       "\" has not been declared");
+	    }
+	  else
+	    {
+	      /* add a labeled production part */
+	      add_rhs_part(add_lab(symb, labid));
+	    }
+	:}
+	|
+	CODE_STRING:code_str
+	{: 
+	  /* add a new production part */
+	  add_rhs_part(new action_part(code_str));
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+opt_label ::=
+	COLON label_id:labid
+	{: RESULT = labid; :}
+	|
+	empty
+	{: RESULT = null; :}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+multipart_id ::=
+	multipart_id DOT robust_id:another_id
+	{: append_multipart(another_id); :}
+	|
+	robust_id:an_id
+	{: append_multipart(an_id); :}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+import_id ::= 
+	multipart_id DOT STAR
+	{: append_multipart("*"); :}
+	|
+	multipart_id
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+type_id ::= multipart_id
+	| type_id LBRACK RBRACK
+	{: multipart_name = multipart_name.concat("[]"); :}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+new_term_id ::= 
+	ID:term_id 
+	{: 
+	  /* see if this terminal has been declared before */
+	  if (symbols.get(term_id) != null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error("java_cup.runtime.Symbol \"" + term_id + 
+			   "\" has already been declared");
+	    }
+	  else
+	    {
+	      /* if no type declared, declare one */
+	      if (multipart_name.equals("")) {
+		append_multipart("Object");
+	      }
+	      /* build a production_part and put it in the table */ 
+	      symbols.put(term_id, 
+	        new symbol_part(new terminal(term_id, multipart_name)));
+	    }
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+new_non_term_id ::=
+	ID:non_term_id
+	{: 
+	  /* see if this non terminal has been declared before */
+	  if (symbols.get(non_term_id) != null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error( "java_cup.runtime.Symbol \"" + non_term_id + 
+			                      "\" has already been declared");
+	    }
+	  else
+	    {
+	      if (multipart_name.equals("")) {
+		append_multipart("Object");
+	      }
+	      /* build the non terminal object */
+              non_terminal this_nt = 
+		new non_terminal(non_term_id, multipart_name);
+
+	      /* put it in the non_terms table */
+	      non_terms.put(non_term_id, this_nt);
+
+	      /* build a production_part and put it in the symbols table */ 
+	      symbols.put(non_term_id, new symbol_part(this_nt));
+	    }
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+nt_id ::=
+	ID:the_id
+	{: RESULT = the_id; :}
+	| error
+	{:
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+symbol_id ::=
+	ID:the_id
+	{: RESULT = the_id; :}
+	| error
+	{:
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+label_id ::= 
+	robust_id:the_id
+	{: RESULT = the_id; :}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+robust_id ::= /* all ids that aren't reserved words in Java */
+	ID:the_id	{: RESULT = the_id; :}
+	/* package is reserved. */
+	/* import is reserved. */
+	| CODE		{: RESULT = "code"; :}
+	| ACTION	{: RESULT = "action"; :}
+	| PARSER	{: RESULT = "parser"; :}
+	| TERMINAL	{: RESULT = "terminal"; :}
+	| NON		{: RESULT = "non"; :}
+	| NONTERMINAL   {: RESULT = "nonterminal"; :}
+	| INIT		{: RESULT = "init"; :}
+	| SCAN		{: RESULT = "scan"; :}
+	| WITH		{: RESULT = "with"; :}
+	| START		{: RESULT = "start"; :}
+	| PRECEDENCE	{: RESULT = "precedence"; :}
+	| LEFT		{: RESULT = "left"; :}
+	| RIGHT		{: RESULT = "right"; :}
+	| NONASSOC	{: RESULT = "nonassoc"; :}
+	| error
+	{:
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	:}
+	;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+non_terminal ::= NON TERMINAL | NONTERMINAL;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+opt_semi ::= /* nothing */
+	| SEMI;
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ 
+
+empty ::= /* nothing */;
+
+/*----------------------------------------------------------------*/ 
+
+
+
+
+
+
+
+
+
diff --git a/open-nars/java_cup/parser.java b/open-nars/java_cup/parser.java
new file mode 100644
index 0000000..163968e
--- /dev/null
+++ b/open-nars/java_cup/parser.java
@@ -0,0 +1,1849 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Sun Jul 25 13:35:26 EDT 1999
+//----------------------------------------------------
+
+package java_cup;
+
+import java_cup.runtime.*;
+import java.util.Hashtable;
+
+/** CUP v0.10k generated parser.
+  * @version Sun Jul 25 13:35:26 EDT 1999
+  */
+public class parser extends java_cup.runtime.lr_parser {
+
+  /** Default constructor. */
+  public parser() {super();}
+
+  /** Constructor which sets the default scanner. */
+  public parser(java_cup.runtime.Scanner s) {super(s);}
+
+  /** Production table. */
+  protected static final short _production_table[][] = 
+    unpackFromStrings(new String[] {
+    "\000\153\000\002\002\004\000\002\055\002\000\002\003" +
+    "\012\000\002\003\007\000\002\056\002\000\002\004\006" +
+    "\000\002\004\003\000\002\005\004\000\002\005\003\000" +
+    "\002\057\002\000\002\020\006\000\002\010\003\000\002" +
+    "\010\003\000\002\010\003\000\002\010\003\000\002\007" +
+    "\002\000\002\007\004\000\002\006\006\000\002\013\006" +
+    "\000\002\022\006\000\002\023\006\000\002\014\004\000" +
+    "\002\014\003\000\002\024\005\000\002\024\004\000\002" +
+    "\024\005\000\002\024\004\000\002\060\002\000\002\024" +
+    "\006\000\002\061\002\000\002\024\006\000\002\062\002" +
+    "\000\002\044\005\000\002\063\002\000\002\045\005\000" +
+    "\002\026\005\000\002\026\003\000\002\027\005\000\002" +
+    "\027\003\000\002\040\003\000\002\040\003\000\002\043" +
+    "\004\000\002\043\003\000\002\064\002\000\002\041\007" +
+    "\000\002\065\002\000\002\041\007\000\002\066\002\000" +
+    "\002\041\007\000\002\042\005\000\002\042\003\000\002" +
+    "\052\003\000\002\053\003\000\002\067\002\000\002\015" +
+    "\007\000\002\015\003\000\002\016\004\000\002\016\003" +
+    "\000\002\070\002\000\002\071\002\000\002\030\010\000" +
+    "\002\072\002\000\002\030\005\000\002\035\005\000\002" +
+    "\035\003\000\002\036\005\000\002\036\003\000\002\031" +
+    "\004\000\002\031\003\000\002\032\004\000\002\032\003" +
+    "\000\002\051\004\000\002\051\003\000\002\017\005\000" +
+    "\002\017\003\000\002\021\005\000\002\021\003\000\002" +
+    "\025\003\000\002\025\005\000\002\033\003\000\002\034" +
+    "\003\000\002\046\003\000\002\046\003\000\002\047\003" +
+    "\000\002\047\003\000\002\050\003\000\002\054\003\000" +
+    "\002\054\003\000\002\054\003\000\002\054\003\000\002" +
+    "\054\003\000\002\054\003\000\002\054\003\000\002\054" +
+    "\003\000\002\054\003\000\002\054\003\000\002\054\003" +
+    "\000\002\054\003\000\002\054\003\000\002\054\003\000" +
+    "\002\054\003\000\002\054\003\000\002\012\004\000\002" +
+    "\012\003\000\002\011\002\000\002\011\003\000\002\037" +
+    "\002" });
+
+  /** Access to production table. */
+  public short[][] production_table() {return _production_table;}
+
+  /** Parse-action table. */
+  protected static final short[][] _action_table = 
+    unpackFromStrings(new String[] {
+    "\000\247\000\026\003\006\004\000\005\000\007\000\010" +
+    "\000\011\000\012\000\013\000\014\000\035\000\001\002" +
+    "\000\004\002\251\001\002\000\024\004\200\005\uff97\007" +
+    "\uff97\010\uff97\011\uff97\012\uff97\013\uff97\014\uff97\035\uff97" +
+    "\001\002\000\010\011\007\012\012\035\014\001\002\000" +
+    "\042\003\163\006\026\007\027\010\040\011\036\012\022" +
+    "\013\042\014\030\015\017\016\015\026\033\027\023\030" +
+    "\035\031\041\035\025\036\160\001\002\000\020\003\uffeb" +
+    "\011\uffeb\012\uffeb\016\uffeb\026\uffeb\035\uffeb\036\uffeb\001" +
+    "\002\000\020\003\uff97\011\007\012\012\016\uff97\026\065" +
+    "\035\014\036\uff97\001\002\000\004\011\061\001\002\000" +
+    "\042\003\034\006\026\007\027\010\040\011\036\012\022" +
+    "\013\042\014\030\015\017\016\015\026\033\027\023\030" +
+    "\035\031\041\035\025\036\016\001\002\000\042\003\uff9a" +
+    "\006\uff9a\007\uff9a\010\uff9a\011\uff9a\012\uff9a\013\uff9a\014" +
+    "\uff9a\015\uff9a\016\uff9a\026\uff9a\027\uff9a\030\uff9a\031\uff9a" +
+    "\035\uff9a\036\uff9a\001\002\000\022\003\uffa1\017\uffa1\022" +
+    "\uffa1\025\uffa1\032\uffa1\033\uffa1\036\uffa1\037\uffa1\001\002" +
+    "\000\014\017\uffb1\020\uffb1\022\uffab\033\uffab\036\uffab\001" +
+    "\002\000\022\003\uffa2\017\uffa2\022\uffa2\025\uffa2\032\uffa2" +
+    "\033\uffa2\036\uffa2\037\uffa2\001\002\000\006\017\uffe0\020" +
+    "\055\001\002\000\010\022\051\033\uffb4\036\uffb4\001\002" +
+    "\000\022\003\uffa6\017\uffa6\022\uffa6\025\uffa6\032\uffa6\033" +
+    "\uffa6\036\uffa6\037\uffa6\001\002\000\022\003\uff9f\017\uff9f" +
+    "\022\uff9f\025\uff9f\032\uff9f\033\uff9f\036\uff9f\037\uff9f\001" +
+    "\002\000\006\033\047\036\045\001\002\000\022\003\uffa5" +
+    "\017\uffa5\022\uffa5\025\uffa5\032\uffa5\033\uffa5\036\uffa5\037" +
+    "\uffa5\001\002\000\022\003\uffaa\017\uffaa\022\uffaa\025\uffaa" +
+    "\032\uffaa\033\uffaa\036\uffaa\037\uffaa\001\002\000\022\003" +
+    "\uffa9\017\uffa9\022\uffa9\025\uffa9\032\uffa9\033\uffa9\036\uffa9" +
+    "\037\uffa9\001\002\000\022\003\uffa3\017\uffa3\022\uffa3\025" +
+    "\uffa3\032\uffa3\033\uffa3\036\uffa3\037\uffa3\001\002\000\012" +
+    "\017\uffb7\022\uffb7\033\uffb7\036\uffb7\001\002\000\020\003" +
+    "\uffe7\011\uffe7\012\uffe7\016\uffe7\026\uffe7\035\uffe7\036\uffe7" +
+    "\001\002\000\022\003\uffa0\017\uffa0\022\uffa0\025\uffa0\032" +
+    "\uffa0\033\uffa0\036\uffa0\037\uffa0\001\002\000\012\017\uffe4" +
+    "\022\uff9c\033\uff9c\036\uff9c\001\002\000\022\003\uff9e\017" +
+    "\uff9e\022\uff9e\025\uff9e\032\uff9e\033\uff9e\036\uff9e\037\uff9e" +
+    "\001\002\000\022\003\uffa7\017\uffa7\022\uffa7\025\uffa7\032" +
+    "\uffa7\033\uffa7\036\uffa7\037\uffa7\001\002\000\006\017\uffdb" +
+    "\020\uffdb\001\002\000\022\003\uffa8\017\uffa8\022\uffa8\025" +
+    "\uffa8\032\uffa8\033\uffa8\036\uffa8\037\uffa8\001\002\000\022" +
+    "\003\uff9d\017\uff9d\022\uff9d\025\uff9d\032\uff9d\033\uff9d\036" +
+    "\uff9d\037\uff9d\001\002\000\022\003\uffa4\017\uffa4\022\uffa4" +
+    "\025\uffa4\032\uffa4\033\uffa4\036\uffa4\037\uffa4\001\002\000" +
+    "\004\017\044\001\002\000\020\003\uffe3\011\uffe3\012\uffe3" +
+    "\016\uffe3\026\uffe3\035\uffe3\036\uffe3\001\002\000\006\017" +
+    "\uffb1\020\uffb1\001\002\000\020\003\uffe8\011\uffe8\012\uffe8" +
+    "\016\uffe8\026\uffe8\035\uffe8\036\uffe8\001\002\000\004\034" +
+    "\050\001\002\000\006\033\uffb3\036\uffb3\001\002\000\042" +
+    "\003\054\006\026\007\027\010\040\011\036\012\022\013" +
+    "\042\014\030\015\017\016\015\026\033\027\023\030\035" +
+    "\031\041\035\025\036\053\001\002\000\012\017\uffb8\022" +
+    "\uffb8\033\uffb8\036\uffb8\001\002\000\022\003\uffab\017\uffab" +
+    "\022\uffab\025\uffab\032\uffab\033\uffab\036\uffab\037\uffab\001" +
+    "\002\000\022\003\uff9c\017\uff9c\022\uff9c\025\uff9c\032\uff9c" +
+    "\033\uff9c\036\uff9c\037\uff9c\001\002\000\004\036\045\001" +
+    "\002\000\004\017\057\001\002\000\020\003\uffdf\011\uffdf" +
+    "\012\uffdf\016\uffdf\026\uffdf\035\uffdf\036\uffdf\001\002\000" +
+    "\006\017\uffdc\020\uffdc\001\002\000\042\003\uff9b\006\uff9b" +
+    "\007\uff9b\010\uff9b\011\uff9b\012\uff9b\013\uff9b\014\uff9b\015" +
+    "\uff9b\016\uff9b\026\uff9b\027\uff9b\030\uff9b\031\uff9b\035\uff9b" +
+    "\036\uff9b\001\002\000\010\003\uff97\016\116\036\uff97\001" +
+    "\002\000\012\003\uffda\016\uffda\026\065\036\uffda\001\002" +
+    "\000\010\003\uffd9\016\uffd9\036\uffd9\001\002\000\010\027" +
+    "\071\030\072\031\070\001\002\000\020\003\uffec\011\uffec" +
+    "\012\uffec\016\uffec\026\uffec\035\uffec\036\uffec\001\002\000" +
+    "\012\003\uffd7\016\uffd7\026\uffd7\036\uffd7\001\002\000\006" +
+    "\003\uffd2\036\uffd2\001\002\000\006\003\uffd6\036\uffd6\001" +
+    "\002\000\006\003\uffd4\036\uffd4\001\002\000\006\003\077" +
+    "\036\074\001\002\000\022\003\uffae\017\uffae\020\uffae\023" +
+    "\uffae\025\uffae\032\uffae\036\uffae\037\uffae\001\002\000\010" +
+    "\017\uffcd\020\uffcd\025\uffcd\001\002\000\006\017\uffce\020" +
+    "\uffce\001\002\000\022\003\uffad\017\uffad\020\uffad\023\uffad" +
+    "\025\uffad\032\uffad\036\uffad\037\uffad\001\002\000\006\017" +
+    "\102\020\103\001\002\000\006\017\uffcf\020\uffcf\001\002" +
+    "\000\012\003\uffd3\016\uffd3\026\uffd3\036\uffd3\001\002\000" +
+    "\006\003\077\036\074\001\002\000\006\017\uffd0\020\uffd0" +
+    "\001\002\000\006\003\077\036\074\001\002\000\006\017" +
+    "\107\020\103\001\002\000\012\003\uffd5\016\uffd5\026\uffd5" +
+    "\036\uffd5\001\002\000\006\003\077\036\074\001\002\000" +
+    "\006\017\112\020\103\001\002\000\012\003\uffd1\016\uffd1" +
+    "\026\uffd1\036\uffd1\001\002\000\012\003\uffd8\016\uffd8\026" +
+    "\uffd8\036\uffd8\001\002\000\006\003\uffca\036\uffca\001\002" +
+    "\000\006\003\126\036\120\001\002\000\004\015\117\001" +
+    "\002\000\006\003\122\036\120\001\002\000\006\017\uffb0" +
+    "\024\uffb0\001\002\000\004\017\uffcc\001\002\000\004\017" +
+    "\uffaf\001\002\000\004\017\124\001\002\000\006\003\uffcb" +
+    "\036\uffcb\001\002\000\004\024\uffc7\001\002\000\006\017" +
+    "\uffc4\024\uffaf\001\002\000\010\002\ufffe\003\126\036\120" +
+    "\001\002\000\010\002\uffc8\003\uffc8\036\uffc8\001\002\000" +
+    "\010\002\uffc9\003\uffc9\036\uffc9\001\002\000\004\017\133" +
+    "\001\002\000\010\002\uffc3\003\uffc3\036\uffc3\001\002\000" +
+    "\004\024\135\001\002\000\016\003\uffc6\017\uffc6\025\uffc6" +
+    "\032\uffc6\036\uffc6\037\uffc6\001\002\000\016\003\uff97\017" +
+    "\uff97\025\uff97\032\uff97\036\uff97\037\uff97\001\002\000\016" +
+    "\003\uffbd\017\uffbd\025\uffbd\032\uffbd\036\uffbd\037\uffbd\001" +
+    "\002\000\016\003\077\017\uffbf\025\uffbf\032\147\036\074" +
+    "\037\146\001\002\000\006\017\uffc1\025\uffc1\001\002\000" +
+    "\006\017\143\025\144\001\002\000\010\002\uffc5\003\uffc5" +
+    "\036\uffc5\001\002\000\016\003\uff97\017\uff97\025\uff97\032" +
+    "\uff97\036\uff97\037\uff97\001\002\000\006\017\uffc2\025\uffc2" +
+    "\001\002\000\016\003\uffbb\017\uffbb\025\uffbb\032\uffbb\036" +
+    "\uffbb\037\uffbb\001\002\000\006\003\077\036\074\001\002" +
+    "\000\020\003\uff97\017\uff97\023\154\025\uff97\032\uff97\036" +
+    "\uff97\037\uff97\001\002\000\016\003\uffbe\017\uffbe\025\uffbe" +
+    "\032\uffbe\036\uffbe\037\uffbe\001\002\000\016\003\uffb9\017" +
+    "\uffb9\025\uffb9\032\uffb9\036\uffb9\037\uffb9\001\002\000\016" +
+    "\003\uffbc\017\uffbc\025\uffbc\032\uffbc\036\uffbc\037\uffbc\001" +
+    "\002\000\042\003\054\006\026\007\027\010\040\011\036" +
+    "\012\022\013\042\014\030\015\017\016\015\026\033\027" +
+    "\023\030\035\031\041\035\025\036\053\001\002\000\016" +
+    "\003\uffba\017\uffba\025\uffba\032\uffba\036\uffba\037\uffba\001" +
+    "\002\000\016\003\uffac\017\uffac\025\uffac\032\uffac\036\uffac" +
+    "\037\uffac\001\002\000\006\017\uffc0\025\uffc0\001\002\000" +
+    "\014\017\uffb2\020\uffb2\022\uffab\033\uffab\036\uffab\001\002" +
+    "\000\006\033\047\036\170\001\002\000\006\017\uffdd\020" +
+    "\uffdd\001\002\000\012\017\uffe6\022\uff9c\033\uff9c\036\uff9c" +
+    "\001\002\000\020\003\uffe9\011\uffe9\012\uffe9\016\uffe9\026" +
+    "\uffe9\035\uffe9\036\uffe9\001\002\000\006\017\uffe2\020\167" +
+    "\001\002\000\004\017\172\001\002\000\004\036\170\001" +
+    "\002\000\006\017\uffb2\020\uffb2\001\002\000\006\017\uffde" +
+    "\020\uffde\001\002\000\020\003\uffe1\011\uffe1\012\uffe1\016" +
+    "\uffe1\026\uffe1\035\uffe1\036\uffe1\001\002\000\004\017\174" +
+    "\001\002\000\020\003\uffe5\011\uffe5\012\uffe5\016\uffe5\026" +
+    "\uffe5\035\uffe5\036\uffe5\001\002\000\020\003\uffea\011\uffea" +
+    "\012\uffea\016\uffea\026\uffea\035\uffea\036\uffea\001\002\000" +
+    "\022\005\ufffb\007\ufffb\010\ufffb\011\ufffb\012\ufffb\013\ufffb" +
+    "\014\ufffb\035\ufffb\001\002\000\022\005\uff97\007\uff97\010" +
+    "\uff97\011\uff97\012\uff97\013\uff97\014\uff97\035\uff97\001\002" +
+    "\000\042\003\054\006\026\007\027\010\040\011\036\012" +
+    "\022\013\042\014\030\015\017\016\015\026\033\027\023" +
+    "\030\035\031\041\035\025\036\053\001\002\000\006\017" +
+    "\ufffd\022\051\001\002\000\004\017\203\001\002\000\022" +
+    "\005\ufffc\007\ufffc\010\ufffc\011\ufffc\012\ufffc\013\ufffc\014" +
+    "\ufffc\035\ufffc\001\002\000\022\005\210\007\ufff2\010\ufff2" +
+    "\011\ufff2\012\ufff2\013\ufff2\014\ufff2\035\ufff2\001\002\000" +
+    "\022\005\ufff9\007\ufff9\010\ufff9\011\ufff9\012\ufff9\013\ufff9" +
+    "\014\ufff9\035\ufff9\001\002\000\020\007\223\010\224\011" +
+    "\007\012\012\013\227\014\225\035\014\001\002\000\022" +
+    "\005\ufffa\007\ufffa\010\ufffa\011\ufffa\012\ufffa\013\ufffa\014" +
+    "\ufffa\035\ufffa\001\002\000\042\003\054\006\026\007\027" +
+    "\010\040\011\036\012\022\013\042\014\030\015\017\016" +
+    "\015\026\033\027\023\030\035\031\041\035\025\036\053" +
+    "\001\002\000\006\017\uffb5\022\215\001\002\000\004\017" +
+    "\ufff8\001\002\000\004\017\214\001\002\000\022\005\ufff7" +
+    "\007\ufff7\010\ufff7\011\ufff7\012\ufff7\013\ufff7\014\ufff7\035" +
+    "\ufff7\001\002\000\044\003\054\006\026\007\027\010\040" +
+    "\011\036\012\022\013\042\014\030\015\017\016\015\021" +
+    "\216\026\033\027\023\030\035\031\041\035\025\036\053" +
+    "\001\002\000\004\017\uffb6\001\002\000\020\007\ufff3\010" +
+    "\ufff3\011\ufff3\012\ufff3\013\ufff3\014\ufff3\035\ufff3\001\002" +
+    "\000\020\007\ufff5\010\ufff5\011\ufff5\012\ufff5\013\ufff5\014" +
+    "\ufff5\035\ufff5\001\002\000\020\007\ufff1\010\ufff1\011\ufff1" +
+    "\012\ufff1\013\ufff1\014\ufff1\035\ufff1\001\002\000\020\007" +
+    "\ufff4\010\ufff4\011\ufff4\012\ufff4\013\ufff4\014\ufff4\035\ufff4" +
+    "\001\002\000\004\006\246\001\002\000\004\006\243\001" +
+    "\002\000\004\015\240\001\002\000\020\007\ufff6\010\ufff6" +
+    "\011\ufff6\012\ufff6\013\ufff6\014\ufff6\035\ufff6\001\002\000" +
+    "\004\015\234\001\002\000\020\003\uff97\011\007\012\012" +
+    "\016\uff97\026\065\035\014\036\uff97\001\002\000\010\003" +
+    "\uff97\016\116\036\uff97\001\002\000\006\003\126\036\120" +
+    "\001\002\000\010\002\uffff\003\126\036\120\001\002\000" +
+    "\004\037\235\001\002\000\022\007\uff99\010\uff99\011\uff99" +
+    "\012\uff99\013\uff99\014\uff99\017\236\035\uff99\001\002\000" +
+    "\020\007\uff98\010\uff98\011\uff98\012\uff98\013\uff98\014\uff98" +
+    "\035\uff98\001\002\000\020\007\uffee\010\uffee\011\uffee\012" +
+    "\uffee\013\uffee\014\uffee\035\uffee\001\002\000\004\037\241" +
+    "\001\002\000\022\007\uff99\010\uff99\011\uff99\012\uff99\013" +
+    "\uff99\014\uff99\017\236\035\uff99\001\002\000\020\007\uffed" +
+    "\010\uffed\011\uffed\012\uffed\013\uffed\014\uffed\035\uffed\001" +
+    "\002\000\004\037\244\001\002\000\022\007\uff99\010\uff99" +
+    "\011\uff99\012\uff99\013\uff99\014\uff99\017\236\035\uff99\001" +
+    "\002\000\020\007\uffef\010\uffef\011\uffef\012\uffef\013\uffef" +
+    "\014\uffef\035\uffef\001\002\000\004\037\247\001\002\000" +
+    "\022\007\uff99\010\uff99\011\uff99\012\uff99\013\uff99\014\uff99" +
+    "\017\236\035\uff99\001\002\000\020\007\ufff0\010\ufff0\011" +
+    "\ufff0\012\ufff0\013\ufff0\014\ufff0\035\ufff0\001\002\000\004" +
+    "\002\001\001\002" });
+
+  /** Access to parse-action table. */
+  public short[][] action_table() {return _action_table;}
+
+  /** <code>reduce_goto</code> table. */
+  protected static final short[][] _reduce_table = 
+    unpackFromStrings(new String[] {
+    "\000\247\000\006\003\003\055\004\001\001\000\002\001" +
+    "\001\000\006\004\176\037\175\001\001\000\010\012\012" +
+    "\014\010\024\007\001\001\000\016\017\020\025\160\026" +
+    "\164\033\161\044\163\054\030\001\001\000\002\001\001" +
+    "\000\016\012\012\024\065\037\063\040\061\041\066\043" +
+    "\062\001\001\000\002\001\001\000\016\017\020\025\023" +
+    "\027\017\034\036\045\031\054\030\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\004\063\055\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\010\027\017\034\036\045\045" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\004\061\042\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\004\054\051\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\004" +
+    "\034\057\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\006\015\114\037\113" +
+    "\001\001\000\004\041\112\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\004" +
+    "\066\107\001\001\000\004\064\104\001\001\000\004\065" +
+    "\072\001\001\000\012\042\077\047\074\052\100\053\075" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\010\047\074\052\103\053\075\001" +
+    "\001\000\002\001\001\000\012\042\105\047\074\052\100" +
+    "\053\075\001\001\000\002\001\001\000\002\001\001\000" +
+    "\012\042\110\047\074\052\100\053\075\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\010\016\126\030\127\046\124\001\001\000\002" +
+    "\001\001\000\004\046\120\001\001\000\002\001\001\000" +
+    "\004\067\122\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\004\070\133\001\001\000\004\072" +
+    "\131\001\001\000\006\030\130\046\124\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\004\071\135\001\001\000\012" +
+    "\031\137\035\141\036\140\037\136\001\001\000\002\001" +
+    "\001\000\006\032\150\047\147\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\010\031\137\036" +
+    "\144\037\136\001\001\000\002\001\001\000\002\001\001" +
+    "\000\006\047\074\053\156\001\001\000\006\037\151\051" +
+    "\152\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\006\050\154\054\155\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\010\026\164\033\161\044\174\001\001\000\002\001" +
+    "\001\000\004\060\172\001\001\000\002\001\001\000\004" +
+    "\062\165\001\001\000\002\001\001\000\004\033\170\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\006\005\203\037\204\001\001\000\006" +
+    "\017\200\054\030\001\001\000\004\056\201\001\001\000" +
+    "\002\001\001\000\002\001\001\000\006\007\205\020\206" +
+    "\001\001\000\002\001\001\000\022\006\225\010\220\012" +
+    "\012\013\217\014\227\022\221\023\216\024\007\001\001" +
+    "\000\002\001\001\000\010\017\210\021\211\054\030\001" +
+    "\001\000\002\001\001\000\004\057\212\001\001\000\002" +
+    "\001\001\000\002\001\001\000\004\054\051\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\016\012\012\024\065\037\063\040\230\041\066\043" +
+    "\062\001\001\000\006\015\231\037\113\001\001\000\010" +
+    "\016\232\030\127\046\124\001\001\000\006\030\130\046" +
+    "\124\001\001\000\002\001\001\000\004\011\236\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\004\011\241\001\001\000\002\001\001\000\002\001\001" +
+    "\000\004\011\244\001\001\000\002\001\001\000\002\001" +
+    "\001\000\004\011\247\001\001\000\002\001\001\000\002" +
+    "\001\001" });
+
+  /** Access to <code>reduce_goto</code> table. */
+  public short[][] reduce_table() {return _reduce_table;}
+
+  /** Instance of action encapsulation class. */
+  protected CUP$parser$actions action_obj;
+
+  /** Action encapsulation object initializer. */
+  protected void init_actions()
+    {
+      action_obj = new CUP$parser$actions(this);
+    }
+
+  /** Invoke a user supplied parse action. */
+  public java_cup.runtime.Symbol do_action(
+    int                        act_num,
+    java_cup.runtime.lr_parser parser,
+    java.util.Stack            stack,
+    int                        top)
+    throws java.lang.Exception
+  {
+    /* call code in generated class */
+    return action_obj.CUP$parser$do_action(act_num, parser, stack, top);
+  }
+
+  /** Indicates start state. */
+  public int start_state() {return 0;}
+  /** Indicates start production. */
+  public int start_production() {return 0;}
+
+  /** <code>EOF</code> Symbol index. */
+  public int EOF_sym() {return 0;}
+
+  /** <code>error</code> Symbol index. */
+  public int error_sym() {return 1;}
+
+
+  /** User initialization code. */
+  public void user_init() throws java.lang.Exception
+    {
+ lexer.init(); 
+    }
+
+  /** Scan to get the next Symbol. */
+  public java_cup.runtime.Symbol scan()
+    throws java.lang.Exception
+    {
+ return lexer.next_token(); 
+    }
+
+
+
+  /* override error routines */
+
+  public void report_fatal_error(
+    String   message,
+    Object   info)
+    {
+      done_parsing();
+      lexer.emit_error(message);
+      System.err.println("Can't recover from previous error(s), giving up.");
+      System.exit(1);
+    }
+
+    public void report_error(String message, Object info)
+    {
+      lexer.emit_error(message);
+    }
+
+}
+
+/** Cup generated class to encapsulate user supplied action code.*/
+class CUP$parser$actions {
+
+
+  /** helper routine to clone a new production part adding a given label */
+  protected production_part add_lab(production_part part, String lab)
+    throws internal_error
+    {
+      /* if there is no label, or this is an action, just return the original */
+      if (lab == null || part.is_action()) return part;
+
+      /* otherwise build a new one with the given label attached */
+      return new symbol_part(((symbol_part)part).the_symbol(),lab);
+    }
+
+  /** max size of right hand side we will support */
+  protected final int MAX_RHS = 200;
+
+  /** array for accumulating right hand side parts */
+  protected production_part[] rhs_parts = new production_part[MAX_RHS];
+
+  /** where we are currently in building a right hand side */
+  protected int rhs_pos = 0;
+
+  /** start a new right hand side */
+  protected void new_rhs() {rhs_pos = 0; }
+
+  /** add a new right hand side part */
+  protected void add_rhs_part(production_part part) throws java.lang.Exception
+    {
+      if (rhs_pos >= MAX_RHS)
+	throw new Exception("Internal Error: Productions limited to " + 
+			     MAX_RHS + " symbols and actions"); 
+
+      rhs_parts[rhs_pos] = part;
+      rhs_pos++;
+    }
+
+  /** string to build up multiple part names */
+  protected String multipart_name = new String();
+
+  /** append a new name segment to the accumulated multipart name */
+  protected void append_multipart(String name)
+    {
+      String dot = "";
+
+      /* if we aren't just starting out, put on a dot */
+      if (multipart_name.length() != 0)  dot = ".";
+
+      multipart_name = multipart_name.concat(dot + name);
+    }
+
+  /** table of declared symbols -- contains production parts indexed by name */
+  protected Hashtable symbols = new Hashtable();
+
+  /** table of just non terminals -- contains non_terminals indexed by name */
+  protected Hashtable non_terms = new Hashtable();
+
+  /** declared start non_terminal */
+  protected non_terminal start_nt = null;
+
+  /** left hand side non terminal of the current production */
+  protected non_terminal lhs_nt;
+
+  /** Current precedence number */
+  int _cur_prec = 0;
+
+  /** Current precedence side */
+  int _cur_side = assoc.no_prec;
+
+  /** update the precedences we are declaring */
+  protected void update_precedence(int p) {
+    _cur_side = p;
+    _cur_prec++;
+  }
+  /** add relevant data to terminals */ 
+  protected void add_precedence(String term) {
+    if (term == null) {
+      System.err.println("Unable to add precedence to nonexistent terminal");
+    } else {
+      symbol_part sp = (symbol_part)symbols.get(term);
+      if (sp == null) {
+	System.err.println("Could find terminal " + term + " while declaring precedence");
+      } else {
+	java_cup.symbol sym = sp.the_symbol();
+	if (sym instanceof terminal) 
+	  ((terminal)sym).set_precedence(_cur_side, _cur_prec);
+	else System.err.println("Precedence declaration: Can't find terminal " + term);
+      }
+    }
+  }
+
+  private final parser parser;
+
+  /** Constructor */
+  CUP$parser$actions(parser parser) {
+    this.parser = parser;
+  }
+
+  /** Method with the actual generated action code. */
+  public final java_cup.runtime.Symbol CUP$parser$do_action(
+    int                        CUP$parser$act_num,
+    java_cup.runtime.lr_parser CUP$parser$parser,
+    java.util.Stack            CUP$parser$stack,
+    int                        CUP$parser$top)
+    throws java.lang.Exception
+    {
+      /* Symbol object for return from actions */
+      java_cup.runtime.Symbol CUP$parser$result;
+
+      /* select the action based on the action number */
+      switch (CUP$parser$act_num)
+        {
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 106: // empty ::= 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(29/*empty*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 105: // opt_semi ::= SEMI 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*opt_semi*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 104: // opt_semi ::= 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(7/*opt_semi*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 103: // non_terminal ::= NONTERMINAL 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*non_terminal*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 102: // non_terminal ::= NON TERMINAL 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(8/*non_terminal*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 101: // robust_id ::= error 
+            {
+              String RESULT = null;
+		
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 100: // robust_id ::= NONASSOC 
+            {
+              String RESULT = null;
+		 RESULT = "nonassoc"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 99: // robust_id ::= RIGHT 
+            {
+              String RESULT = null;
+		 RESULT = "right"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 98: // robust_id ::= LEFT 
+            {
+              String RESULT = null;
+		 RESULT = "left"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 97: // robust_id ::= PRECEDENCE 
+            {
+              String RESULT = null;
+		 RESULT = "precedence"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 96: // robust_id ::= START 
+            {
+              String RESULT = null;
+		 RESULT = "start"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 95: // robust_id ::= WITH 
+            {
+              String RESULT = null;
+		 RESULT = "with"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 94: // robust_id ::= SCAN 
+            {
+              String RESULT = null;
+		 RESULT = "scan"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 93: // robust_id ::= INIT 
+            {
+              String RESULT = null;
+		 RESULT = "init"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 92: // robust_id ::= NONTERMINAL 
+            {
+              String RESULT = null;
+		 RESULT = "nonterminal"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 91: // robust_id ::= NON 
+            {
+              String RESULT = null;
+		 RESULT = "non"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 90: // robust_id ::= TERMINAL 
+            {
+              String RESULT = null;
+		 RESULT = "terminal"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 89: // robust_id ::= PARSER 
+            {
+              String RESULT = null;
+		 RESULT = "parser"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 88: // robust_id ::= ACTION 
+            {
+              String RESULT = null;
+		 RESULT = "action"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 87: // robust_id ::= CODE 
+            {
+              String RESULT = null;
+		 RESULT = "code"; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 86: // robust_id ::= ID 
+            {
+              String RESULT = null;
+		int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = the_id; 
+              CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 85: // label_id ::= robust_id 
+            {
+              String RESULT = null;
+		int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = the_id; 
+              CUP$parser$result = new java_cup.runtime.Symbol(38/*label_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 84: // symbol_id ::= error 
+            {
+              String RESULT = null;
+		
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(37/*symbol_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 83: // symbol_id ::= ID 
+            {
+              String RESULT = null;
+		int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = the_id; 
+              CUP$parser$result = new java_cup.runtime.Symbol(37/*symbol_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 82: // nt_id ::= error 
+            {
+              String RESULT = null;
+		
+		lexer.emit_error("Illegal use of reserved word");
+		RESULT="ILLEGAL";
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(36/*nt_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 81: // nt_id ::= ID 
+            {
+              String RESULT = null;
+		int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = the_id; 
+              CUP$parser$result = new java_cup.runtime.Symbol(36/*nt_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 80: // new_non_term_id ::= ID 
+            {
+              Object RESULT = null;
+		int non_term_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int non_term_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String non_term_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 
+	  /* see if this non terminal has been declared before */
+	  if (symbols.get(non_term_id) != null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error( "java_cup.runtime.Symbol \"" + non_term_id + 
+			                      "\" has already been declared");
+	    }
+	  else
+	    {
+	      if (multipart_name.equals("")) {
+		append_multipart("Object");
+	      }
+	      /* build the non terminal object */
+              non_terminal this_nt = 
+		new non_terminal(non_term_id, multipart_name);
+
+	      /* put it in the non_terms table */
+	      non_terms.put(non_term_id, this_nt);
+
+	      /* build a production_part and put it in the symbols table */ 
+	      symbols.put(non_term_id, new symbol_part(this_nt));
+	    }
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(26/*new_non_term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 79: // new_term_id ::= ID 
+            {
+              Object RESULT = null;
+		int term_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int term_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String term_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 
+	  /* see if this terminal has been declared before */
+	  if (symbols.get(term_id) != null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error("java_cup.runtime.Symbol \"" + term_id + 
+			   "\" has already been declared");
+	    }
+	  else
+	    {
+	      /* if no type declared, declare one */
+	      if (multipart_name.equals("")) {
+		append_multipart("Object");
+	      }
+	      /* build a production_part and put it in the table */ 
+	      symbols.put(term_id, 
+	        new symbol_part(new terminal(term_id, multipart_name)));
+	    }
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(25/*new_term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 78: // type_id ::= type_id LBRACK RBRACK 
+            {
+              Object RESULT = null;
+		 multipart_name = multipart_name.concat("[]"); 
+              CUP$parser$result = new java_cup.runtime.Symbol(19/*type_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 77: // type_id ::= multipart_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(19/*type_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 76: // import_id ::= multipart_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(15/*import_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 75: // import_id ::= multipart_id DOT STAR 
+            {
+              Object RESULT = null;
+		 append_multipart("*"); 
+              CUP$parser$result = new java_cup.runtime.Symbol(15/*import_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 74: // multipart_id ::= robust_id 
+            {
+              Object RESULT = null;
+		int an_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int an_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String an_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 append_multipart(an_id); 
+              CUP$parser$result = new java_cup.runtime.Symbol(13/*multipart_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 73: // multipart_id ::= multipart_id DOT robust_id 
+            {
+              Object RESULT = null;
+		int another_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int another_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String another_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 append_multipart(another_id); 
+              CUP$parser$result = new java_cup.runtime.Symbol(13/*multipart_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 72: // opt_label ::= empty 
+            {
+              String RESULT = null;
+		 RESULT = null; 
+              CUP$parser$result = new java_cup.runtime.Symbol(39/*opt_label*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 71: // opt_label ::= COLON label_id 
+            {
+              String RESULT = null;
+		int labidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int labidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String labid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = labid; 
+              CUP$parser$result = new java_cup.runtime.Symbol(39/*opt_label*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 70: // prod_part ::= CODE_STRING 
+            {
+              Object RESULT = null;
+		int code_strleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int code_strright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String code_str = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 
+	  /* add a new production part */
+	  add_rhs_part(new action_part(code_str));
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(24/*prod_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 69: // prod_part ::= symbol_id opt_label 
+            {
+              Object RESULT = null;
+		int symidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int symidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		String symid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		int labidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int labidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String labid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 
+	  /* try to look up the id */
+	  production_part symb = (production_part)symbols.get(symid);
+
+	  /* if that fails, symbol is undeclared */
+	  if (symb == null)
+	    {
+	      if (lexer.error_count == 0)
+	        lexer.emit_error("java_cup.runtime.Symbol \"" + symid + 
+			       "\" has not been declared");
+	    }
+	  else
+	    {
+	      /* add a labeled production part */
+	      add_rhs_part(add_lab(symb, labid));
+	    }
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(24/*prod_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 68: // prod_part_list ::= empty 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(23/*prod_part_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 67: // prod_part_list ::= prod_part_list prod_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(23/*prod_part_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 66: // rhs ::= prod_part_list 
+            {
+              Object RESULT = null;
+		 
+	  if (lhs_nt != null) 
+	    {
+	      /* build the production */
+	      production p = new production(lhs_nt, rhs_parts, rhs_pos);
+
+	      /* if we have no start non-terminal declared and this is 
+		 the first production, make its lhs nt the start_nt 
+		 and build a special start production for it. */
+              if (start_nt == null)
+		{
+		  start_nt = lhs_nt;
+
+	          /* build a special start production */
+	          new_rhs();
+	          add_rhs_part(add_lab(new symbol_part(start_nt),"start_val"));
+	          add_rhs_part(new symbol_part(terminal.EOF));
+		  add_rhs_part(new action_part("RESULT = start_val;"));
+	          emit.start_production = 
+		     new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+
+	          new_rhs();
+		}
+	    }
+	  
+	  /* reset the rhs accumulation in any case */
+	  new_rhs();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(28/*rhs*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 65: // rhs ::= prod_part_list PERCENT_PREC term_id 
+            {
+              Object RESULT = null;
+		int term_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int term_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String term_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		
+	  java_cup.symbol sym = null;
+	  if (lhs_nt != null) 
+	    {
+	      /* Find the precedence symbol */
+	      if (term_name == null) {
+		System.err.println("No terminal for contextual precedence");
+		sym = null;
+	      } else {
+		sym = ((symbol_part)symbols.get(term_name)).the_symbol();
+	      }
+	      /* build the production */
+	      production p;
+	      if ((sym!=null) && (sym instanceof terminal)) {
+		p = new production(lhs_nt, rhs_parts, rhs_pos,
+				   ((terminal)sym).precedence_num(),
+				   ((terminal)sym).precedence_side());
+		((symbol_part)symbols.get(term_name)).the_symbol().note_use();
+	      } else {
+		System.err.println("Invalid terminal " + term_name + 
+				   " for contextual precedence assignment");
+		p = new production(lhs_nt, rhs_parts, rhs_pos);
+	      }
+
+	      /* if we have no start non-terminal declared and this is 
+		 the first production, make its lhs nt the start_nt 
+		 and build a special start production for it. */
+              if (start_nt == null)
+		{
+		  start_nt = lhs_nt;
+
+	          /* build a special start production */
+	          new_rhs();
+	          add_rhs_part(add_lab(new symbol_part(start_nt),"start_val"));
+	          add_rhs_part(new symbol_part(terminal.EOF));
+		  add_rhs_part(new action_part("RESULT = start_val;"));
+		  if ((sym!=null) && (sym instanceof terminal)) {
+		    emit.start_production = 
+		      new production(non_terminal.START_nt, rhs_parts, 
+				     rhs_pos, ((terminal)sym).precedence_num(),
+				     ((terminal)sym).precedence_side());
+		  } else {
+		    emit.start_production = 
+		      new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+		  }
+	          new_rhs();
+		}
+	    }
+
+	  /* reset the rhs accumulation in any case */
+	  new_rhs();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(28/*rhs*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 64: // rhs_list ::= rhs 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(27/*rhs_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 63: // rhs_list ::= rhs_list BAR rhs 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(27/*rhs_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 62: // production ::= error NT$13 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$13
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(22/*production*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 61: // NT$13 ::= 
+            {
+              Object RESULT = null;
+ lexer.emit_error("Syntax Error"); 
+              CUP$parser$result = new java_cup.runtime.Symbol(56/*NT$13*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 60: // production ::= nt_id NT$11 COLON_COLON_EQUALS NT$12 rhs_list SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$11
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-4)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-4)).value;
+              // propagate RESULT from NT$12
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).left;
+		int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).right;
+		String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-5)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(22/*production*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 59: // NT$12 ::= 
+            {
+              Object RESULT = null;
+		int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+ 
+              CUP$parser$result = new java_cup.runtime.Symbol(55/*NT$12*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 58: // NT$11 ::= 
+            {
+              Object RESULT = null;
+		int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+
+	  /* lookup the lhs nt */
+	  lhs_nt = (non_terminal)non_terms.get(lhs_id);
+
+          /* if it wasn't declared, emit a message */
+	  if (lhs_nt == null)
+	    {
+	      if (lexer.error_count == 0)
+	        lexer.emit_error("LHS non terminal \"" + lhs_id + 
+			       "\" has not been declared");
+	    }
+
+	  /* reset the rhs accumulation */
+	  new_rhs();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(54/*NT$11*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 57: // production_list ::= production 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*production_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 56: // production_list ::= production_list production 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(12/*production_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 55: // start_spec ::= empty 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(11/*start_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 54: // start_spec ::= START WITH nt_id NT$10 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$10
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		int start_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int start_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		String start_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(11/*start_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 53: // NT$10 ::= 
+            {
+              Object RESULT = null;
+		int start_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int start_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String start_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+ 
+	  /* verify that the name has been declared as a non terminal */
+	  non_terminal nt = (non_terminal)non_terms.get(start_name);
+	  if (nt == null)
+	    {
+	      lexer.emit_error( "Start non terminal \"" + start_name + 
+	  		         "\" has not been declared");
+	    }
+          else
+	    {
+	      /* remember the non-terminal for later */
+	      start_nt = nt;
+
+	      /* build a special start production */
+	      new_rhs();
+	      add_rhs_part(add_lab(new symbol_part(start_nt), "start_val"));
+	      add_rhs_part(new symbol_part(terminal.EOF));
+	      add_rhs_part(new action_part("RESULT = start_val;"));
+	      emit.start_production = 
+		     new production(non_terminal.START_nt, rhs_parts, rhs_pos);
+	      new_rhs();
+	    }
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(53/*NT$10*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 52: // term_id ::= symbol_id 
+            {
+              String RESULT = null;
+		int symleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int symright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String sym = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		
+	  /* check that the symbol_id is a terminal */
+	  if (symbols.get(sym) == null)
+	    {
+	      /* issue a message */
+	      lexer.emit_error("Terminal \"" + sym + 
+			   "\" has not been declared");
+	    }
+          RESULT = sym;
+         
+              CUP$parser$result = new java_cup.runtime.Symbol(41/*term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 51: // terminal_id ::= term_id 
+            {
+              String RESULT = null;
+		int symleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int symright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		String sym = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+			
+	  add_precedence(sym);
+	  RESULT = sym;
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(40/*terminal_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 50: // terminal_list ::= terminal_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(32/*terminal_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 49: // terminal_list ::= terminal_list COMMA terminal_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(32/*terminal_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 48: // preced ::= PRECEDENCE NONASSOC NT$9 terminal_list SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$9
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 47: // NT$9 ::= 
+            {
+              Object RESULT = null;
+
+	  update_precedence(assoc.nonassoc);
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(52/*NT$9*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 46: // preced ::= PRECEDENCE RIGHT NT$8 terminal_list SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$8
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 45: // NT$8 ::= 
+            {
+              Object RESULT = null;
+
+	  update_precedence(assoc.right);
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(51/*NT$8*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 44: // preced ::= PRECEDENCE LEFT NT$7 terminal_list SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$7
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 43: // NT$7 ::= 
+            {
+              Object RESULT = null;
+
+	  update_precedence(assoc.left);
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(50/*NT$7*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 42: // precedence_l ::= preced 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(33/*precedence_l*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 41: // precedence_l ::= precedence_l preced 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(33/*precedence_l*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 40: // precedence_list ::= empty 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(30/*precedence_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 39: // precedence_list ::= precedence_l 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(30/*precedence_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 38: // non_term_name_list ::= new_non_term_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(21/*non_term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 37: // non_term_name_list ::= non_term_name_list COMMA new_non_term_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(21/*non_term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 36: // term_name_list ::= new_term_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(20/*term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 35: // term_name_list ::= term_name_list COMMA new_term_id 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(20/*term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 34: // declares_non_term ::= non_term_name_list NT$6 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$6
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(35/*declares_non_term*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 33: // NT$6 ::= 
+            {
+              Object RESULT = null;
+ 
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(49/*NT$6*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 32: // declares_term ::= term_name_list NT$5 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$5
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(34/*declares_term*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 31: // NT$5 ::= 
+            {
+              Object RESULT = null;
+ 
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(48/*NT$5*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 30: // symbol ::= non_terminal error NT$4 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$4
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 29: // NT$4 ::= 
+            {
+              Object RESULT = null;
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(47/*NT$4*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 28: // symbol ::= TERMINAL error NT$3 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$3
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 27: // NT$3 ::= 
+            {
+              Object RESULT = null;
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(46/*NT$3*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 26: // symbol ::= non_terminal declares_non_term 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 25: // symbol ::= non_terminal type_id declares_non_term 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 24: // symbol ::= TERMINAL declares_term 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 23: // symbol ::= TERMINAL type_id declares_term 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 22: // symbol_list ::= symbol 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(10/*symbol_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 21: // symbol_list ::= symbol_list symbol 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(10/*symbol_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 20: // scan_code ::= SCAN WITH CODE_STRING opt_semi 
+            {
+              Object RESULT = null;
+		int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 
+	  if (emit.scan_code!=null)
+	    lexer.emit_error("Redundant scan code (skipping)");
+	  else /* save the user code */
+	    emit.scan_code = user_code;
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(17/*scan_code*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 19: // init_code ::= INIT WITH CODE_STRING opt_semi 
+            {
+              Object RESULT = null;
+		int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 
+	  if (emit.init_code!=null)
+	    lexer.emit_error("Redundant init code (skipping)");
+	  else /* save the user code */
+	    emit.init_code = user_code;
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(16/*init_code*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 18: // parser_code_part ::= PARSER CODE CODE_STRING opt_semi 
+            {
+              Object RESULT = null;
+		int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		
+	  if (emit.parser_code!=null)
+	    lexer.emit_error("Redundant parser code (skipping)");
+	  else /* save the user included code string */
+	    emit.parser_code = user_code;
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(9/*parser_code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 17: // action_code_part ::= ACTION CODE CODE_STRING opt_semi 
+            {
+              Object RESULT = null;
+		int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		
+	  if (emit.action_code!=null)
+	    lexer.emit_error("Redundant action code (skipping)");
+	  else /* save the user included code string */
+	    emit.action_code = user_code;
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*action_code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 16: // code_parts ::= code_parts code_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*code_parts*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 15: // code_parts ::= 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(5/*code_parts*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 14: // code_part ::= scan_code 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 13: // code_part ::= init_code 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 12: // code_part ::= parser_code_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 11: // code_part ::= action_code_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 10: // import_spec ::= IMPORT import_id NT$2 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$2
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(14/*import_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 9: // NT$2 ::= 
+            {
+              Object RESULT = null;
+ 
+	  /* save this import on the imports list */
+	  emit.import_list.push(multipart_name);
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(45/*NT$2*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 8: // import_list ::= empty 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*import_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 7: // import_list ::= import_list import_spec 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*import_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 6: // package_spec ::= empty 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(2/*package_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 5: // package_spec ::= PACKAGE multipart_id NT$1 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$1
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(2/*package_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 4: // NT$1 ::= 
+            {
+              Object RESULT = null;
+
+	  /* save the package name */
+	  emit.package_name = multipart_name;
+
+	  /* reset the accumulated multipart name */
+	  multipart_name = new String();
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(44/*NT$1*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 3: // spec ::= error symbol_list precedence_list start_spec production_list 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 2: // spec ::= NT$0 package_spec import_list code_parts symbol_list precedence_list start_spec production_list 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$0
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-7)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-7)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-7)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 1: // NT$0 ::= 
+            {
+              Object RESULT = null;
+
+          /* declare "error" as a terminal */
+          symbols.put("error", new symbol_part(terminal.error));
+
+          /* declare start non terminal */
+          non_terms.put("$START", non_terminal.START_nt);
+	
+              CUP$parser$result = new java_cup.runtime.Symbol(43/*NT$0*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 0: // $START ::= spec EOF 
+            {
+              Object RESULT = null;
+		int start_valleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int start_valright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		Object start_val = (Object)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		RESULT = start_val;
+              CUP$parser$result = new java_cup.runtime.Symbol(0/*$START*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          /* ACCEPT */
+          CUP$parser$parser.done_parsing();
+          return CUP$parser$result;
+
+          /* . . . . . .*/
+          default:
+            throw new Exception(
+               "Invalid action number found in internal parse table");
+
+        }
+    }
+}
+
diff --git a/open-nars/java_cup/production.java b/open-nars/java_cup/production.java
new file mode 100644
index 0000000..5a41287
--- /dev/null
+++ b/open-nars/java_cup/production.java
@@ -0,0 +1,756 @@
+
+package java_cup;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/** This class represents a production in the grammar.  It contains
+ *  a LHS non terminal, and an array of RHS symbols.  As various 
+ *  transformations are done on the RHS of the production, it may shrink.
+ *  As a result a separate length is always maintained to indicate how much
+ *  of the RHS array is still valid.<p>
+ * 
+ *  I addition to construction and manipulation operations, productions provide
+ *  methods for factoring out actions (see  remove_embedded_actions()), for
+ *  computing the nullability of the production (i.e., can it derive the empty
+ *  string, see check_nullable()), and operations for computing its first
+ *  set (i.e., the set of terminals that could appear at the beginning of some
+ *  string derived from the production, see check_first_set()).
+ * 
+ * @see     java_cup.production_part
+ * @see     java_cup.symbol_part
+ * @see     java_cup.action_part
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public class production {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor.  This constructor accepts a LHS non terminal,
+   *  an array of RHS parts (including terminals, non terminals, and 
+   *  actions), and a string for a final reduce action.   It does several
+   *  manipulations in the process of  creating a production object.
+   *  After some validity checking it translates labels that appear in
+   *  actions into code for accessing objects on the runtime parse stack.
+   *  It them merges adjacent actions if they appear and moves any trailing
+   *  action into the final reduce actions string.  Next it removes any
+   *  embedded actions by factoring them out with new action productions.  
+   *  Finally it assigns a unique index to the production.<p>
+   *
+   *  Factoring out of actions is accomplished by creating new "hidden"
+   *  non terminals.  For example if the production was originally: <pre>
+   *    A ::= B {action} C D
+   *  </pre>
+   *  then it is factored into two productions:<pre>
+   *    A ::= B X C D
+   *    X ::= {action}
+   *  </pre> 
+   *  (where X is a unique new non terminal).  This has the effect of placing
+   *  all actions at the end where they can be handled as part of a reduce by
+   *  the parser.
+   */
+  public production(
+    non_terminal    lhs_sym, 
+    production_part rhs_parts[], 
+    int             rhs_l,
+    String          action_str)
+    throws internal_error
+    {
+      int         i;
+      action_part tail_action;
+      String declare_str;
+      int rightlen = rhs_l;
+
+      /* remember the length */
+      if (rhs_l >= 0)
+	_rhs_length = rhs_l;
+      else if (rhs_parts != null)
+	_rhs_length = rhs_parts.length;
+      else
+	_rhs_length = 0;
+	
+      /* make sure we have a valid left-hand-side */
+      if (lhs_sym == null) 
+	throw new internal_error(
+	  "Attempt to construct a production with a null LHS");
+
+      /* I'm not translating labels anymore, I'm adding code to declare
+	 labels as valid variables.  This way, the users code string is
+	 untouched 
+	 6/96 frankf */
+
+      /* check if the last part of the right hand side is an action.  If
+         it is, it won't be on the stack, so we don't want to count it 
+	 in the rightlen.  Then when we search down the stack for a
+         Symbol, we don't try to search past action */
+
+      if (rhs_l > 0) {
+	if (rhs_parts[rhs_l - 1].is_action()) {
+	  rightlen = rhs_l - 1;
+	} else {
+	  rightlen = rhs_l;
+	}
+      }
+
+      /* get the generated declaration code for the necessary labels. */
+      declare_str = declare_labels(
+		    rhs_parts, rightlen, action_str);
+
+      if (action_str == null) 
+	action_str = declare_str;
+      else 
+	action_str = declare_str + action_str;	 	  
+
+      /* count use of lhs */
+      lhs_sym.note_use();
+
+      /* create the part for left-hand-side */
+      _lhs = new symbol_part(lhs_sym);
+
+      /* merge adjacent actions (if any) */
+      _rhs_length = merge_adjacent_actions(rhs_parts, _rhs_length);
+
+      /* strip off any trailing action */
+      tail_action = strip_trailing_action(rhs_parts, _rhs_length);
+      if (tail_action != null) _rhs_length--;
+
+      /* Why does this run through the right hand side happen
+	 over and over?  here a quick combination of two 
+	 prior runs plus one I wanted of my own
+	 frankf 6/25/96 */
+      /* allocate and copy over the right-hand-side */
+      /* count use of each rhs symbol */
+      _rhs = new production_part[_rhs_length];
+      for (i=0; i<_rhs_length; i++) {
+	_rhs[i] = rhs_parts[i];
+	if (!_rhs[i].is_action()) {
+	  ((symbol_part)_rhs[i]).the_symbol().note_use();
+	  if (((symbol_part)_rhs[i]).the_symbol() instanceof terminal) {
+	    _rhs_prec = 
+	      ((terminal)((symbol_part)_rhs[i]).the_symbol()).precedence_num();
+	    _rhs_assoc = 
+	      ((terminal)((symbol_part)_rhs[i]).the_symbol()).precedence_side();
+	  }
+	}
+      }
+
+      /*now action string is really declaration string, so put it in front!
+	6/14/96 frankf */
+      if (action_str == null) action_str = "";
+      if (tail_action != null && tail_action.code_string() != null)
+	action_str = action_str + "\t\t" +  tail_action.code_string();
+
+      /* stash the action */
+      _action = new action_part(action_str);
+
+      /* rewrite production to remove any embedded actions */
+      remove_embedded_actions();
+
+      /* assign an index */
+      _index = next_index++;
+
+      /* put us in the global collection of productions */
+      _all.put(new Integer(_index),this);
+
+      /* put us in the production list of the lhs non terminal */
+      lhs_sym.add_production(this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with no action string. */
+  public production(
+    non_terminal    lhs_sym, 
+    production_part rhs_parts[], 
+    int             rhs_l)
+    throws internal_error
+    {
+      this(lhs_sym,rhs_parts,rhs_l,null);
+    }
+ 
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /* Constructor with precedence and associativity of production
+     contextually define */
+  public production(
+    non_terminal    lhs_sym, 
+    production_part rhs_parts[], 
+    int             rhs_l,
+    String          action_str,
+    int		    prec_num,
+    int             prec_side)
+    throws internal_error
+    {
+      this(lhs_sym,rhs_parts,rhs_l,action_str);
+      
+      /* set the precedence */
+      set_precedence_num(prec_num);
+      set_precedence_side(prec_side);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/	
+     
+  /* Constructor w/ no action string and contextual precedence
+     defined */
+  public production(
+    non_terminal    lhs_sym, 
+    production_part rhs_parts[], 
+    int             rhs_l,
+    int             prec_num,
+    int             prec_side)
+    throws internal_error
+    {
+      this(lhs_sym,rhs_parts,rhs_l,null);
+      /* set the precedence */
+      set_precedence_num(prec_num);
+      set_precedence_side(prec_side);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+ 
+    
+  /** Table of all productions.  Elements are stored using their index as 
+   *  the key.
+   */
+  protected static Hashtable _all = new Hashtable();
+ 
+  /** Access to all productions. */
+  public static Enumeration all() {return _all.elements();}
+
+    /** Lookup a production by index. */
+  public static production find(int indx) {
+    return (production) _all.get(new Integer(indx));
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+ 
+  /** Total number of productions. */
+  public static int number() {return _all.size();}
+
+  /** Static counter for assigning unique index numbers. */
+  protected static int next_index;
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The left hand side non-terminal. */
+  protected symbol_part _lhs;
+
+  /** The left hand side non-terminal. */
+  public symbol_part lhs() {return _lhs;}
+
+
+  /** The precedence of the rule */
+  protected int _rhs_prec = -1;
+  protected int _rhs_assoc = -1;
+
+  /** Access to the precedence of the rule */
+  public int precedence_num() { return _rhs_prec; }
+  public int precedence_side() { return _rhs_assoc; }
+
+  /** Setting the precedence of a rule */
+  public void set_precedence_num(int prec_num) {  
+    _rhs_prec = prec_num;
+  }
+  public void set_precedence_side(int prec_side) { 
+    _rhs_assoc = prec_side;
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** A collection of parts for the right hand side. */
+  protected production_part _rhs[];
+
+  /** Access to the collection of parts for the right hand side. */
+  public production_part rhs(int indx) throws internal_error
+    {
+      if (indx >= 0 && indx < _rhs_length)
+	return _rhs[indx];
+      else
+	throw new internal_error(
+	  "Index out of range for right hand side of production");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** How much of the right hand side array we are presently using. */
+  protected int _rhs_length;
+
+  /** How much of the right hand side array we are presently using. */
+  public int rhs_length() {return _rhs_length;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** An action_part containing code for the action to be performed when we 
+   *  reduce with this production. 
+   */
+  protected action_part _action;
+
+  /** An action_part containing code for the action to be performed when we 
+   *  reduce with this production. 
+   */
+  public action_part action() {return _action;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Index number of the production. */
+  protected int _index;
+
+  /** Index number of the production. */
+  public int index() {return _index;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Count of number of reductions using this production. */
+  protected int _num_reductions = 0;
+
+  /** Count of number of reductions using this production. */
+  public int num_reductions() {return _num_reductions;}
+
+  /** Increment the count of reductions with this non-terminal */
+  public void note_reduction_use() {_num_reductions++;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Is the nullability of the production known or unknown? */
+  protected boolean _nullable_known = false;
+
+  /** Is the nullability of the production known or unknown? */
+  public boolean nullable_known() {return _nullable_known;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Nullability of the production (can it derive the empty string). */
+  protected boolean _nullable = false;
+
+  /** Nullability of the production (can it derive the empty string). */
+  public boolean nullable() {return _nullable;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** First set of the production.  This is the set of terminals that 
+   *  could appear at the front of some string derived from this production.
+   */
+  protected terminal_set _first_set = new terminal_set();
+
+  /** First set of the production.  This is the set of terminals that 
+   *  could appear at the front of some string derived from this production.
+   */
+  public terminal_set first_set() {return _first_set;}
+
+  /*-----------------------------------------------------------*/
+  /*--- Static Methods ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Determine if a given character can be a label id starter. 
+   * @param c the character in question. 
+   */
+  protected static boolean is_id_start(char c)
+    {
+      return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_');
+
+      //later need to handle non-8-bit chars here
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if a character can be in a label id. 
+   * @param c the character in question.
+   */
+  protected static boolean is_id_char(char c)
+    {
+      return is_id_start(c) || (c >= '0' && c <= '9');
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+  
+
+  /** Return label declaration code
+   * @param labelname    the label name
+   * @param stack_type   the stack type of label?
+   * @author frankf
+   */ 
+  protected String make_declaration(
+				    String  labelname,
+				    String  stack_type,
+				    int     offset)
+    {
+      String ret;
+
+      /* Put in the left/right value labels */
+      if (emit.lr_values())
+        ret = "\t\tint " + labelname + "left = ((java_cup.runtime.Symbol)" + 
+	  emit.pre("stack") + ".elementAt(" + emit.pre("top") + 
+	  "-" + offset + ")).left;\n" +
+	  "\t\tint " + labelname + "right = ((java_cup.runtime.Symbol)" + 
+	  emit.pre("stack") + ".elementAt(" + emit.pre("top") +
+	  "-" + offset + ")).right;\n";
+      else ret = "";
+
+      /* otherwise, just declare label. */
+	return ret + "\t\t" + stack_type + " " + labelname + " = (" + stack_type + 
+	  ")((" + "java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt(" + emit.pre("top") 
+	  + "-" + offset + ")).value;\n";
+
+    }
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Declare label names as valid variables within the action string
+   * @param rhs          array of RHS parts.
+   * @param rhs_len      how much of rhs to consider valid.
+   * @param final_action the final action string of the production. 
+   * @param lhs_type     the object type associated with the LHS symbol.
+   */ 
+  protected String declare_labels(
+    production_part  rhs[], 
+    int              rhs_len, 
+    String           final_action)
+    {
+      String declaration = "";
+
+      symbol_part part;
+      action_part act_part;
+      int         pos;
+
+      /* walk down the parts and extract the labels */
+      for (pos = 0; pos < rhs_len; pos++)
+	{
+	  if (!rhs[pos].is_action())
+	    {
+	      part = (symbol_part)rhs[pos];
+
+	      /* if it has a label, make declaration! */
+	      if (part.label() != null)
+		{
+		  declaration = declaration + 
+		    make_declaration(part.label(), part.the_symbol().stack_type(), 
+				     rhs_len-pos-1);
+		}
+	    }
+	}
+      return declaration;
+    }
+
+
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Helper routine to merge adjacent actions in a set of RHS parts 
+   * @param rhs_parts array of RHS parts.
+   * @param len       amount of that array that is valid.
+   * @return          remaining valid length.
+   */
+  protected int merge_adjacent_actions(production_part rhs_parts[], int len)
+    {
+      int from_loc, to_loc, merge_cnt;
+
+      /* bail out early if we have no work to do */
+      if (rhs_parts == null || len == 0) return 0;
+
+      merge_cnt = 0;
+      to_loc = -1;
+      for (from_loc=0; from_loc<len; from_loc++)
+	{
+	  /* do we go in the current position or one further */
+	  if (to_loc < 0 || !rhs_parts[to_loc].is_action() 
+			 || !rhs_parts[from_loc].is_action())
+	    {
+	      /* next one */
+	      to_loc++;
+
+	      /* clear the way for it */
+	      if (to_loc != from_loc) rhs_parts[to_loc] = null;
+	    }
+
+	  /* if this is not trivial? */
+	  if (to_loc != from_loc)
+	    {
+	      /* do we merge or copy? */
+	      if (rhs_parts[to_loc] != null && rhs_parts[to_loc].is_action() && 
+		  rhs_parts[from_loc].is_action())
+	      {
+	        /* merge */
+	        rhs_parts[to_loc] = new action_part(
+		  ((action_part)rhs_parts[to_loc]).code_string() +
+		  ((action_part)rhs_parts[from_loc]).code_string());
+	        merge_cnt++;
+	      }
+	    else
+	      {
+	        /* copy */
+	        rhs_parts[to_loc] = rhs_parts[from_loc];
+	      }
+	    }
+	}
+
+      /* return the used length */
+      return len - merge_cnt;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Helper routine to strip a trailing action off rhs and return it
+   * @param rhs_parts array of RHS parts.
+   * @param len       how many of those are valid.
+   * @return          the removed action part.
+   */
+  protected action_part strip_trailing_action(
+    production_part rhs_parts[],
+    int             len)
+    {
+      action_part result;
+
+      /* bail out early if we have nothing to do */
+      if (rhs_parts == null || len == 0) return null;
+
+      /* see if we have a trailing action */
+      if (rhs_parts[len-1].is_action())
+	{
+	  /* snip it out and return it */
+	  result = (action_part)rhs_parts[len-1];
+	  rhs_parts[len-1] = null;
+	  return result;
+	}
+      else
+	return null;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove all embedded actions from a production by factoring them 
+   *  out into individual action production using new non terminals.
+   *  if the original production was:  <pre>
+   *    A ::= B {action1} C {action2} D 
+   *  </pre>
+   *  then it will be factored into: <pre>
+   *    A ::= B NT$1 C NT$2 D
+   *    NT$1 ::= {action1}
+   *    NT$2 ::= {action2}
+   *  </pre>
+   *  where NT$1 and NT$2 are new system created non terminals.
+   */
+
+  /* the declarations added to the parent production are also passed along,
+     as they should be perfectly valid in this code string, since it
+     was originally a code string in the parent, not on its own.
+     frank 6/20/96 */
+  protected void remove_embedded_actions(
+	   
+            ) throws internal_error
+    {
+      non_terminal new_nt;
+      production   new_prod;
+      String declare_str;
+      
+      /* walk over the production and process each action */
+      for (int act_loc = 0; act_loc < rhs_length(); act_loc++)
+	if (rhs(act_loc).is_action())
+	  {
+	    
+	    
+	    declare_str = declare_labels(
+		      _rhs, act_loc, "");
+	    /* create a new non terminal for the action production */
+	    new_nt = non_terminal.create_new();
+	    new_nt.is_embedded_action = true; /* 24-Mar-1998, CSA */
+
+	    /* create a new production with just the action */
+	    new_prod = new action_production(this, new_nt, null, 0, 
+		declare_str + ((action_part)rhs(act_loc)).code_string());
+
+	    /* replace the action with the generated non terminal */
+	    _rhs[act_loc] = new symbol_part(new_nt);
+	  }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Check to see if the production (now) appears to be nullable.
+   *  A production is nullable if its RHS could derive the empty string.
+   *  This results when the RHS is empty or contains only non terminals
+   *  which themselves are nullable.
+   */
+  public boolean check_nullable() throws internal_error
+    {
+      production_part part;
+      symbol          sym;
+      int             pos;
+
+      /* if we already know bail out early */
+      if (nullable_known()) return nullable();
+
+      /* if we have a zero size RHS we are directly nullable */
+      if (rhs_length() == 0)
+	{
+	  /* stash and return the result */
+	  return set_nullable(true);
+	}
+
+      /* otherwise we need to test all of our parts */
+      for (pos=0; pos<rhs_length(); pos++)
+	{
+	  part = rhs(pos);
+
+	  /* only look at non-actions */
+	  if (!part.is_action())
+	    {
+	      sym = ((symbol_part)part).the_symbol();
+
+	      /* if its a terminal we are definitely not nullable */
+	      if (!sym.is_non_term()) 
+		return set_nullable(false);
+	      /* its a non-term, is it marked nullable */
+	      else if (!((non_terminal)sym).nullable())
+		/* this one not (yet) nullable, so we aren't */
+	        return false;
+	    }
+	}
+
+      /* if we make it here all parts are nullable */
+      return set_nullable(true);
+    }
+
+  /** set (and return) nullability */
+  boolean set_nullable(boolean v)
+    {
+      _nullable_known = true;
+      _nullable = v;
+      return v;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Update (and return) the first set based on current NT firsts. 
+   *  This assumes that nullability has already been computed for all non 
+   *  terminals and productions. 
+   */
+  public terminal_set check_first_set() throws internal_error
+    {
+      int    part;
+      symbol sym;
+
+      /* walk down the right hand side till we get past all nullables */
+      for (part=0; part<rhs_length(); part++)
+	{
+	  /* only look at non-actions */
+	  if (!rhs(part).is_action())
+	    {
+	      sym = ((symbol_part)rhs(part)).the_symbol();
+
+	      /* is it a non-terminal?*/
+	      if (sym.is_non_term())
+		{
+		  /* add in current firsts from that NT */
+		  _first_set.add(((non_terminal)sym).first_set());
+
+		  /* if its not nullable, we are done */
+		  if (!((non_terminal)sym).nullable())
+		    break;
+		}
+	      else
+		{
+	          /* its a terminal -- add that to the set */
+		  _first_set.add((terminal)sym);
+
+		  /* we are done */
+		  break;
+		}
+	    }
+	}
+
+      /* return our updated first set */
+      return first_set();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(production other)
+    {
+      if (other == null) return false;
+      return other._index == _index;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof production))
+	return false;
+      else
+	return equals((production)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a hash code. */
+  public int hashCode()
+    {
+      /* just use a simple function of the index */
+      return _index*13;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString() 
+    {
+      String result;
+      
+      /* catch any internal errors */
+      try {
+        result = "production [" + index() + "]: "; 
+        result += ((lhs() != null) ? lhs().toString() : "$$NULL-LHS$$");
+        result += " :: = ";
+        for (int i = 0; i<rhs_length(); i++)
+	  result += rhs(i) + " ";
+        result += ";";
+        if (action()  != null && action().code_string() != null) 
+	  result += " {" + action().code_string() + "}";
+
+        if (nullable_known())
+	  if (nullable())
+	    result += "[NULLABLE]";
+	  else
+	    result += "[NOT NULLABLE]";
+      } catch (internal_error e) {
+	/* crash on internal error since we can't throw it from here (because
+	   superclass does not throw anything. */
+	e.crash();
+	result = null;
+      }
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a simpler string. */
+  public String to_simple_string() throws internal_error
+    {
+      String result;
+
+      result = ((lhs() != null) ? lhs().the_symbol().name() : "NULL_LHS");
+      result += " ::= ";
+      for (int i = 0; i < rhs_length(); i++)
+	if (!rhs(i).is_action())
+	  result += ((symbol_part)rhs(i)).the_symbol().name() + " ";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/production_part.java b/open-nars/java_cup/production_part.java
new file mode 100644
index 0000000..a790ec0
--- /dev/null
+++ b/open-nars/java_cup/production_part.java
@@ -0,0 +1,94 @@
+package java_cup;
+
+/** This class represents one part (either a symbol or an action) of a 
+ *  production.  In this base class it contains only an optional label 
+ *  string that the user can use to refer to the part within actions.<p>
+ *
+ *  This is an abstract class.
+ *
+ * @see     java_cup.production
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public abstract class production_part {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** Simple constructor. */
+  public production_part(String lab)
+    {
+      _label = lab;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** Optional label for referring to the part within an action (null for 
+   *  no label). 
+   */
+  protected String _label;
+
+  /** Optional label for referring to the part within an action (null for 
+   *  no label). 
+   */
+  public String label() {return _label;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** Indicate if this is an action (rather than a symbol).  Here in the 
+   * base class, we don't this know yet, so its an abstract method.
+   */
+  public abstract boolean is_action();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(production_part other)
+    {
+      if (other == null) return false;
+
+      /* compare the labels */
+      if (label() != null)
+	return label().equals(other.label());
+      else
+	return other.label() == null;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof production_part))
+        return false;
+      else
+	return equals((production_part)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a hash code. */
+  public int hashCode()
+    {
+      return label()==null ? 0 : label().hashCode();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      if (label() != null)
+	return label() + ":";
+      else
+	return " ";
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/reduce_action.java b/open-nars/java_cup/reduce_action.java
new file mode 100644
index 0000000..e8f4c84
--- /dev/null
+++ b/open-nars/java_cup/reduce_action.java
@@ -0,0 +1,84 @@
+
+package java_cup;
+
+/** This class represents a reduce action within the parse table. 
+ *  The action simply stores the production that it reduces with and 
+ *  responds to queries about its type.
+ *
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class reduce_action extends parse_action {
+ 
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. 
+   * @param prod the production this action reduces with.
+   */
+  public reduce_action(production prod ) throws internal_error
+    {
+      /* sanity check */
+      if (prod == null)
+	throw new internal_error(
+	  "Attempt to create a reduce_action with a null production");
+
+      _reduce_with = prod;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+  
+  /** The production we reduce with. */
+  protected production _reduce_with;
+
+  /** The production we reduce with. */
+  public production reduce_with() {return _reduce_with;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Quick access to type of action. */
+  public int kind() {return REDUCE;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality test. */
+  public boolean equals(reduce_action other)
+    {
+      return other != null && other.reduce_with() == reduce_with();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality test. */
+  public boolean equals(Object other)
+    {
+      if (other instanceof reduce_action)
+	return equals((reduce_action)other);
+      else
+       return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute a hash code. */
+  public int hashCode()
+    {
+      /* use the hash code of the production we are reducing with */
+      return reduce_with().hashCode();
+    }
+
+
+  /** Convert to string. */
+  public String toString() 
+    {
+      return "REDUCE(with prod " + reduce_with().index() + ")";
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/runtime/Scanner.java b/open-nars/java_cup/runtime/Scanner.java
new file mode 100644
index 0000000..3233551
--- /dev/null
+++ b/open-nars/java_cup/runtime/Scanner.java
@@ -0,0 +1,25 @@
+package java_cup.runtime;
+
+/**
+ * Defines the Scanner interface, which CUP uses in the default
+ * implementation of <code>lr_parser.scan()</code>.  Integration
+ * of scanners implementing <code>Scanner</code> is facilitated.
+ *
+ * @version last updated 23-Jul-1999
+ * @author David MacMahon <davidm@smartsc.com>
+ */
+
+/* *************************************************
+  Interface Scanner
+  
+  Declares the next_token() method that should be
+  implemented by scanners.  This method is typically
+  called by lr_parser.scan().  End-of-file can be
+  indicated either by returning
+  <code>new Symbol(lr_parser.EOF_sym())</code> or
+  <code>null</code>.
+ ***************************************************/
+public interface Scanner {
+    /** Return the next token, or <code>null</code> on end-of-file. */
+    public Symbol next_token() throws java.lang.Exception;
+}
diff --git a/open-nars/java_cup/runtime/Symbol.java b/open-nars/java_cup/runtime/Symbol.java
new file mode 100644
index 0000000..eeb6a0b
--- /dev/null
+++ b/open-nars/java_cup/runtime/Symbol.java
@@ -0,0 +1,105 @@
+package java_cup.runtime;
+
+/**
+ * Defines the Symbol class, which is used to represent all terminals
+ * and nonterminals while parsing.  The lexer should pass CUP Symbols 
+ * and CUP returns a Symbol.
+ *
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+/* ****************************************************************
+  Class Symbol
+  what the parser expects to receive from the lexer. 
+  the token is identified as follows:
+  sym:    the symbol type
+  parse_state: the parse state.
+  value:  is the lexical value of type Object
+  left :  is the left position in the original input file
+  right:  is the right position in the original input file
+******************************************************************/
+
+public class Symbol {
+
+/*******************************
+  Constructor for l,r values
+ *******************************/
+
+  public Symbol(int id, int l, int r, Object o) {
+    this(id);
+    left = l;
+    right = r;
+    value = o;
+  }
+
+/*******************************
+  Constructor for no l,r values
+********************************/
+
+  public Symbol(int id, Object o) {
+    this(id, -1, -1, o);
+  }
+
+/*****************************
+  Constructor for no value
+  ***************************/
+
+  public Symbol(int id, int l, int r) {
+    this(id, l, r, null);
+  }
+
+/***********************************
+  Constructor for no value or l,r
+***********************************/
+
+  public Symbol(int sym_num) {
+    this(sym_num, -1);
+    left = -1;
+    right = -1;
+    value = null;
+  }
+
+/***********************************
+  Constructor to give a start state
+***********************************/
+  Symbol(int sym_num, int state)
+    {
+      sym = sym_num;
+      parse_state = state;
+    }
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The symbol number of the terminal or non terminal being represented */
+  public int sym;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The parse state to be recorded on the parse stack with this symbol.
+   *  This field is for the convenience of the parser and shouldn't be 
+   *  modified except by the parser. 
+   */
+  public int parse_state;
+  /** This allows us to catch some errors caused by scanners recycling
+   *  symbols.  For the use of the parser only. [CSA, 23-Jul-1999] */
+  boolean used_by_parser = false;
+
+/*******************************
+  The data passed to parser
+ *******************************/
+
+  public int left, right;
+  public Object value;
+
+  /*****************************
+    Printing this token out. (Override for pretty-print).
+    ****************************/
+  public String toString() { return "#"+sym; }
+}
+
+
+
+
+
+
diff --git a/open-nars/java_cup/runtime/lr_parser.java b/open-nars/java_cup/runtime/lr_parser.java
new file mode 100644
index 0000000..3c8335c
--- /dev/null
+++ b/open-nars/java_cup/runtime/lr_parser.java
@@ -0,0 +1,1238 @@
+				    
+package java_cup.runtime;
+
+import java.util.Stack;
+
+/** This class implements a skeleton table driven LR parser.  In general,
+ *  LR parsers are a form of bottom up shift-reduce parsers.  Shift-reduce
+ *  parsers act by shifting input onto a parse stack until the Symbols 
+ *  matching the right hand side of a production appear on the top of the 
+ *  stack.  Once this occurs, a reduce is performed.  This involves removing
+ *  the Symbols corresponding to the right hand side of the production
+ *  (the so called "handle") and replacing them with the non-terminal from
+ *  the left hand side of the production.  <p>
+ *
+ *  To control the decision of whether to shift or reduce at any given point, 
+ *  the parser uses a state machine (the "viable prefix recognition machine" 
+ *  built by the parser generator).  The current state of the machine is placed
+ *  on top of the parse stack (stored as part of a Symbol object representing
+ *  a terminal or non terminal).  The parse action table is consulted 
+ *  (using the current state and the current lookahead Symbol as indexes) to 
+ *  determine whether to shift or to reduce.  When the parser shifts, it 
+ *  changes to a new state by pushing a new Symbol (containing a new state) 
+ *  onto the stack.  When the parser reduces, it pops the handle (right hand 
+ *  side of a production) off the stack.  This leaves the parser in the state 
+ *  it was in before any of those Symbols were matched.  Next the reduce-goto 
+ *  table is consulted (using the new state and current lookahead Symbol as 
+ *  indexes) to determine a new state to go to.  The parser then shifts to 
+ *  this goto state by pushing the left hand side Symbol of the production 
+ *  (also containing the new state) onto the stack.<p>
+ *
+ *  This class actually provides four LR parsers.  The methods parse() and 
+ *  debug_parse() provide two versions of the main parser (the only difference 
+ *  being that debug_parse() emits debugging trace messages as it parses).  
+ *  In addition to these main parsers, the error recovery mechanism uses two 
+ *  more.  One of these is used to simulate "parsing ahead" in the input 
+ *  without carrying out actions (to verify that a potential error recovery 
+ *  has worked), and the other is used to parse through buffered "parse ahead" 
+ *  input in order to execute all actions and re-synchronize the actual parser 
+ *  configuration.<p>
+ *
+ *  This is an abstract class which is normally filled out by a subclass
+ *  generated by the JavaCup parser generator.  In addition to supplying
+ *  the actual parse tables, generated code also supplies methods which 
+ *  invoke various pieces of user supplied code, provide access to certain
+ *  special Symbols (e.g., EOF and error), etc.  Specifically, the following
+ *  abstract methods are normally supplied by generated code:
+ *  <dl compact>
+ *  <dt> short[][] production_table()
+ *  <dd> Provides a reference to the production table (indicating the index of
+ *       the left hand side non terminal and the length of the right hand side
+ *       for each production in the grammar).
+ *  <dt> short[][] action_table()
+ *  <dd> Provides a reference to the parse action table.
+ *  <dt> short[][] reduce_table()
+ *  <dd> Provides a reference to the reduce-goto table.
+ *  <dt> int start_state()      
+ *  <dd> Indicates the index of the start state.
+ *  <dt> int start_production() 
+ *  <dd> Indicates the index of the starting production.
+ *  <dt> int EOF_sym() 
+ *  <dd> Indicates the index of the EOF Symbol.
+ *  <dt> int error_sym() 
+ *  <dd> Indicates the index of the error Symbol.
+ *  <dt> Symbol do_action() 
+ *  <dd> Executes a piece of user supplied action code.  This always comes at 
+ *       the point of a reduce in the parse, so this code also allocates and 
+ *       fills in the left hand side non terminal Symbol object that is to be 
+ *       pushed onto the stack for the reduce.
+ *  <dt> void init_actions()
+ *  <dd> Code to initialize a special object that encapsulates user supplied
+ *       actions (this object is used by do_action() to actually carry out the 
+ *       actions).
+ *  </dl>
+ *  
+ *  In addition to these routines that <i>must</i> be supplied by the 
+ *  generated subclass there are also a series of routines that <i>may</i> 
+ *  be supplied.  These include:
+ *  <dl>
+ *  <dt> Symbol scan()
+ *  <dd> Used to get the next input Symbol from the scanner.
+ *  <dt> Scanner getScanner()
+ *  <dd> Used to provide a scanner for the default implementation of
+ *       scan().
+ *  <dt> int error_sync_size()
+ *  <dd> This determines how many Symbols past the point of an error 
+ *       must be parsed without error in order to consider a recovery to 
+ *       be valid.  This defaults to 3.  Values less than 2 are not 
+ *       recommended.
+ *  <dt> void report_error(String message, Object info)
+ *  <dd> This method is called to report an error.  The default implementation
+ *       simply prints a message to System.err and where the error occurred.
+ *       This method is often replaced in order to provide a more sophisticated
+ *       error reporting mechanism.
+ *  <dt> void report_fatal_error(String message, Object info)
+ *  <dd> This method is called when a fatal error that cannot be recovered from
+ *       is encountered.  In the default implementation, it calls 
+ *       report_error() to emit a message, then throws an exception.
+ *  <dt> void syntax_error(Symbol cur_token)
+ *  <dd> This method is called as soon as syntax error is detected (but
+ *       before recovery is attempted).  In the default implementation it 
+ *       invokes: report_error("Syntax error", null);
+ *  <dt> void unrecovered_syntax_error(Symbol cur_token)
+ *  <dd> This method is called if syntax error recovery fails.  In the default
+ *       implementation it invokes:<br> 
+ *         report_fatal_error("Couldn't repair and continue parse", null);
+ *  </dl>
+ *
+ * @see     java_cup.runtime.Symbol
+ * @see     java_cup.runtime.Symbol
+ * @see     java_cup.runtime.virtual_parse_stack
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public abstract class lr_parser {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. */
+  public lr_parser()
+    {
+      /* nothing to do here */
+    }
+
+  /** Constructor that sets the default scanner. [CSA/davidm] */
+  public lr_parser(Scanner s) {
+    this(); /* in case default constructor someday does something */
+    setScanner(s);
+  }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The default number of Symbols after an error we much match to consider 
+   *  it recovered from. 
+   */
+  protected final static int _error_sync_size = 3;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The number of Symbols after an error we much match to consider it 
+   *  recovered from. 
+   */
+  protected int error_sync_size() {return _error_sync_size; }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Table of production information (supplied by generated subclass).
+   *  This table contains one entry per production and is indexed by 
+   *  the negative-encoded values (reduce actions) in the action_table.  
+   *  Each entry has two parts, the index of the non-terminal on the 
+   *  left hand side of the production, and the number of Symbols 
+   *  on the right hand side. 
+   */
+  public abstract short[][] production_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The action table (supplied by generated subclass).  This table is
+   *  indexed by state and terminal number indicating what action is to
+   *  be taken when the parser is in the given state (i.e., the given state 
+   *  is on top of the stack) and the given terminal is next on the input.  
+   *  States are indexed using the first dimension, however, the entries for 
+   *  a given state are compacted and stored in adjacent index, value pairs 
+   *  which are searched for rather than accessed directly (see get_action()).  
+   *  The actions stored in the table will be either shifts, reduces, or 
+   *  errors.  Shifts are encoded as positive values (one greater than the 
+   *  state shifted to).  Reduces are encoded as negative values (one less 
+   *  than the production reduced by).  Error entries are denoted by zero. 
+   * 
+   * @see java_cup.runtime.lr_parser#get_action
+   */
+  public abstract short[][] action_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The reduce-goto table (supplied by generated subclass).  This
+   *  table is indexed by state and non-terminal number and contains
+   *  state numbers.  States are indexed using the first dimension, however,
+   *  the entries for a given state are compacted and stored in adjacent
+   *  index, value pairs which are searched for rather than accessed 
+   *  directly (see get_reduce()).  When a reduce occurs, the handle 
+   *  (corresponding to the RHS of the matched production) is popped off 
+   *  the stack.  The new top of stack indicates a state.  This table is 
+   *  then indexed by that state and the LHS of the reducing production to 
+   *  indicate where to "shift" to. 
+   *
+   * @see java_cup.runtime.lr_parser#get_reduce
+   */
+  public abstract short[][] reduce_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the start state (supplied by generated subclass). */
+  public abstract int start_state();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the start production (supplied by generated subclass). */
+  public abstract int start_production();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the end of file terminal Symbol (supplied by generated 
+   *  subclass). 
+   */
+  public abstract int EOF_sym();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the special error Symbol (supplied by generated subclass). */
+  public abstract int error_sym();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Internal flag to indicate when parser should quit. */
+  protected boolean _done_parsing = false;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called to indicate that the parser should quit.  This is 
+   *  normally called by an accept action, but can be used to cancel parsing 
+   *  early in other circumstances if desired. 
+   */
+  public void done_parsing()
+    {
+      _done_parsing = true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+  /* Global parse state shared by parse(), error recovery, and 
+   * debugging routines */
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indication of the index for top of stack (for use by actions). */
+  protected int tos;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The current lookahead Symbol. */
+  protected Symbol cur_token;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The parse stack itself. */
+  protected Stack stack = new Stack();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the production table. */ 
+  protected short[][] production_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the action table. */
+  protected short[][] action_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the reduce-goto table. */
+  protected short[][] reduce_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This is the scanner object used by the default implementation
+   *  of scan() to get Symbols.  To avoid name conflicts with existing
+   *  code, this field is private. [CSA/davidm] */
+  private Scanner _scanner;
+
+  /**
+   * Simple accessor method to set the default scanner.
+   */
+  public void setScanner(Scanner s) { _scanner = s; }
+
+  /**
+   * Simple accessor method to get the default scanner.
+   */
+  public Scanner getScanner() { return _scanner; }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Perform a bit of user supplied action code (supplied by generated 
+   *  subclass).  Actions are indexed by an internal action number assigned
+   *  at parser generation time.
+   *
+   * @param act_num   the internal index of the action to be performed.
+   * @param parser    the parser object we are acting for.
+   * @param stack     the parse stack of that object.
+   * @param top       the index of the top element of the parse stack.
+   */
+  public abstract Symbol do_action(
+    int       act_num, 
+    lr_parser parser, 
+    Stack     stack, 
+    int       top) 
+    throws java.lang.Exception;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User code for initialization inside the parser.  Typically this 
+   *  initializes the scanner.  This is called before the parser requests
+   *  the first Symbol.  Here this is just a placeholder for subclasses that 
+   *  might need this and we perform no action.   This method is normally
+   *  overridden by the generated code using this contents of the "init with"
+   *  clause as its body.
+   */
+  public void user_init() throws java.lang.Exception { }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Initialize the action object.  This is called before the parser does
+   *  any parse actions. This is filled in by generated code to create
+   *  an object that encapsulates all action code. 
+   */ 
+  protected abstract void init_actions() throws java.lang.Exception;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Get the next Symbol from the input (supplied by generated subclass).
+   *  Once end of file has been reached, all subsequent calls to scan 
+   *  should return an EOF Symbol (which is Symbol number 0).  By default
+   *  this method returns getScanner().next_token(); this implementation
+   *  can be overriden by the generated parser using the code declared in
+   *  the "scan with" clause.  Do not recycle objects; every call to
+   *  scan() should return a fresh object.
+   */
+  public Symbol scan() throws java.lang.Exception {
+    Symbol sym = getScanner().next_token();
+    return (sym!=null) ? sym : new Symbol(EOF_sym());
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Report a fatal error.  This method takes a  message string and an 
+   *  additional object (to be used by specializations implemented in 
+   *  subclasses).  Here in the base class a very simple implementation 
+   *  is provided which reports the error then throws an exception. 
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_fatal_error(
+    String   message, 
+    Object   info)
+    throws java.lang.Exception
+    {
+      /* stop parsing (not really necessary since we throw an exception, but) */
+      done_parsing();
+
+      /* use the normal error message reporting to put out the message */
+      report_error(message, info);
+
+      /* throw an exception */
+      throw new Exception("Can't recover from previous error(s)");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Report a non fatal error (or warning).  This method takes a message 
+   *  string and an additional object (to be used by specializations 
+   *  implemented in subclasses).  Here in the base class a very simple 
+   *  implementation is provided which simply prints the message to 
+   *  System.err. 
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_error(String message, Object info)
+    {
+      System.err.print(message);
+      if (info instanceof Symbol)
+	if (((Symbol)info).left != -1)
+	System.err.println(" at character " + ((Symbol)info).left + 
+			   " of input");
+	else System.err.println("");
+      else System.err.println("");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called when a syntax error has been detected and recovery 
+   *  is about to be invoked.  Here in the base class we just emit a 
+   *  "Syntax error" error message.  
+   *
+   * @param cur_token the current lookahead Symbol.
+   */
+  public void syntax_error(Symbol cur_token)
+    {
+      report_error("Syntax error", cur_token);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called if it is determined that syntax error recovery 
+   *  has been unsuccessful.  Here in the base class we report a fatal error. 
+   *
+   * @param cur_token the current lookahead Symbol.
+   */
+  public void unrecovered_syntax_error(Symbol cur_token)
+    throws java.lang.Exception
+    {
+      report_fatal_error("Couldn't repair and continue parse", cur_token);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Fetch an action from the action table.  The table is broken up into
+   *  rows, one per state (rows are indexed directly by state number).  
+   *  Within each row, a list of index, value pairs are given (as sequential
+   *  entries in the table), and the list is terminated by a default entry 
+   *  (denoted with a Symbol index of -1).  To find the proper entry in a row 
+   *  we do a linear or binary search (depending on the size of the row).  
+   *
+   * @param state the state index of the action being accessed.
+   * @param sym   the Symbol index of the action being accessed.
+   */
+  protected final short get_action(int state, int sym)
+    {
+      short tag;
+      int first, last, probe;
+      short[] row = action_tab[state];
+
+      /* linear search if we are < 10 entries */
+      if (row.length < 20)
+        for (probe = 0; probe < row.length; probe++)
+	  {
+	    /* is this entry labeled with our Symbol or the default? */
+	    tag = row[probe++];
+	    if (tag == sym || tag == -1)
+	      {
+	        /* return the next entry */
+	        return row[probe];
+	      }
+	  }
+      /* otherwise binary search */
+      else
+	{
+	  first = 0; 
+	  last = (row.length-1)/2 - 1;  /* leave out trailing default entry */
+	  while (first <= last)
+	    {
+	      probe = (first+last)/2;
+	      if (sym == row[probe*2])
+		return row[probe*2+1];
+	      else if (sym > row[probe*2])
+		first = probe+1;
+	      else
+	        last = probe-1;
+	    }
+
+	  /* not found, use the default at the end */
+	  return row[row.length-1];
+	}
+
+      /* shouldn't happened, but if we run off the end we return the 
+	 default (error == 0) */
+      return 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Fetch a state from the reduce-goto table.  The table is broken up into
+   *  rows, one per state (rows are indexed directly by state number).  
+   *  Within each row, a list of index, value pairs are given (as sequential
+   *  entries in the table), and the list is terminated by a default entry 
+   *  (denoted with a Symbol index of -1).  To find the proper entry in a row 
+   *  we do a linear search.  
+   *
+   * @param state the state index of the entry being accessed.
+   * @param sym   the Symbol index of the entry being accessed.
+   */
+  protected final short get_reduce(int state, int sym)
+    {
+      short tag;
+      short[] row = reduce_tab[state];
+
+      /* if we have a null row we go with the default */
+      if (row == null)
+        return -1;
+
+      for (int probe = 0; probe < row.length; probe++)
+	{
+	  /* is this entry labeled with our Symbol or the default? */
+	  tag = row[probe++];
+	  if (tag == sym || tag == -1)
+	    {
+	      /* return the next entry */
+	      return row[probe];
+	    }
+	}
+      /* if we run off the end we return the default (error == -1) */
+      return -1;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method provides the main parsing routine.  It returns only when 
+   *  done_parsing() has been called (typically because the parser has 
+   *  accepted, or a fatal error has been reported).  See the header 
+   *  documentation for the class regarding how shift/reduce parsers operate
+   *  and how the various tables are used.
+   */
+  public Symbol parse() throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* set up direct reference to tables to drive the parser */
+
+      production_tab = production_table();
+      action_tab     = action_table();
+      reduce_tab     = reduce_table();
+
+      /* initialize the action encapsulation object */
+      init_actions();
+
+      /* do user initialization */
+      user_init();
+
+      /* get the first token */
+      cur_token = scan(); 
+
+      /* push dummy Symbol with start state to get us underway */
+      stack.removeAllElements();
+      stack.push(new Symbol(0, start_state()));
+      tos = 0;
+
+      /* continue until we are told to stop */
+      for (_done_parsing = false; !_done_parsing; )
+	{
+	  /* Check current token for freshness. */
+	  if (cur_token.used_by_parser)
+	    throw new Error("Symbol recycling detected (fix your scanner).");
+
+	  /* current state is always on the top of the stack */
+
+	  /* look up action out of the current state with the current input */
+	  act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_token.parse_state = act-1;
+	      cur_token.used_by_parser = true;
+	      stack.push(cur_token);
+	      tos++;
+
+	      /* advance to the next Symbol */
+	      cur_token = scan();
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+	    }
+	  /* finally if the entry is zero, we have an error */
+	  else if (act == 0)
+	    {
+	      /* call user syntax error reporting routine */
+	      syntax_error(cur_token);
+
+	      /* try to error recover */
+	      if (!error_recovery(false))
+		{
+		  /* if that fails give up with a fatal syntax error */
+		  unrecovered_syntax_error(cur_token);
+
+		  /* just in case that wasn't fatal enough, end parse */
+		  done_parsing();
+		} else {
+		  lhs_sym = (Symbol)stack.peek();
+		}
+	    }
+	}
+      return lhs_sym;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Write a debugging message to System.err for the debugging version 
+   *  of the parser. 
+   *
+   * @param mess the text of the debugging message.
+   */
+  public void debug_message(String mess)
+    {
+      System.err.println(mess);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Dump the parse stack for debugging purposes. */
+  public void dump_stack()
+    {
+      if (stack == null)
+	{
+	  debug_message("# Stack dump requested, but stack is null");
+	  return;
+	}
+
+      debug_message("============ Parse Stack Dump ============");
+
+      /* dump the stack */
+      for (int i=0; i<stack.size(); i++)
+	{
+	  debug_message("Symbol: " + ((Symbol)stack.elementAt(i)).sym +
+			" State: " + ((Symbol)stack.elementAt(i)).parse_state);
+	}
+      debug_message("==========================================");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for a reduce. 
+   *
+   * @param prod_num  the production we are reducing with.
+   * @param nt_num    the index of the LHS non terminal.
+   * @param rhs_size  the size of the RHS.
+   */
+  public void debug_reduce(int prod_num, int nt_num, int rhs_size)
+    {
+      debug_message("# Reduce with prod #" + prod_num + " [NT=" + nt_num + 
+	            ", " + "SZ=" + rhs_size + "]");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for shift. 
+   *
+   * @param shift_tkn the Symbol being shifted onto the stack.
+   */
+  public void debug_shift(Symbol shift_tkn)
+    {
+      debug_message("# Shift under term #" + shift_tkn.sym + 
+		    " to state #" + shift_tkn.parse_state);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for stack state. [CSA]
+   */
+  public void debug_stack() {
+      StringBuffer sb=new StringBuffer("## STACK:");
+      for (int i=0; i<stack.size(); i++) {
+	  Symbol s = (Symbol) stack.elementAt(i);
+	  sb.append(" <state "+s.parse_state+", sym "+s.sym+">");
+	  if ((i%3)==2 || (i==(stack.size()-1))) {
+	      debug_message(sb.toString());
+	      sb = new StringBuffer("         ");
+	  }
+      }
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Perform a parse with debugging output.  This does exactly the
+   *  same things as parse(), except that it calls debug_shift() and
+   *  debug_reduce() when shift and reduce moves are taken by the parser
+   *  and produces various other debugging messages.  
+   */
+  public Symbol debug_parse()
+    throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* set up direct reference to tables to drive the parser */
+      production_tab = production_table();
+      action_tab     = action_table();
+      reduce_tab     = reduce_table();
+
+      debug_message("# Initializing parser");
+
+      /* initialize the action encapsulation object */
+      init_actions();
+
+      /* do user initialization */
+      user_init();
+
+      /* the current Symbol */
+      cur_token = scan(); 
+
+      debug_message("# Current Symbol is #" + cur_token.sym);
+
+      /* push dummy Symbol with start state to get us underway */
+      stack.removeAllElements();
+      stack.push(new Symbol(0, start_state()));
+      tos = 0;
+
+      /* continue until we are told to stop */
+      for (_done_parsing = false; !_done_parsing; )
+	{
+	  /* Check current token for freshness. */
+	  if (cur_token.used_by_parser)
+	    throw new Error("Symbol recycling detected (fix your scanner).");
+
+	  /* current state is always on the top of the stack */
+	  //debug_stack();
+
+	  /* look up action out of the current state with the current input */
+	  act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_token.parse_state = act-1;
+	      cur_token.used_by_parser = true;
+	      debug_shift(cur_token);
+	      stack.push(cur_token);
+	      tos++;
+
+	      /* advance to the next Symbol */
+	      cur_token = scan();
+              debug_message("# Current token is " + cur_token);
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      debug_reduce((-act)-1, lhs_sym_num, handle_size);
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+	      debug_message("# Reduce rule: top state " +
+			     ((Symbol)stack.peek()).parse_state +
+			     ", lhs sym " + lhs_sym_num + " -> state " + act); 
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+
+	      debug_message("# Goto state #" + act);
+	    }
+	  /* finally if the entry is zero, we have an error */
+	  else if (act == 0)
+	    {
+	      /* call user syntax error reporting routine */
+	      syntax_error(cur_token);
+
+	      /* try to error recover */
+	      if (!error_recovery(true))
+		{
+		  /* if that fails give up with a fatal syntax error */
+		  unrecovered_syntax_error(cur_token);
+
+		  /* just in case that wasn't fatal enough, end parse */
+		  done_parsing();
+		} else {
+		  lhs_sym = (Symbol)stack.peek();
+		}
+	    }
+	}
+      return lhs_sym;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+  /* Error recovery code */
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Attempt to recover from a syntax error.  This returns false if recovery 
+   *  fails, true if it succeeds.  Recovery happens in 4 steps.  First we
+   *  pop the parse stack down to a point at which we have a shift out
+   *  of the top-most state on the error Symbol.  This represents the
+   *  initial error recovery configuration.  If no such configuration is
+   *  found, then we fail.  Next a small number of "lookahead" or "parse
+   *  ahead" Symbols are read into a buffer.  The size of this buffer is 
+   *  determined by error_sync_size() and determines how many Symbols beyond
+   *  the error must be matched to consider the recovery a success.  Next, 
+   *  we begin to discard Symbols in attempt to get past the point of error
+   *  to a point where we can continue parsing.  After each Symbol, we attempt 
+   *  to "parse ahead" though the buffered lookahead Symbols.  The "parse ahead"
+   *  process simulates that actual parse, but does not modify the real 
+   *  parser's configuration, nor execute any actions. If we can  parse all 
+   *  the stored Symbols without error, then the recovery is considered a 
+   *  success.  Once a successful recovery point is determined, we do an
+   *  actual parse over the stored input -- modifying the real parse 
+   *  configuration and executing all actions.  Finally, we return the the 
+   *  normal parser to continue with the overall parse.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean error_recovery(boolean debug)
+    throws java.lang.Exception
+    {
+      if (debug) debug_message("# Attempting error recovery");
+
+      /* first pop the stack back into a state that can shift on error and 
+	 do that shift (if that fails, we fail) */
+      if (!find_recovery_config(debug))
+	{
+	  if (debug) debug_message("# Error recovery fails");
+	  return false;
+	}
+
+      /* read ahead to create lookahead we can parse multiple times */
+      read_lookahead();
+
+      /* repeatedly try to parse forward until we make it the required dist */
+      for (;;)
+	{
+	  /* try to parse forward, if it makes it, bail out of loop */
+	  if (debug) debug_message("# Trying to parse ahead");
+	  if (try_parse_ahead(debug))
+	    {
+	      break;
+	    }
+
+	  /* if we are now at EOF, we have failed */
+	  if (lookahead[0].sym == EOF_sym()) 
+	    {
+	      if (debug) debug_message("# Error recovery fails at EOF");
+	      return false;
+	    }
+
+	  /* otherwise, we consume another Symbol and try again */
+	  // BUG FIX by Bruce Hutton
+	  // Computer Science Department, University of Auckland,
+	  // Auckland, New Zealand.
+	  // It is the first token that is being consumed, not the one 
+	  // we were up to parsing
+	  if (debug) 
+	      debug_message("# Consuming Symbol #" + lookahead[ 0 ].sym);
+	  restart_lookahead();
+	}
+
+      /* we have consumed to a point where we can parse forward */
+      if (debug) debug_message("# Parse-ahead ok, going back to normal parse");
+
+      /* do the real parse (including actions) across the lookahead */
+      parse_lookahead(debug);
+
+      /* we have success */
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if we can shift under the special error Symbol out of the 
+   *  state currently on the top of the (real) parse stack. 
+   */
+  protected boolean shift_under_error()
+    {
+      /* is there a shift under error Symbol */
+      return get_action(((Symbol)stack.peek()).parse_state, error_sym()) > 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Put the (real) parse stack into error recovery configuration by 
+   *  popping the stack down to a state that can shift on the special 
+   *  error Symbol, then doing the shift.  If no suitable state exists on 
+   *  the stack we return false 
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean find_recovery_config(boolean debug)
+    {
+      Symbol error_token;
+      int act;
+
+      if (debug) debug_message("# Finding recovery state on stack");
+
+      /* Remember the right-position of the top symbol on the stack */
+      int right_pos = ((Symbol)stack.peek()).right;
+      int left_pos  = ((Symbol)stack.peek()).left;
+
+      /* pop down until we can shift under error Symbol */
+      while (!shift_under_error())
+	{
+	  /* pop the stack */
+	  if (debug) 
+	    debug_message("# Pop stack by one, state was # " +
+	                  ((Symbol)stack.peek()).parse_state);
+          left_pos = ((Symbol)stack.pop()).left;	
+	  tos--;
+
+	  /* if we have hit bottom, we fail */
+	  if (stack.empty()) 
+	    {
+	      if (debug) debug_message("# No recovery state found on stack");
+	      return false;
+	    }
+	}
+
+      /* state on top of the stack can shift under error, find the shift */
+      act = get_action(((Symbol)stack.peek()).parse_state, error_sym());
+      if (debug) 
+	{
+	  debug_message("# Recover state found (#" + 
+			((Symbol)stack.peek()).parse_state + ")");
+	  debug_message("# Shifting on error to state #" + (act-1));
+	}
+
+      /* build and shift a special error Symbol */
+      error_token = new Symbol(error_sym(), left_pos, right_pos);
+      error_token.parse_state = act-1;
+      error_token.used_by_parser = true;
+      stack.push(error_token);
+      tos++;
+
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Lookahead Symbols used for attempting error recovery "parse aheads". */
+  protected Symbol lookahead[];
+
+  /** Position in lookahead input buffer used for "parse ahead". */
+  protected int lookahead_pos;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Read from input to establish our buffer of "parse ahead" lookahead 
+   *  Symbols. 
+   */
+  protected void read_lookahead() throws java.lang.Exception
+    {
+      /* create the lookahead array */
+      lookahead = new Symbol[error_sync_size()];
+
+      /* fill in the array */
+      for (int i = 0; i < error_sync_size(); i++)
+	{
+	  lookahead[i] = cur_token;
+	  cur_token = scan();
+	}
+
+      /* start at the beginning */
+      lookahead_pos = 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return the current lookahead in our error "parse ahead" buffer. */
+  protected Symbol cur_err_token() { return lookahead[lookahead_pos]; }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Advance to next "parse ahead" input Symbol. Return true if we have 
+   *  input to advance to, false otherwise. 
+   */
+  protected boolean advance_lookahead()
+    {
+      /* advance the input location */
+      lookahead_pos++;
+
+      /* return true if we didn't go off the end */
+      return lookahead_pos < error_sync_size();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Reset the parse ahead input to one Symbol past where we started error 
+   *  recovery (this consumes one new Symbol from the real input). 
+   */
+  protected void restart_lookahead() throws java.lang.Exception
+    {
+      /* move all the existing input over */
+      for (int i = 1; i < error_sync_size(); i++)
+	lookahead[i-1] = lookahead[i];
+
+      /* read a new Symbol into the last spot */
+      // BUG Fix by Bruce Hutton
+      // Computer Science Department, University of Auckland,
+      // Auckland, New Zealand. [applied 5-sep-1999 by csa]
+      // The following two lines were out of order!!
+      lookahead[error_sync_size()-1] = cur_token;
+      cur_token = scan();
+
+      /* reset our internal position marker */
+      lookahead_pos = 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do a simulated parse forward (a "parse ahead") from the current 
+   *  stack configuration using stored lookahead input and a virtual parse
+   *  stack.  Return true if we make it all the way through the stored 
+   *  lookahead input without error. This basically simulates the action of 
+   *  parse() using only our saved "parse ahead" input, and not executing any 
+   *  actions.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean try_parse_ahead(boolean debug)
+    throws java.lang.Exception
+    {
+      int act;
+      short lhs, rhs_size;
+
+      /* create a virtual stack from the real parse stack */
+      virtual_parse_stack vstack = new virtual_parse_stack(stack);
+
+      /* parse until we fail or get past the lookahead input */
+      for (;;)
+	{
+	  /* look up the action from the current state (on top of stack) */
+	  act = get_action(vstack.top(), cur_err_token().sym);
+
+	  /* if its an error, we fail */
+	  if (act == 0) return false;
+
+	  /* > 0 encodes a shift */
+	  if (act > 0)
+	    {
+	      /* push the new state on the stack */
+	      vstack.push(act-1);
+
+	      if (debug) debug_message("# Parse-ahead shifts Symbol #" + 
+		       cur_err_token().sym + " into state #" + (act-1));
+
+	      /* advance simulated input, if we run off the end, we are done */
+	      if (!advance_lookahead()) return true;
+	    }
+	  /* < 0 encodes a reduce */
+	  else
+	    {
+	      /* if this is a reduce with the start production we are done */
+	      if ((-act)-1 == start_production()) 
+		{
+		  if (debug) debug_message("# Parse-ahead accepts");
+		  return true;
+		}
+
+	      /* get the lhs Symbol and the rhs size */
+	      lhs = production_tab[(-act)-1][0];
+	      rhs_size = production_tab[(-act)-1][1];
+
+	      /* pop handle off the stack */
+	      for (int i = 0; i < rhs_size; i++)
+		vstack.pop();
+
+	      if (debug) 
+		debug_message("# Parse-ahead reduces: handle size = " + 
+	          rhs_size + " lhs = #" + lhs + " from state #" + vstack.top());
+
+	      /* look up goto and push it onto the stack */
+	      vstack.push(get_reduce(vstack.top(), lhs));
+	      if (debug) 
+		debug_message("# Goto state #" + vstack.top());
+	    }
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Parse forward using stored lookahead Symbols.  In this case we have
+   *  already verified that parsing will make it through the stored lookahead
+   *  Symbols and we are now getting back to the point at which we can hand
+   *  control back to the normal parser.  Consequently, this version of the
+   *  parser performs all actions and modifies the real parse configuration.  
+   *  This returns once we have consumed all the stored input or we accept.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected void parse_lookahead(boolean debug)
+    throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* restart the saved input at the beginning */
+      lookahead_pos = 0;
+
+      if (debug) 
+	{
+	  debug_message("# Reparsing saved input with actions");
+	  debug_message("# Current Symbol is #" + cur_err_token().sym);
+	  debug_message("# Current state is #" + 
+			((Symbol)stack.peek()).parse_state);
+	}
+
+      /* continue until we accept or have read all lookahead input */
+      while(!_done_parsing)
+	{
+	  /* current state is always on the top of the stack */
+
+	  /* look up action out of the current state with the current input */
+	  act = 
+	    get_action(((Symbol)stack.peek()).parse_state, cur_err_token().sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_err_token().parse_state = act-1;
+	      cur_err_token().used_by_parser = true;
+	      if (debug) debug_shift(cur_err_token());
+	      stack.push(cur_err_token());
+	      tos++;
+
+	      /* advance to the next Symbol, if there is none, we are done */
+	      if (!advance_lookahead()) 
+		{
+		  if (debug) debug_message("# Completed reparse");
+
+		  /* scan next Symbol so we can continue parse */
+		  // BUGFIX by Chris Harris <ckharris@ucsd.edu>:
+		  //   correct a one-off error by commenting out
+		  //   this next line.
+		  /*cur_token = scan();*/
+
+		  /* go back to normal parser */
+		  return;
+		}
+	      
+	      if (debug) 
+		debug_message("# Current Symbol is #" + cur_err_token().sym);
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      if (debug) debug_reduce((-act)-1, lhs_sym_num, handle_size);
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+	       
+	      if (debug) debug_message("# Goto state #" + act);
+
+	    }
+	  /* finally if the entry is zero, we have an error 
+	     (shouldn't happen here, but...)*/
+	  else if (act == 0)
+	    {
+	      report_fatal_error("Syntax error", lhs_sym);
+	      return;
+	    }
+	}
+
+	
+    }
+
+  /*-----------------------------------------------------------*/
+
+  /** Utility function: unpacks parse tables from strings */
+  protected static short[][] unpackFromStrings(String[] sa)
+    {
+      // Concatanate initialization strings.
+      StringBuffer sb = new StringBuffer(sa[0]);
+      for (int i=1; i<sa.length; i++)
+	sb.append(sa[i]);
+      int n=0; // location in initialization string
+      int size1 = (((int)sb.charAt(n))<<16) | ((int)sb.charAt(n+1)); n+=2;
+      short[][] result = new short[size1][];
+      for (int i=0; i<size1; i++) {
+        int size2 = (((int)sb.charAt(n))<<16) | ((int)sb.charAt(n+1)); n+=2;
+        result[i] = new short[size2];
+        for (int j=0; j<size2; j++)
+          result[i][j] = (short) (sb.charAt(n++)-2);
+      }
+      return result;
+    }
+}
+
diff --git a/open-nars/java_cup/runtime/virtual_parse_stack.java b/open-nars/java_cup/runtime/virtual_parse_stack.java
new file mode 100644
index 0000000..a4386aa
--- /dev/null
+++ b/open-nars/java_cup/runtime/virtual_parse_stack.java
@@ -0,0 +1,145 @@
+
+package java_cup.runtime;
+
+import java.util.Stack;
+
+/** This class implements a temporary or "virtual" parse stack that 
+ *  replaces the top portion of the actual parse stack (the part that 
+ *  has been changed by some set of operations) while maintaining its
+ *  original contents.  This data structure is used when the parse needs 
+ *  to "parse ahead" to determine if a given error recovery attempt will 
+ *  allow the parse to continue far enough to consider it successful.  Once 
+ *  success or failure of parse ahead is determined the system then 
+ *  reverts to the original parse stack (which has not actually been 
+ *  modified).  Since parse ahead does not execute actions, only parse
+ *  state is maintained on the virtual stack, not full Symbol objects.
+ *
+ * @see     java_cup.runtime.lr_parser
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public class virtual_parse_stack {
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constructor to build a virtual stack out of a real stack. */
+  public virtual_parse_stack(Stack shadowing_stack) throws java.lang.Exception
+    {
+      /* sanity check */
+      if (shadowing_stack == null)
+	throw new Exception(
+	  "Internal parser error: attempt to create null virtual stack");
+
+      /* set up our internals */
+      real_stack = shadowing_stack;
+      vstack     = new Stack();
+      real_next  = 0;
+
+      /* get one element onto the virtual portion of the stack */
+      get_from_real();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** The real stack that we shadow.  This is accessed when we move off
+   *  the bottom of the virtual portion of the stack, but is always left
+   *  unmodified.
+   */
+  protected Stack real_stack;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Top of stack indicator for where we leave off in the real stack.
+   *  This is measured from top of stack, so 0 would indicate that no
+   *  elements have been "moved" from the real to virtual stack. 
+   */
+  protected int real_next;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The virtual top portion of the stack.  This stack contains Integer
+   *  objects with state numbers.  This stack shadows the top portion
+   *  of the real stack within the area that has been modified (via operations
+   *  on the virtual stack).  When this portion of the stack becomes empty we 
+   *  transfer elements from the underlying stack onto this stack. 
+   */
+  protected Stack vstack;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Transfer an element from the real to the virtual stack.  This assumes 
+   *  that the virtual stack is currently empty.  
+   */
+  protected void get_from_real()
+    {
+      Symbol stack_sym;
+
+      /* don't transfer if the real stack is empty */
+      if (real_next >= real_stack.size()) return;
+
+      /* get a copy of the first Symbol we have not transfered */
+      stack_sym = (Symbol)real_stack.elementAt(real_stack.size()-1-real_next);
+
+      /* record the transfer */
+      real_next++;
+
+      /* put the state number from the Symbol onto the virtual stack */
+      vstack.push(new Integer(stack_sym.parse_state));
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indicate whether the stack is empty. */
+  public boolean empty()
+    {
+      /* if vstack is empty then we were unable to transfer onto it and 
+	 the whole thing is empty. */
+      return vstack.empty();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+      
+  /** Return value on the top of the stack (without popping it). */
+  public int top() throws java.lang.Exception
+    {
+      if (vstack.empty())
+	throw new Exception(
+		  "Internal parser error: top() called on empty virtual stack");
+
+      return ((Integer)vstack.peek()).intValue();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Pop the stack. */
+  public void pop() throws java.lang.Exception
+    {
+      if (vstack.empty())
+	throw new Exception(
+		  "Internal parser error: pop from empty virtual stack");
+
+      /* pop it */
+      vstack.pop();
+
+      /* if we are now empty transfer an element (if there is one) */
+      if (vstack.empty())
+        get_from_real();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Push a state number onto the stack. */
+  public void push(int state_num)
+    {
+      vstack.push(new Integer(state_num));
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/shift_action.java b/open-nars/java_cup/shift_action.java
new file mode 100644
index 0000000..33fc17a
--- /dev/null
+++ b/open-nars/java_cup/shift_action.java
@@ -0,0 +1,82 @@
+
+package java_cup;
+
+/** This class represents a shift action within the parse table. 
+ *  The action simply stores the state that it shifts to and responds 
+ *  to queries about its type.
+ *
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class shift_action extends parse_action {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Simple constructor. 
+   * @param shft_to the state that this action shifts to.
+   */
+  public shift_action(lalr_state shft_to) throws internal_error
+    {
+      /* sanity check */
+      if (shft_to == null)
+	throw new internal_error(
+	  "Attempt to create a shift_action to a null state");
+
+      _shift_to = shft_to;
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The state we shift to. */
+  protected lalr_state _shift_to;
+
+  /** The state we shift to. */
+  public lalr_state shift_to() {return _shift_to;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Quick access to type of action. */
+  public int kind() {return SHIFT;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality test. */
+  public boolean equals(shift_action other)
+    {
+      return other != null && other.shift_to() == shift_to();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality test. */
+  public boolean equals(Object other)
+    {
+      if (other instanceof shift_action)
+	return equals((shift_action)other);
+      else
+       return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute a hash code. */
+  public int hashCode()
+    {
+      /* use the hash code of the state we are shifting to */
+      return shift_to().hashCode();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString() {return "SHIFT(to state " + shift_to().index() + ")";}
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/simple_calc/Main.java b/open-nars/java_cup/simple_calc/Main.java
new file mode 100644
index 0000000..21ff5aa
--- /dev/null
+++ b/open-nars/java_cup/simple_calc/Main.java
@@ -0,0 +1,32 @@
+// Driver for parser
+
+package java_cup.simple_calc;
+
+import java_cup.simple_calc.parser;
+import java_cup.runtime.Symbol;
+
+class Main {
+
+  static boolean do_debug_parse = false;
+
+  static public void main(String[] args) throws java.io.IOException {
+
+      /* create a parsing object */
+      parser parser_obj = new parser(new scanner());
+
+      /* open input files, etc. here */
+      Symbol parse_tree = null;
+
+      try {
+        if (do_debug_parse)
+          parse_tree = parser_obj.debug_parse();
+        else
+          parse_tree = parser_obj.parse();
+      } catch (Exception e) {
+        /* do cleanup here -- possibly rethrow e */
+      } finally {
+	/* do close out here */
+      }
+  }
+}
+
diff --git a/open-nars/java_cup/simple_calc/parser.cup b/open-nars/java_cup/simple_calc/parser.cup
new file mode 100644
index 0000000..a88d900
--- /dev/null
+++ b/open-nars/java_cup/simple_calc/parser.cup
@@ -0,0 +1,55 @@
+// JavaCup specification for a simple expression evaluator (w/ actions)
+
+package java_cup.simple_calc;
+
+import java_cup.runtime.*;
+
+/* Terminals (tokens returned by the scanner). */
+terminal           SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD;
+terminal           UMINUS, LPAREN, RPAREN;
+terminal Integer   NUMBER;
+
+/* Non terminals */
+non terminal Object     expr_list, expr_part;
+non terminal Integer    expr;
+
+/* Precedences */
+precedence left PLUS, MINUS;
+precedence left TIMES, DIVIDE, MOD;
+precedence left UMINUS, LPAREN;
+
+/* The grammar */
+expr_list ::= expr_list expr_part 
+	      | 
+              expr_part;
+
+expr_part ::= expr:e 
+	      {: System.out.println("= " + e); :} 
+              SEMI              
+	      ;
+
+expr      ::= expr:e1 PLUS expr:e2    
+	      {: RESULT = new Integer(e1.intValue() + e2.intValue()); :} 
+	      | 
+              expr:e1 MINUS expr:e2    
+              {: RESULT = new Integer(e1.intValue() - e2.intValue()); :} 
+	      | 
+              expr:e1 TIMES expr:e2 
+	      {: RESULT = new Integer(e1.intValue() * e2.intValue()); :} 
+	      | 
+              expr:e1 DIVIDE expr:e2 
+	      {: RESULT = new Integer(e1.intValue() / e2.intValue()); :} 
+	      | 
+              expr:e1 MOD expr:e2 
+	      {: RESULT = new Integer(e1.intValue() % e2.intValue()); :} 
+	      | 
+              NUMBER:n                 
+	      {: RESULT = n; :} 
+	      | 
+              MINUS expr:e             
+	      {: RESULT = new Integer(0 - e.intValue()); :} 
+	      %prec UMINUS
+	      | 
+              LPAREN expr:e RPAREN     
+	      {: RESULT = e; :} 
+	      ;
diff --git a/open-nars/java_cup/simple_calc/parser.java b/open-nars/java_cup/simple_calc/parser.java
new file mode 100644
index 0000000..d6003c7
--- /dev/null
+++ b/open-nars/java_cup/simple_calc/parser.java
@@ -0,0 +1,318 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Sun Jul 25 13:36:02 EDT 1999
+//----------------------------------------------------
+
+package java_cup.simple_calc;
+
+import java_cup.runtime.*;
+
+/** CUP v0.10k generated parser.
+  * @version Sun Jul 25 13:36:02 EDT 1999
+  */
+public class parser extends java_cup.runtime.lr_parser {
+
+  /** Default constructor. */
+  public parser() {super();}
+
+  /** Constructor which sets the default scanner. */
+  public parser(java_cup.runtime.Scanner s) {super(s);}
+
+  /** Production table. */
+  protected static final short _production_table[][] = 
+    unpackFromStrings(new String[] {
+    "\000\015\000\002\003\004\000\002\002\004\000\002\003" +
+    "\003\000\002\006\002\000\002\004\005\000\002\005\005" +
+    "\000\002\005\005\000\002\005\005\000\002\005\005\000" +
+    "\002\005\005\000\002\005\003\000\002\005\004\000\002" +
+    "\005\005" });
+
+  /** Access to production table. */
+  public short[][] production_table() {return _production_table;}
+
+  /** Parse-action table. */
+  protected static final short[][] _action_table = 
+    unpackFromStrings(new String[] {
+    "\000\030\000\010\006\004\013\011\015\005\001\002\000" +
+    "\010\006\004\013\011\015\005\001\002\000\020\004\ufff7" +
+    "\005\ufff7\006\ufff7\007\ufff7\010\ufff7\011\ufff7\014\ufff7\001" +
+    "\002\000\012\002\uffff\006\uffff\013\uffff\015\uffff\001\002" +
+    "\000\016\004\ufffe\005\016\006\014\007\020\010\017\011" +
+    "\013\001\002\000\012\002\027\006\004\013\011\015\005" +
+    "\001\002\000\010\006\004\013\011\015\005\001\002\000" +
+    "\016\005\016\006\014\007\020\010\017\011\013\014\015" +
+    "\001\002\000\010\006\004\013\011\015\005\001\002\000" +
+    "\010\006\004\013\011\015\005\001\002\000\020\004\ufff5" +
+    "\005\ufff5\006\ufff5\007\ufff5\010\ufff5\011\ufff5\014\ufff5\001" +
+    "\002\000\010\006\004\013\011\015\005\001\002\000\010" +
+    "\006\004\013\011\015\005\001\002\000\010\006\004\013" +
+    "\011\015\005\001\002\000\020\004\ufffa\005\ufffa\006\ufffa" +
+    "\007\ufffa\010\ufffa\011\ufffa\014\ufffa\001\002\000\020\004" +
+    "\ufff9\005\ufff9\006\ufff9\007\ufff9\010\ufff9\011\ufff9\014\ufff9" +
+    "\001\002\000\020\004\ufffc\005\ufffc\006\ufffc\007\020\010" +
+    "\017\011\013\014\ufffc\001\002\000\020\004\ufffb\005\ufffb" +
+    "\006\ufffb\007\020\010\017\011\013\014\ufffb\001\002\000" +
+    "\020\004\ufff8\005\ufff8\006\ufff8\007\ufff8\010\ufff8\011\ufff8" +
+    "\014\ufff8\001\002\000\012\002\001\006\001\013\001\015" +
+    "\001\001\002\000\004\002\000\001\002\000\004\004\031" +
+    "\001\002\000\012\002\ufffd\006\ufffd\013\ufffd\015\ufffd\001" +
+    "\002\000\020\004\ufff6\005\ufff6\006\ufff6\007\ufff6\010\ufff6" +
+    "\011\ufff6\014\ufff6\001\002" });
+
+  /** Access to parse-action table. */
+  public short[][] action_table() {return _action_table;}
+
+  /** <code>reduce_goto</code> table. */
+  protected static final short[][] _reduce_table = 
+    unpackFromStrings(new String[] {
+    "\000\030\000\010\003\007\004\005\005\006\001\001\000" +
+    "\004\005\031\001\001\000\002\001\001\000\002\001\001" +
+    "\000\004\006\027\001\001\000\006\004\025\005\006\001" +
+    "\001\000\004\005\011\001\001\000\002\001\001\000\004" +
+    "\005\024\001\001\000\004\005\023\001\001\000\002\001" +
+    "\001\000\004\005\022\001\001\000\004\005\021\001\001" +
+    "\000\004\005\020\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001" });
+
+  /** Access to <code>reduce_goto</code> table. */
+  public short[][] reduce_table() {return _reduce_table;}
+
+  /** Instance of action encapsulation class. */
+  protected CUP$parser$actions action_obj;
+
+  /** Action encapsulation object initializer. */
+  protected void init_actions()
+    {
+      action_obj = new CUP$parser$actions(this);
+    }
+
+  /** Invoke a user supplied parse action. */
+  public java_cup.runtime.Symbol do_action(
+    int                        act_num,
+    java_cup.runtime.lr_parser parser,
+    java.util.Stack            stack,
+    int                        top)
+    throws java.lang.Exception
+  {
+    /* call code in generated class */
+    return action_obj.CUP$parser$do_action(act_num, parser, stack, top);
+  }
+
+  /** Indicates start state. */
+  public int start_state() {return 0;}
+  /** Indicates start production. */
+  public int start_production() {return 1;}
+
+  /** <code>EOF</code> Symbol index. */
+  public int EOF_sym() {return 0;}
+
+  /** <code>error</code> Symbol index. */
+  public int error_sym() {return 1;}
+
+}
+
+/** Cup generated class to encapsulate user supplied action code.*/
+class CUP$parser$actions {
+  private final parser parser;
+
+  /** Constructor */
+  CUP$parser$actions(parser parser) {
+    this.parser = parser;
+  }
+
+  /** Method with the actual generated action code. */
+  public final java_cup.runtime.Symbol CUP$parser$do_action(
+    int                        CUP$parser$act_num,
+    java_cup.runtime.lr_parser CUP$parser$parser,
+    java.util.Stack            CUP$parser$stack,
+    int                        CUP$parser$top)
+    throws java.lang.Exception
+    {
+      /* Symbol object for return from actions */
+      java_cup.runtime.Symbol CUP$parser$result;
+
+      /* select the action based on the action number */
+      switch (CUP$parser$act_num)
+        {
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 12: // expr ::= LPAREN expr RPAREN 
+            {
+              Integer RESULT = null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		Integer e = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		 RESULT = e; 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 11: // expr ::= MINUS expr 
+            {
+              Integer RESULT = null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(0 - e.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 10: // expr ::= NUMBER 
+            {
+              Integer RESULT = null;
+		int nleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int nright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer n = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = n; 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 9: // expr ::= expr MOD expr 
+            {
+              Integer RESULT = null;
+		int e1left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int e1right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int e2left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int e2right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(e1.intValue() % e2.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 8: // expr ::= expr DIVIDE expr 
+            {
+              Integer RESULT = null;
+		int e1left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int e1right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int e2left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int e2right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(e1.intValue() / e2.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 7: // expr ::= expr TIMES expr 
+            {
+              Integer RESULT = null;
+		int e1left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int e1right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int e2left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int e2right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(e1.intValue() * e2.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 6: // expr ::= expr MINUS expr 
+            {
+              Integer RESULT = null;
+		int e1left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int e1right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int e2left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int e2right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(e1.intValue() - e2.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 5: // expr ::= expr PLUS expr 
+            {
+              Integer RESULT = null;
+		int e1left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int e1right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e1 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+		int e2left = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int e2right = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e2 = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+		 RESULT = new Integer(e1.intValue() + e2.intValue()); 
+              CUP$parser$result = new java_cup.runtime.Symbol(3/*expr*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 4: // expr_part ::= expr NT$0 SEMI 
+            {
+              Object RESULT = null;
+              // propagate RESULT from NT$0
+              if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null )
+                RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		int eleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right;
+		Integer e = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(2/*expr_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 3: // NT$0 ::= 
+            {
+              Object RESULT = null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right;
+		Integer e = (Integer)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value;
+ System.out.println("= " + e); 
+              CUP$parser$result = new java_cup.runtime.Symbol(4/*NT$0*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 2: // expr_list ::= expr_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*expr_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 1: // $START ::= expr_list EOF 
+            {
+              Object RESULT = null;
+		int start_valleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left;
+		int start_valright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right;
+		Object start_val = (Object)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value;
+		RESULT = start_val;
+              CUP$parser$result = new java_cup.runtime.Symbol(0/*$START*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          /* ACCEPT */
+          CUP$parser$parser.done_parsing();
+          return CUP$parser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 0: // expr_list ::= expr_list expr_part 
+            {
+              Object RESULT = null;
+
+              CUP$parser$result = new java_cup.runtime.Symbol(1/*expr_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT);
+            }
+          return CUP$parser$result;
+
+          /* . . . . . .*/
+          default:
+            throw new Exception(
+               "Invalid action number found in internal parse table");
+
+        }
+    }
+}
+
diff --git a/open-nars/java_cup/simple_calc/scanner.java b/open-nars/java_cup/simple_calc/scanner.java
new file mode 100644
index 0000000..f8f850a
--- /dev/null
+++ b/open-nars/java_cup/simple_calc/scanner.java
@@ -0,0 +1,63 @@
+// Simple Example Scanner Class
+
+package java_cup.simple_calc;
+
+import java_cup.runtime.Symbol;
+
+public class scanner implements java_cup.runtime.Scanner {
+  final java.io.InputStream instream;
+
+  public scanner(java.io.InputStream is) throws java.io.IOException {
+    instream = is;
+  }
+  public scanner() throws java.io.IOException { this(System.in); }
+
+  /* single lookahead character */
+  protected int next_char = -2;
+
+  /* advance input by one character */
+  protected void advance()
+    throws java.io.IOException
+    { next_char = instream.read(); }
+
+  /* initialize the scanner */
+  private void init()
+    throws java.io.IOException
+    { advance(); }
+
+  /* recognize and return the next complete token */
+  public Symbol next_token()
+    throws java.io.IOException
+    {
+      if (next_char==-2) init(); // set stuff up first time we are called.
+      for (;;)
+        switch (next_char)
+	  {
+	    case '0': case '1': case '2': case '3': case '4': 
+	    case '5': case '6': case '7': case '8': case '9': 
+	      /* parse a decimal integer */
+	      int i_val = 0;
+	      do {
+	        i_val = i_val * 10 + (next_char - '0');
+	        advance();
+	      } while (next_char >= '0' && next_char <= '9');
+	    return new Symbol(sym.NUMBER, new Integer(i_val));
+
+	    case ';': advance(); return new Symbol(sym.SEMI);
+	    case '+': advance(); return new Symbol(sym.PLUS);
+	    case '-': advance(); return new Symbol(sym.MINUS);
+	    case '*': advance(); return new Symbol(sym.TIMES);
+	    case '/': advance(); return new Symbol(sym.DIVIDE);
+	    case '%': advance(); return new Symbol(sym.MOD);
+	    case '(': advance(); return new Symbol(sym.LPAREN);
+	    case ')': advance(); return new Symbol(sym.RPAREN);
+
+	    case -1: return new Symbol(sym.EOF);
+
+	    default: 
+	      /* in this simple scanner we just ignore everything else */
+	      advance();
+	    break;
+	  }
+    }
+};
diff --git a/open-nars/java_cup/simple_calc/sym.java b/open-nars/java_cup/simple_calc/sym.java
new file mode 100644
index 0000000..2584f2f
--- /dev/null
+++ b/open-nars/java_cup/simple_calc/sym.java
@@ -0,0 +1,25 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Sun Jul 25 13:36:02 EDT 1999
+//----------------------------------------------------
+
+package java_cup.simple_calc;
+
+/** CUP generated class containing symbol constants. */
+public class sym {
+  /* terminals */
+  public static final int SEMI = 2;
+  public static final int EOF = 0;
+  public static final int DIVIDE = 6;
+  public static final int NUMBER = 11;
+  public static final int error = 1;
+  public static final int UMINUS = 8;
+  public static final int MINUS = 4;
+  public static final int TIMES = 5;
+  public static final int LPAREN = 9;
+  public static final int RPAREN = 10;
+  public static final int MOD = 7;
+  public static final int PLUS = 3;
+}
+
diff --git a/open-nars/java_cup/sym.java b/open-nars/java_cup/sym.java
new file mode 100644
index 0000000..9810a3d
--- /dev/null
+++ b/open-nars/java_cup/sym.java
@@ -0,0 +1,43 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.10k
+// Sun Jul 25 13:35:26 EDT 1999
+//----------------------------------------------------
+
+package java_cup;
+
+/** CUP generated class containing symbol constants. */
+public class sym {
+  /* terminals */
+  public static final int NON = 8;
+  public static final int NONTERMINAL = 27;
+  public static final int STAR = 15;
+  public static final int SEMI = 13;
+  public static final int CODE = 4;
+  public static final int EOF = 0;
+  public static final int NONASSOC = 23;
+  public static final int LEFT = 21;
+  public static final int PACKAGE = 2;
+  public static final int COLON = 17;
+  public static final int WITH = 11;
+  public static final int IMPORT = 3;
+  public static final int error = 1;
+  public static final int COLON_COLON_EQUALS = 18;
+  public static final int COMMA = 14;
+  public static final int DOT = 16;
+  public static final int SCAN = 10;
+  public static final int ID = 28;
+  public static final int INIT = 9;
+  public static final int PARSER = 6;
+  public static final int TERMINAL = 7;
+  public static final int PRECEDENCE = 20;
+  public static final int LBRACK = 25;
+  public static final int RBRACK = 26;
+  public static final int PERCENT_PREC = 24;
+  public static final int START = 12;
+  public static final int RIGHT = 22;
+  public static final int BAR = 19;
+  public static final int ACTION = 5;
+  public static final int CODE_STRING = 29;
+}
+
diff --git a/open-nars/java_cup/symbol.java b/open-nars/java_cup/symbol.java
new file mode 100644
index 0000000..94d8b7d
--- /dev/null
+++ b/open-nars/java_cup/symbol.java
@@ -0,0 +1,107 @@
+package java_cup;
+
+/** This abstract class serves as the base class for grammar symbols (i.e.,
+ * both terminals and non-terminals).  Each symbol has a name string, and
+ * a string giving the type of object that the symbol will be represented by
+ * on the runtime parse stack.  In addition, each symbol maintains a use count
+ * in order to detect symbols that are declared but never used, and an index
+ * number that indicates where it appears in parse tables (index numbers are
+ * unique within terminals or non terminals, but not across both).
+ *
+ * @see     java_cup.terminal
+ * @see     java_cup.non_terminal
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+public abstract class symbol {
+   /*-----------------------------------------------------------*/
+   /*--- Constructor(s) ----------------------------------------*/
+   /*-----------------------------------------------------------*/
+
+   /** Full constructor.
+    * @param nm the name of the symbol.
+    * @param tp a string with the type name.
+    */
+   public symbol(String nm, String tp)
+     {
+       /* sanity check */
+       if (nm == null) nm = "";
+
+       /* apply default if no type given */
+       if (tp == null) tp = "Object";
+
+       _name = nm;
+       _stack_type = tp;
+     }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+   /** Constructor with default type. 
+    * @param nm the name of the symbol.
+    */
+   public symbol(String nm)
+     {
+       this(nm, null);
+     }
+
+   /*-----------------------------------------------------------*/
+   /*--- (Access to) Instance Variables ------------------------*/
+   /*-----------------------------------------------------------*/
+
+   /** String for the human readable name of the symbol. */
+   protected String _name; 
+ 
+   /** String for the human readable name of the symbol. */
+   public String name() {return _name;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+   /** String for the type of object used for the symbol on the parse stack. */
+   protected String _stack_type;
+
+   /** String for the type of object used for the symbol on the parse stack. */
+   public String stack_type() {return _stack_type;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+   /** Count of how many times the symbol appears in productions. */
+   protected int _use_count = 0;
+
+   /** Count of how many times the symbol appears in productions. */
+   public int use_count() {return _use_count;}
+
+   /** Increment the use count. */ 
+   public void note_use() {_use_count++;}
+ 
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+ 
+  /** Index of this symbol (terminal or non terminal) in the parse tables.
+   *  Note: indexes are unique among terminals and unique among non terminals,
+   *  however, a terminal may have the same index as a non-terminal, etc. 
+   */
+   protected int _index;
+ 
+  /** Index of this symbol (terminal or non terminal) in the parse tables.
+   *  Note: indexes are unique among terminals and unique among non terminals,
+   *  however, a terminal may have the same index as a non-terminal, etc. 
+   */
+   public int index() {return _index;}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indicate if this is a non-terminal.  Here in the base class we
+   *  don't know, so this is abstract.  
+   */
+  public abstract boolean is_non_term();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      return name();
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/symbol_part.java b/open-nars/java_cup/symbol_part.java
new file mode 100644
index 0000000..9142b5f
--- /dev/null
+++ b/open-nars/java_cup/symbol_part.java
@@ -0,0 +1,100 @@
+package java_cup;
+
+/** This class represents a part of a production which is a symbol (terminal
+ *  or non terminal).  This simply maintains a reference to the symbol in 
+ *  question.
+ *
+ * @see     java_cup.production
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class symbol_part extends production_part {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor. 
+   * @param sym the symbol that this part is made up of.
+   * @param lab an optional label string for the part.
+   */
+  public symbol_part(symbol sym, String lab) throws internal_error
+    {
+      super(lab);
+
+      if (sym == null)
+	throw new internal_error(
+	  "Attempt to construct a symbol_part with a null symbol");
+      _the_symbol = sym;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with no label. 
+   * @param sym the symbol that this part is made up of.
+   */
+  public symbol_part(symbol sym) throws internal_error
+    {
+      this(sym,null);
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The symbol that this part is made up of. */
+  protected symbol _the_symbol;
+
+  /** The symbol that this part is made up of. */
+  public symbol the_symbol() {return _the_symbol;}
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Respond that we are not an action part. */
+  public boolean is_action() { return false; }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(symbol_part other)
+    {
+      return other != null && super.equals(other) && 
+	     the_symbol().equals(other.the_symbol());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof symbol_part))
+	return false;
+      else
+	return equals((symbol_part)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Produce a hash code. */
+  public int hashCode()
+    {
+      return super.hashCode() ^ 
+	     (the_symbol()==null ? 0 : the_symbol().hashCode());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      if (the_symbol() != null)
+	return super.toString() + the_symbol();
+      else
+	return super.toString() + "$$MISSING-SYMBOL$$";
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/symbol_set.java b/open-nars/java_cup/symbol_set.java
new file mode 100644
index 0000000..a1aec10
--- /dev/null
+++ b/open-nars/java_cup/symbol_set.java
@@ -0,0 +1,231 @@
+
+package java_cup;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/** This class represents a set of symbols and provides a series of 
+ *  set operations to manipulate them.
+ *
+ * @see     java_cup.symbol
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class symbol_set {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constructor for an empty set. */
+  public symbol_set() { }
+
+  /** Constructor for cloning from another set. 
+   * @param other the set we are cloning from.
+   */
+  public symbol_set(symbol_set other) throws internal_error
+    {
+      not_null(other);
+      _all = (Hashtable)other._all.clone();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** A hash table to hold the set. Symbols are keyed using their name string. 
+   */
+  protected Hashtable _all = new Hashtable(11);
+
+  /** Access to all elements of the set. */
+  public Enumeration all() {return _all.elements();}
+
+  /** size of the set */
+  public int size() {return _all.size();}
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Helper function to test for a null object and throw an exception
+   *  if one is found.
+   * @param obj the object we are testing.
+   */
+  protected void not_null(Object obj) throws internal_error
+    {
+      if (obj == null) 
+	throw new internal_error("Null object used in set operation");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if the set contains a particular symbol. 
+   * @param sym the symbol we are looking for.
+   */
+  public boolean contains(symbol sym) {return _all.containsKey(sym.name());}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if this set is an (improper) subset of another. 
+   * @param other the set we are testing against.
+   */
+  public boolean is_subset_of(symbol_set other) throws internal_error
+    {
+      not_null(other);
+
+      /* walk down our set and make sure every element is in the other */
+      for (Enumeration e = all(); e.hasMoreElements(); )
+	if (!other.contains((symbol)e.nextElement()))
+	  return false;
+
+      /* they were all there */
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if this set is an (improper) superset of another. 
+   * @param other the set we are are testing against.
+   */
+  public boolean is_superset_of(symbol_set other) throws internal_error
+    {
+      not_null(other);
+      return other.is_subset_of(this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a single symbol to the set.  
+   * @param sym the symbol we are adding.
+   * @return true if this changes the set.
+   */
+  public boolean add(symbol sym) throws internal_error
+    {
+      Object previous;
+
+      not_null(sym); 
+
+      /* put the object in */
+      previous = _all.put(sym.name(),sym);
+
+      /* if we had a previous, this is no change */
+      return previous == null;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove a single symbol if it is in the set. 
+   * @param sym the symbol we are removing.
+   */
+  public void remove(symbol sym) throws internal_error
+    {
+      not_null(sym); 
+      _all.remove(sym.name());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add (union) in a complete set.  
+   * @param other the set we are adding in.
+   * @return true if this changes the set. 
+   */
+  public boolean add(symbol_set other) throws internal_error
+    {
+      boolean result = false;
+
+      not_null(other);
+
+      /* walk down the other set and do the adds individually */
+      for (Enumeration e = other.all(); e.hasMoreElements(); )
+	result = add((symbol)e.nextElement()) || result;
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove (set subtract) a complete set. 
+   * @param other the set we are removing.
+   */
+  public void remove(symbol_set other) throws internal_error
+    {
+      not_null(other);
+
+      /* walk down the other set and do the removes individually */
+      for (Enumeration e = other.all(); e.hasMoreElements(); )
+	remove((symbol)e.nextElement());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(symbol_set other) 
+    {
+      if (other == null || other.size() != size()) return false;
+
+      /* once we know they are the same size, then improper subset does test */
+      try {
+        return is_subset_of(other);
+      } catch (internal_error e) {
+	/* can't throw the error (because super class doesn't), so we crash */
+	e.crash();
+	return false;
+      }
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof symbol_set))
+	return false;
+      else
+	return equals((symbol_set)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Compute a hash code. */
+  public int hashCode()
+    {
+      int result = 0;
+      int cnt;
+      Enumeration e;
+
+      /* hash together codes from at most first 5 elements */
+      for (e = all(), cnt=0 ; e.hasMoreElements() && cnt<5; cnt++)
+	result ^= ((symbol)e.nextElement()).hashCode();
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      String result;
+      boolean comma_flag;
+
+      result = "{";
+      comma_flag = false;
+      for (Enumeration e = all(); e.hasMoreElements(); )
+	{
+	  if (comma_flag)
+	    result += ", ";
+	  else
+	    comma_flag = true;
+
+	  result += ((symbol)e.nextElement()).name();
+	}
+      result += "}";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
+
diff --git a/open-nars/java_cup/terminal.java b/open-nars/java_cup/terminal.java
new file mode 100644
index 0000000..e1a40aa
--- /dev/null
+++ b/open-nars/java_cup/terminal.java
@@ -0,0 +1,169 @@
+package java_cup;
+
+import java_cup.assoc;
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/** This class represents a terminal symbol in the grammar.  Each terminal 
+ *  has a textual name, an index, and a string which indicates the type of 
+ *  object it will be implemented with at runtime (i.e. the class of object 
+ *  that will be returned by the scanner and pushed on the parse stack to 
+ *  represent it). 
+ *
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+public class terminal extends symbol {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Full constructor.
+   * @param nm the name of the terminal.
+   * @param tp the type of the terminal.
+   */
+  public terminal(String nm, String tp, int precedence_side, int precedence_num) 
+    {
+      /* superclass does most of the work */
+      super(nm, tp);
+
+      /* add to set of all terminals and check for duplicates */
+      Object conflict = _all.put(nm,this);
+      if (conflict != null)
+	// can't throw an execption here because this is used in static 
+	// initializers, so we do a crash instead
+	// was:
+	// throw new internal_error("Duplicate terminal (" + nm + ") created");
+	(new internal_error("Duplicate terminal (" + nm + ") created")).crash();
+
+      /* assign a unique index */
+      _index = next_index++;
+
+      /* set the precedence */
+      _precedence_num = precedence_num;
+      _precedence_side = precedence_side;
+
+      /* add to by_index set */
+      _all_by_index.put(new Integer(_index), this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor for non-precedented terminal
+    */ 
+
+  public terminal(String nm, String tp) 
+    {
+      this(nm, tp, assoc.no_prec, -1);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor with default type. 
+   * @param nm the name of the terminal.
+   */
+  public terminal(String nm) 
+    {
+      this(nm, null);
+    }
+
+  /*-----------------------------------------------------------*/
+  /*-------------------  Class Variables  ---------------------*/
+  /*-----------------------------------------------------------*/
+
+  private int _precedence_num;
+  private int _precedence_side;
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Table of all terminals.  Elements are stored using name strings as 
+   *  the key 
+   */
+  protected static Hashtable _all = new Hashtable();
+
+  /** Access to all terminals. */
+  public static Enumeration all() {return _all.elements();}
+
+  /** Lookup a terminal by name string. */ 
+  public static terminal find(String with_name)
+    {
+      if (with_name == null)
+	return null;
+      else 
+	return (terminal)_all.get(with_name);
+    }
+
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Table of all terminals indexed by their index number. */
+  protected static Hashtable _all_by_index = new Hashtable();
+
+  /** Lookup a terminal by index. */
+  public static terminal find(int indx)
+    {
+      Integer the_indx = new Integer(indx);
+
+      return (terminal)_all_by_index.get(the_indx);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Total number of terminals. */
+  public static int number() {return _all.size();}
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+ 
+  /** Static counter to assign unique index. */
+  protected static int next_index = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Special terminal for end of input. */
+  public static final terminal EOF = new terminal("EOF");
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** special terminal used for error recovery */
+  public static final terminal error = new terminal("error");
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Report this symbol as not being a non-terminal. */
+  public boolean is_non_term() 
+    {
+      return false;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to a string. */
+  public String toString()
+    {
+      return super.toString() + "[" + index() + "]";
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** get the precedence of a terminal */
+  public int precedence_num() {
+    return _precedence_num;
+  }
+  public int precedence_side() {
+    return _precedence_side;
+  }
+
+  /** set the precedence of a terminal */
+  public void set_precedence(int p, int new_prec) {
+    _precedence_side = p;
+    _precedence_num = new_prec;
+  }
+
+  /*-----------------------------------------------------------*/
+
+}
diff --git a/open-nars/java_cup/terminal_set.java b/open-nars/java_cup/terminal_set.java
new file mode 100644
index 0000000..e921cb5
--- /dev/null
+++ b/open-nars/java_cup/terminal_set.java
@@ -0,0 +1,253 @@
+
+package java_cup;
+
+import java.util.BitSet;
+
+/** A set of terminals implemented as a bitset. 
+ * @version last updated: 11/25/95
+ * @author  Scott Hudson
+ */
+public class terminal_set {
+
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constructor for an empty set. */
+  public terminal_set() 
+    { 
+      /* allocate the bitset at what is probably the right size */
+      _elements = new BitSet(terminal.number());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Constructor for cloning from another set. 
+   * @param other the set we are cloning from.
+   */
+  public terminal_set(terminal_set other) 
+    throws internal_error
+    {
+      not_null(other);
+      _elements = (BitSet)other._elements.clone();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constant for the empty set. */
+  public static final terminal_set EMPTY = new terminal_set();
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Bitset to implement the actual set. */
+  protected BitSet _elements;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Helper function to test for a null object and throw an exception if
+   *  one is found. 
+   * @param obj the object we are testing.
+   */
+  protected void not_null(Object obj) throws internal_error
+    {
+      if (obj == null) 
+	throw new internal_error("Null object used in set operation");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if the set is empty. */
+  public boolean empty()
+    {
+      return equals(EMPTY);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if the set contains a particular terminal. 
+   * @param sym the terminal symbol we are looking for.
+   */
+  public boolean contains(terminal sym) 
+    throws internal_error
+    {
+      not_null(sym); 
+      return _elements.get(sym.index());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Given its index determine if the set contains a particular terminal. 
+   * @param indx the index of the terminal in question.
+   */
+  public boolean contains(int indx) 
+    {
+      return _elements.get(indx);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if this set is an (improper) subset of another.
+   * @param other the set we are testing against.
+   */
+  public boolean is_subset_of(terminal_set other)
+    throws internal_error
+    {
+      not_null(other);
+
+      /* make a copy of the other set */
+      BitSet copy_other = (BitSet)other._elements.clone();
+
+      /* and or in */
+      copy_other.or(_elements);
+
+      /* if it hasn't changed, we were a subset */
+      return copy_other.equals(other._elements);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if this set is an (improper) superset of another.
+   * @param other the set we are testing against.
+   */
+  public boolean is_superset_of(terminal_set other)
+    throws internal_error
+    {
+      not_null(other);
+      return other.is_subset_of(this);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add a single terminal to the set.  
+   * @param sym the terminal being added.
+   * @return true if this changes the set.
+   */
+  public boolean add(terminal sym) 
+    throws internal_error
+    {
+      boolean result;
+
+      not_null(sym); 
+
+      /* see if we already have this */ 
+      result = _elements.get(sym.index());
+
+      /* if not we add it */
+      if (!result)
+	_elements.set(sym.index());
+
+      return result;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Remove a terminal if it is in the set.
+   * @param sym the terminal being removed.
+   */
+  public void remove(terminal sym) 
+    throws internal_error
+    {
+      not_null(sym); 
+      _elements.clear(sym.index());
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Add (union) in a complete set.  
+   * @param other the set being added.
+   * @return true if this changes the set.
+   */
+  public boolean add(terminal_set other)
+    throws internal_error
+    {
+      not_null(other);
+
+      /* make a copy */
+      BitSet copy = (BitSet)_elements.clone();
+
+      /* or in the other set */
+      _elements.or(other._elements);
+
+      /* changed if we are not the same as the copy */
+      return !_elements.equals(copy);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if this set intersects another.
+   * @param other the other set in question.
+   */
+   public boolean intersects(terminal_set other)
+     throws internal_error
+     {
+       not_null(other);
+
+       /* make a copy of the other set */
+       BitSet copy = (BitSet)other._elements.clone();
+
+       /* xor out our values */
+       copy.xor(this._elements);
+
+       /* see if its different */
+       return !copy.equals(other._elements);
+     }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Equality comparison. */
+  public boolean equals(terminal_set other)
+    {
+      if (other == null) 
+	return false;
+      else
+	return _elements.equals(other._elements);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Generic equality comparison. */
+  public boolean equals(Object other)
+    {
+      if (!(other instanceof terminal_set))
+	return false;
+      else
+	return equals((terminal_set)other);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Convert to string. */
+  public String toString()
+    {
+      String result;
+      boolean comma_flag;
+      
+      result = "{";
+      comma_flag = false;
+      for (int t = 0; t < terminal.number(); t++)
+	{
+	  if (_elements.get(t))
+	    {
+	      if (comma_flag)
+	        result += ", ";
+	      else
+	        comma_flag = true;
+
+	      result += terminal.find(t).name();
+	    }
+	}
+      result += "}";
+
+      return result;
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
+
diff --git a/open-nars/java_cup/version.java b/open-nars/java_cup/version.java
new file mode 100644
index 0000000..06600b5
--- /dev/null
+++ b/open-nars/java_cup/version.java
@@ -0,0 +1,55 @@
+
+package java_cup;
+
+/** This class contains version and authorship information. 
+ *  It contains only static data elements and basically just a central 
+ *  place to put this kind of information so it can be updated easily
+ *  for each release.  
+ *
+ *  Version numbers used here are broken into 3 parts: major, minor, and 
+ *  update, and are written as v<major>.<minor>.<update> (e.g. v0.10a).  
+ *  Major numbers will change at the time of major reworking of some 
+ *  part of the system.  Minor numbers for each public release or 
+ *  change big enough to cause incompatibilities.  Finally update
+ *  letter will be incremented for small bug fixes and changes that
+ *  probably wouldn't be noticed by a user.  
+ *
+ * @version last updated: 12/22/97 [CSA]
+ * @author  Frank Flannery
+ */
+
+public class version {
+  /** The major version number. */
+  public static final int major = 0;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The minor version number. */
+  public static final int minor = 10;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The update letter. */
+  public static final char update = 'k';
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** String for the current version. */
+  public static final String version_str = "v" + major + "." + minor + update;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Full title of the system */
+  public static final String title_str = "CUP " + version_str;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Name of the author */
+  public static final String author_str =
+      "Scott E. Hudson, Frank Flannery, and C. Scott Ananian";
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The command name normally used to invoke this program */ 
+  public static final String program_name = "java_cup";
+}
diff --git a/open-nars/lib/antlr-runtime-3.0.1.jar b/open-nars/lib/antlr-runtime-3.0.1.jar
deleted file mode 100644
index b2efb5b6669945c818a71989c49943b18ffcef49..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 105209
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
Q{NlI|yn}QGW+_nr1G7d+vj6}9

diff --git a/open-nars/lib/stringtemplate-3.0.jar b/open-nars/lib/stringtemplate-3.0.jar
deleted file mode 100644
index 5efcffce509c7ce466fd6f5c0e5a56ed2ce75e21..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 161716
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%0D9)n0`!Gid5EnDfBOO6q<PFTc7wQ?E;
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
VemJy|y4WPHd^g8!JB1)|{{XI(Ccyvz

-- 
GitLab