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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¨>CcI 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 VemJy|y4WPHd^g8!JB1)|{{XI(Ccyvz -- GitLab