From 02c7c658e87dc6f3c347e9b0d44ce275d2c31514 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Wed, 11 May 2016 23:48:52 +0300 Subject: [PATCH] JFlex: delete our patched 1.4.3 and complete IDEA-143060 --- tools/lexer/jflex-1.4/.classpath | 9 - tools/lexer/jflex-1.4/.project | 17 - tools/lexer/jflex-1.4/COPYRIGHT | 303 - tools/lexer/jflex-1.4/JFlex-Changes.txt | 21 - tools/lexer/jflex-1.4/bin/jflex | 51 - tools/lexer/jflex-1.4/bin/jflex.bat | 19 - tools/lexer/jflex-1.4/doc/COPYRIGHT | 303 - tools/lexer/jflex-1.4/doc/crossref.png | Bin 146 -> 0 bytes tools/lexer/jflex-1.4/doc/footnote.png | Bin 189 -> 0 bytes tools/lexer/jflex-1.4/doc/jflex_anttask.html | 165 - tools/lexer/jflex-1.4/doc/logo.gif | Bin 31753 -> 0 bytes tools/lexer/jflex-1.4/doc/manual.css | 19 - tools/lexer/jflex-1.4/doc/manual.html | 3920 --------- tools/lexer/jflex-1.4/doc/manual.pdf | Bin 392211 -> 0 bytes tools/lexer/jflex-1.4/doc/manual.ps.gz | Bin 195352 -> 0 bytes .../lexer/jflex-1.4/examples/binary/Makefile | 22 - tools/lexer/jflex-1.4/examples/binary/README | 18 - .../examples/binary/StraightStreamReader.java | 287 - .../jflex-1.4/examples/binary/binary.flex | 52 - .../lexer/jflex-1.4/examples/byaccj/Makefile | 27 - tools/lexer/jflex-1.4/examples/byaccj/README | 22 - .../lexer/jflex-1.4/examples/byaccj/calc.flex | 62 - tools/lexer/jflex-1.4/examples/byaccj/calc.y | 112 - tools/lexer/jflex-1.4/examples/cup/Main.java | 39 - tools/lexer/jflex-1.4/examples/cup/Makefile | 26 - tools/lexer/jflex-1.4/examples/cup/README | 30 - tools/lexer/jflex-1.4/examples/cup/lcalc.flex | 142 - .../lexer/jflex-1.4/examples/cup/output.good | 4 - tools/lexer/jflex-1.4/examples/cup/test.txt | 4 - tools/lexer/jflex-1.4/examples/cup/ycalc.cup | 234 - .../jflex-1.4/examples/interpreter/AST.java | 30 - .../jflex-1.4/examples/interpreter/Main.java | 88 - .../jflex-1.4/examples/interpreter/Makefile | 42 - .../jflex-1.4/examples/interpreter/README | 31 - .../examples/interpreter/STEfun.java | 54 - .../examples/interpreter/STEvar.java | 57 - .../examples/interpreter/SymTab.java | 79 - .../examples/interpreter/SymtabEntry.java | 48 - .../examples/interpreter/Tboolexp.java | 64 - .../jflex-1.4/examples/interpreter/Tdekl.java | 75 - .../examples/interpreter/Tdekllist.java | 69 - .../jflex-1.4/examples/interpreter/Texp.java | 43 - .../examples/interpreter/Texpinfix.java | 64 - .../examples/interpreter/Texplist.java | 73 - .../jflex-1.4/examples/interpreter/Tfun.java | 66 - .../examples/interpreter/Tident.java | 62 - .../examples/interpreter/Tifthenelse.java | 59 - .../examples/interpreter/Tnumber.java | 47 - .../examples/interpreter/Tparlist.java | 54 - .../examples/interpreter/Tprogram.java | 99 - .../examples/interpreter/Tuminus.java | 49 - .../jflex-1.4/examples/interpreter/build.xml | 38 - .../jflex-1.4/examples/interpreter/example.as | 16 - .../jflex-1.4/examples/interpreter/parser.cup | 112 - .../examples/interpreter/scanner.flex | 71 - .../jflex-1.4/examples/java/JavaParser.java | 47 - .../jflex-1.4/examples/java/JavaSymbol.java | 31 - tools/lexer/jflex-1.4/examples/java/Makefile | 48 - tools/lexer/jflex-1.4/examples/java/README | 41 - .../jflex-1.4/examples/java/TestLexer.java | 62 - tools/lexer/jflex-1.4/examples/java/java.flex | 312 - .../lexer/jflex-1.4/examples/java/java12.cup | 885 -- .../jflex-1.4/examples/java/lexer-output.good | 376 - .../jflex-1.4/examples/java/unicode.flex | 149 - .../lexer/jflex-1.4/examples/simple/Makefile | 23 - tools/lexer/jflex-1.4/examples/simple/README | 29 - .../jflex-1.4/examples/simple/Utility.java | 19 - .../jflex-1.4/examples/simple/Yytoken.java | 24 - .../jflex-1.4/examples/simple/output.good | 660 -- .../jflex-1.4/examples/simple/simple.flex | 86 - .../lexer/jflex-1.4/examples/simple/test.txt | 19 - .../jflex-1.4/examples/standalone/Makefile | 13 - .../jflex-1.4/examples/standalone/README | 20 - .../jflex-1.4/examples/standalone/build.xml | 23 - .../jflex-1.4/examples/standalone/sample.inp | 8 - .../examples/standalone/standalone.flex | 44 - ...lex-1.4.3-unicode-character-category.patch | 7211 ----------------- tools/lexer/jflex-1.4/lib/JFlex.jar | Bin 187789 -> 0 bytes tools/lexer/jflex-1.4/lib/jflex-mode.el | 114 - tools/lexer/jflex-1.4/lib/jflex.vim | 149 - tools/lexer/jflex-1.4/src/JFlex/Action.java | 261 - .../src/JFlex/CharClassException.java | 49 - .../src/JFlex/CharClassInterval.java | 73 - .../jflex-1.4/src/JFlex/CharClasses.java | 388 - tools/lexer/jflex-1.4/src/JFlex/CharSet.java | 112 - .../src/JFlex/CharSetEnumerator.java | 88 - .../jflex-1.4/src/JFlex/CountEmitter.java | 115 - tools/lexer/jflex-1.4/src/JFlex/DFA.java | 929 --- .../lexer/jflex-1.4/src/JFlex/EOFActions.java | 94 - tools/lexer/jflex-1.4/src/JFlex/Emitter.java | 1671 ---- .../jflex-1.4/src/JFlex/ErrorMessages.java | 149 - .../src/JFlex/GeneratorException.java | 36 - .../jflex-1.4/src/JFlex/HiLowEmitter.java | 88 - .../lexer/jflex-1.4/src/JFlex/IntCharSet.java | 411 - tools/lexer/jflex-1.4/src/JFlex/IntPair.java | 57 - tools/lexer/jflex-1.4/src/JFlex/Interval.java | 163 - tools/lexer/jflex-1.4/src/JFlex/LexParse.cup | 807 -- tools/lexer/jflex-1.4/src/JFlex/LexParse.java | 2795 ------- tools/lexer/jflex-1.4/src/JFlex/LexScan.flex | 613 -- tools/lexer/jflex-1.4/src/JFlex/LexScan.java | 3404 -------- .../jflex-1.4/src/JFlex/LexicalStates.java | 97 - .../jflex-1.4/src/JFlex/MacroException.java | 49 - tools/lexer/jflex-1.4/src/JFlex/Macros.java | 217 - tools/lexer/jflex-1.4/src/JFlex/Main.java | 342 - .../jflex-1.4/src/JFlex/Messages.properties | 74 - tools/lexer/jflex-1.4/src/JFlex/NFA.java | 1052 --- tools/lexer/jflex-1.4/src/JFlex/Options.java | 135 - tools/lexer/jflex-1.4/src/JFlex/Out.java | 461 -- .../jflex-1.4/src/JFlex/PackEmitter.java | 230 - tools/lexer/jflex-1.4/src/JFlex/RegExp.java | 332 - tools/lexer/jflex-1.4/src/JFlex/RegExp1.java | 80 - tools/lexer/jflex-1.4/src/JFlex/RegExp2.java | 50 - tools/lexer/jflex-1.4/src/JFlex/RegExps.java | 217 - .../jflex-1.4/src/JFlex/ScannerException.java | 104 - tools/lexer/jflex-1.4/src/JFlex/SemCheck.java | 227 - .../lexer/jflex-1.4/src/JFlex/SilentExit.java | 31 - tools/lexer/jflex-1.4/src/JFlex/Skeleton.java | 222 - .../jflex-1.4/src/JFlex/StatePairList.java | 83 - tools/lexer/jflex-1.4/src/JFlex/StateSet.java | 334 - .../src/JFlex/StateSetEnumerator.java | 124 - .../jflex-1.4/src/JFlex/StdOutWriter.java | 113 - tools/lexer/jflex-1.4/src/JFlex/Timer.java | 110 - .../src/JFlex/anttask/JFlexTask.java | 266 - .../src/JFlex/gui/GeneratorThread.java | 93 - .../jflex-1.4/src/JFlex/gui/GridPanel.java | 161 - .../src/JFlex/gui/GridPanelConstraint.java | 44 - .../jflex-1.4/src/JFlex/gui/Handles.java | 49 - .../jflex-1.4/src/JFlex/gui/MainFrame.java | 275 - .../src/JFlex/gui/OptionsDialog.java | 259 - .../jflex-1.4/src/JFlex/skeleton.default | 317 - tools/lexer/jflex-1.4/src/JFlex/sym.java | 91 - .../jflex-1.4/src/JFlex/tests/AllTests.java | 50 - .../src/JFlex/tests/AntTaskTests.java | 167 - .../src/JFlex/tests/CharClassesTest.java | 103 - .../src/JFlex/tests/EmitterTest.java | 50 - .../src/JFlex/tests/PackEmitterTest.java | 80 - .../src/JFlex/tests/RegExpTests.java | 62 - .../src/JFlex/tests/SkeletonTest.java | 63 - tools/lexer/jflex-1.4/src/README | 46 - tools/lexer/jflex-1.4/src/build.xml | 114 - tools/lexer/jflex-1.4/src/changelog | 277 - .../runtime/ComplexSymbolFactory.java | 119 - .../runtime/DefaultSymbolFactory.java | 52 - .../src/java_cup/runtime/Scanner.java | 25 - .../src/java_cup/runtime/Symbol.java | 116 - .../src/java_cup/runtime/SymbolFactory.java | 33 - .../src/java_cup/runtime/lr_parser.java | 1253 --- .../java_cup/runtime/virtual_parse_stack.java | 145 - tools/lexer/jflex-1.4/src/manifest | 1 - tools/lexer/jflex-1.4/src/skeleton.default | 327 - tools/lexer/jflex-1.4/src/skeleton.nested | 428 - 151 files changed, 39844 deletions(-) delete mode 100644 tools/lexer/jflex-1.4/.classpath delete mode 100644 tools/lexer/jflex-1.4/.project delete mode 100644 tools/lexer/jflex-1.4/COPYRIGHT delete mode 100644 tools/lexer/jflex-1.4/JFlex-Changes.txt delete mode 100755 tools/lexer/jflex-1.4/bin/jflex delete mode 100644 tools/lexer/jflex-1.4/bin/jflex.bat delete mode 100644 tools/lexer/jflex-1.4/doc/COPYRIGHT delete mode 100644 tools/lexer/jflex-1.4/doc/crossref.png delete mode 100644 tools/lexer/jflex-1.4/doc/footnote.png delete mode 100644 tools/lexer/jflex-1.4/doc/jflex_anttask.html delete mode 100644 tools/lexer/jflex-1.4/doc/logo.gif delete mode 100644 tools/lexer/jflex-1.4/doc/manual.css delete mode 100644 tools/lexer/jflex-1.4/doc/manual.html delete mode 100644 tools/lexer/jflex-1.4/doc/manual.pdf delete mode 100644 tools/lexer/jflex-1.4/doc/manual.ps.gz delete mode 100644 tools/lexer/jflex-1.4/examples/binary/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/binary/README delete mode 100644 tools/lexer/jflex-1.4/examples/binary/StraightStreamReader.java delete mode 100644 tools/lexer/jflex-1.4/examples/binary/binary.flex delete mode 100644 tools/lexer/jflex-1.4/examples/byaccj/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/byaccj/README delete mode 100644 tools/lexer/jflex-1.4/examples/byaccj/calc.flex delete mode 100644 tools/lexer/jflex-1.4/examples/byaccj/calc.y delete mode 100644 tools/lexer/jflex-1.4/examples/cup/Main.java delete mode 100644 tools/lexer/jflex-1.4/examples/cup/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/cup/README delete mode 100644 tools/lexer/jflex-1.4/examples/cup/lcalc.flex delete mode 100644 tools/lexer/jflex-1.4/examples/cup/output.good delete mode 100644 tools/lexer/jflex-1.4/examples/cup/test.txt delete mode 100644 tools/lexer/jflex-1.4/examples/cup/ycalc.cup delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/AST.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Main.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/README delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/STEfun.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/STEvar.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/SymTab.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/SymtabEntry.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tboolexp.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tdekl.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tdekllist.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Texp.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Texpinfix.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Texplist.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tfun.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tident.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tifthenelse.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tnumber.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tparlist.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tprogram.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/Tuminus.java delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/build.xml delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/example.as delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/parser.cup delete mode 100644 tools/lexer/jflex-1.4/examples/interpreter/scanner.flex delete mode 100644 tools/lexer/jflex-1.4/examples/java/JavaParser.java delete mode 100644 tools/lexer/jflex-1.4/examples/java/JavaSymbol.java delete mode 100644 tools/lexer/jflex-1.4/examples/java/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/java/README delete mode 100644 tools/lexer/jflex-1.4/examples/java/TestLexer.java delete mode 100644 tools/lexer/jflex-1.4/examples/java/java.flex delete mode 100644 tools/lexer/jflex-1.4/examples/java/java12.cup delete mode 100644 tools/lexer/jflex-1.4/examples/java/lexer-output.good delete mode 100644 tools/lexer/jflex-1.4/examples/java/unicode.flex delete mode 100644 tools/lexer/jflex-1.4/examples/simple/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/simple/README delete mode 100644 tools/lexer/jflex-1.4/examples/simple/Utility.java delete mode 100644 tools/lexer/jflex-1.4/examples/simple/Yytoken.java delete mode 100644 tools/lexer/jflex-1.4/examples/simple/output.good delete mode 100644 tools/lexer/jflex-1.4/examples/simple/simple.flex delete mode 100644 tools/lexer/jflex-1.4/examples/simple/test.txt delete mode 100644 tools/lexer/jflex-1.4/examples/standalone/Makefile delete mode 100644 tools/lexer/jflex-1.4/examples/standalone/README delete mode 100644 tools/lexer/jflex-1.4/examples/standalone/build.xml delete mode 100644 tools/lexer/jflex-1.4/examples/standalone/sample.inp delete mode 100644 tools/lexer/jflex-1.4/examples/standalone/standalone.flex delete mode 100644 tools/lexer/jflex-1.4/jflex-1.4.3-unicode-character-category.patch delete mode 100644 tools/lexer/jflex-1.4/lib/JFlex.jar delete mode 100644 tools/lexer/jflex-1.4/lib/jflex-mode.el delete mode 100644 tools/lexer/jflex-1.4/lib/jflex.vim delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Action.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CharClassException.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CharClassInterval.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CharClasses.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CharSet.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CharSetEnumerator.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/CountEmitter.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/DFA.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/EOFActions.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Emitter.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/ErrorMessages.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/GeneratorException.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/HiLowEmitter.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/IntCharSet.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/IntPair.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Interval.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/LexParse.cup delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/LexParse.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/LexScan.flex delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/LexScan.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/LexicalStates.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/MacroException.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Macros.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Main.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Messages.properties delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/NFA.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Options.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Out.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/PackEmitter.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/RegExp.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/RegExp1.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/RegExp2.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/RegExps.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/ScannerException.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/SemCheck.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/SilentExit.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Skeleton.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/StatePairList.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/StateSet.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/StateSetEnumerator.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/StdOutWriter.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/Timer.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/anttask/JFlexTask.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/GeneratorThread.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/GridPanel.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/GridPanelConstraint.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/Handles.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/MainFrame.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/gui/OptionsDialog.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/skeleton.default delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/sym.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/AllTests.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/AntTaskTests.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/CharClassesTest.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/EmitterTest.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/PackEmitterTest.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/RegExpTests.java delete mode 100644 tools/lexer/jflex-1.4/src/JFlex/tests/SkeletonTest.java delete mode 100644 tools/lexer/jflex-1.4/src/README delete mode 100644 tools/lexer/jflex-1.4/src/build.xml delete mode 100644 tools/lexer/jflex-1.4/src/changelog delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/ComplexSymbolFactory.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/DefaultSymbolFactory.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/Scanner.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/Symbol.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/SymbolFactory.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/lr_parser.java delete mode 100644 tools/lexer/jflex-1.4/src/java_cup/runtime/virtual_parse_stack.java delete mode 100644 tools/lexer/jflex-1.4/src/manifest delete mode 100644 tools/lexer/jflex-1.4/src/skeleton.default delete mode 100644 tools/lexer/jflex-1.4/src/skeleton.nested diff --git a/tools/lexer/jflex-1.4/.classpath b/tools/lexer/jflex-1.4/.classpath deleted file mode 100644 index c7ff90e6b35c..000000000000 --- a/tools/lexer/jflex-1.4/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tools/lexer/jflex-1.4/.project b/tools/lexer/jflex-1.4/.project deleted file mode 100644 index 3160ec94a23d..000000000000 --- a/tools/lexer/jflex-1.4/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - jflex - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/tools/lexer/jflex-1.4/COPYRIGHT b/tools/lexer/jflex-1.4/COPYRIGHT deleted file mode 100644 index 0109c544d770..000000000000 --- a/tools/lexer/jflex-1.4/COPYRIGHT +++ /dev/null @@ -1,303 +0,0 @@ -JFlex - Copying, Warranty & License - - - -JFlex is free software, published under the terms of the GNU General Public License. - -There is absolutely NO WARRANTY for JFlex, its code and its documentation. - -The code generated by JFlex inherits the copyright of the specification it -was produced from. If it was your specification, you may use the generated -code without restriction. - - - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - - -0. - This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - - -1. - You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - -2. - You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - - - a) - You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - - b) - You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - - c) - If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - - -3. - You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - - - a) - Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - - b) - Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - - c) - Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - -4. - You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - - -5. - You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - - -6. - Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - - -7. - If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - - -8. - If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - - -9. - The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - - - -10. - If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - - -NO WARRANTY - - - -11. - BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - - -12. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - - - -END OF TERMS AND CONDITIONS diff --git a/tools/lexer/jflex-1.4/JFlex-Changes.txt b/tools/lexer/jflex-1.4/JFlex-Changes.txt deleted file mode 100644 index e9fecd873b72..000000000000 --- a/tools/lexer/jflex-1.4/JFlex-Changes.txt +++ /dev/null @@ -1,21 +0,0 @@ -The following changes to JFlex 1.4.3 have been done by JetBrains developers: - -July 26, 2005: - - * JFlexTask.java: Added setCharAt() method for setting the -charat option from Ant - builds. - -July 8, 2005: - - * Main.java, Options.java, Emitter.java: Added new command line option -charat. - The option replaces array index access when accessing the zzBufferL array with - calls to the .charAt() method. - -December 21, 2009 - * Applied jflex-1.4.3-unicode-character-category.patch - - -October 1, 2012: - * Merged pull request : - Fix JFlex's Action.GENERAL_LOOK lookahead option to work with --charAt and --sliceandcharat. - https://github.com/gshakhn/intellij-community/commit/e537a27e2bfc8e12500f00fa33e8e51ccaf47243 diff --git a/tools/lexer/jflex-1.4/bin/jflex b/tools/lexer/jflex-1.4/bin/jflex deleted file mode 100755 index 65cb93efbbbb..000000000000 --- a/tools/lexer/jflex-1.4/bin/jflex +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# -# JFlex start script $Revision$ -# -# if Java is not in your binary path, you need to supply its -# location in this script. The script automatically finds -# JFLEX_HOME when called directly, via binary path, or symbolic -# link. -# -# Site wide installation: simply make a symlink from e.g. -# /usr/bin/jflex to this script at its original position -# -#=================================================================== -# -# configurables: - -# path to the java interpreter -JAVA=java - -# end configurables -# -#=================================================================== -# - -# calculate true location - -PRG=`type $0` -PRG="${PRG##* }" - -# If PRG is a symlink, trace it to the real home directory - -while [ -L "$PRG" ] -do - newprg=$(ls -l ${PRG}) - newprg="${newprg##*-> }" - [ "${newprg}" = "${newprg#/}" ] && newprg="${PRG%/*}/${newprg}" - PRG="$newprg" -done - -PRG="${PRG%/*}" -JFLEX_HOME="${PRG}/.." - -# -------------------------------------------------------------------- - -export CLASSPATH -CLASSPATH=$JFLEX_HOME/lib/JFlex.jar - -$JAVA JFlex.Main $@ - -#for more memory: -#$JAVA -Xmx128m JFlex.Main $@ diff --git a/tools/lexer/jflex-1.4/bin/jflex.bat b/tools/lexer/jflex-1.4/bin/jflex.bat deleted file mode 100644 index dda2f4358a8f..000000000000 --- a/tools/lexer/jflex-1.4/bin/jflex.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs -REM (please do not add a trailing backslash) - -set JFLEX_HOME=C:\JFLEX - -REM only needed for JDK 1.1.x: -set JAVA_HOME=C:\JAVA - - -REM ------------------------------------------------------------------- - -set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar - -REM for JDK 1.1.x -%JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9 - -REM for JDK 1.2 -rem java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/tools/lexer/jflex-1.4/doc/COPYRIGHT b/tools/lexer/jflex-1.4/doc/COPYRIGHT deleted file mode 100644 index 0109c544d770..000000000000 --- a/tools/lexer/jflex-1.4/doc/COPYRIGHT +++ /dev/null @@ -1,303 +0,0 @@ -JFlex - Copying, Warranty & License - - - -JFlex is free software, published under the terms of the GNU General Public License. - -There is absolutely NO WARRANTY for JFlex, its code and its documentation. - -The code generated by JFlex inherits the copyright of the specification it -was produced from. If it was your specification, you may use the generated -code without restriction. - - - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - - -0. - This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - - -1. - You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - -2. - You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - - - a) - You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - - b) - You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - - c) - If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - - -3. - You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - - - a) - Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - - b) - Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - - c) - Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - -4. - You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - - -5. - You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - - -6. - Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - - -7. - If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - - -8. - If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - - -9. - The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - - - -10. - If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - - -NO WARRANTY - - - -11. - BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - - -12. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - - - -END OF TERMS AND CONDITIONS diff --git a/tools/lexer/jflex-1.4/doc/crossref.png b/tools/lexer/jflex-1.4/doc/crossref.png deleted file mode 100644 index 295d626ced7d44024e76421dd5caead702e5dd40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?&q;$mQ6;PUiv2?Eg|%mE}A723PafHYG{kY6yveqG;WRUpsD)5S5QVovVa z)0_t!c$hCfKl*oB@07P<+CE(Ur$3sAp+%O1RJJkRub$I*A!_ZJo2rhHXjR s(*0t$cNb*&|7zOhzF)k4$`xn!h3kc0FO_=o2xu;Yr>mdKI;Vst0E-PYvH$=8 diff --git a/tools/lexer/jflex-1.4/doc/footnote.png b/tools/lexer/jflex-1.4/doc/footnote.png deleted file mode 100644 index 5eccb4ef18af3e10ded3867b45a450f8f53c8a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?&q;$mQ6;PUiv2?EmmAj|kcv5` z=L{v86?qyivWGKH6}047(_xWdDOgzGty=Pep+`mkzx!;f+*g~ - - - -JFlex Ant Task - - - - -

JFlex Ant Task

-

- JFlex can be easily integrated with Ant build tool. - To use JFlex with Ant, simply copy JFlex.jar to $ANT_HOME/lib/ directory. -

-

Description

-

- The JFlex Ant Task invokes the JFlex lexical - analyzer generator on a grammar file. -

-

- To use the JFlex task, the following line must be placed in the Ant build file: -

-
<taskdef classname="JFlex.anttask.JFlexTask" name="jflex" />
- -

- The JFlex task requires the file attribute to be set to the source grammar file (*.flex). - Unless the target directory is specified with the destdir option, - the generated class will be saved to the same directory where grammar file resides. - Like javac, the JFlex task creates subdirectories in destdir according to the - generated class package. -

-

- This task only invokes JFlex if the grammar file is newer than the generated - files. -

- -

Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequiredDefault
file="file"The grammar file to process.Yes
destdir="dir" - The directory to write the generated files to. If not set, the files - are written to the directory containing the grammar file. Note that unlike - JFlex's "-d" command line option, destdir causes the generated file to be written to - {destdir}/{package name}. This behaviour is similar to javac -d dir. - No
outdir="dir" - The directory to write the generated files to. If not set, the files - are written to the directory containing the grammar file. This options works - exactly like JFlex's "-d" command line option, it causes the output file to - be written to dir regardless of the package name. - No
verboseDisplay generation process messages.No"off"
dumpDump character classes, NFA and DFA tables.No"off"
time or

timeStatistics

Display generation time statistics.No"off"
nomin or

skipMinimization

Skip minimization step.No"off"
skel="file" or

skeleton="file"

Use external skeleton file.No"off"
dot or

generateDot

Write graphviz .dot files for the generated automata (alpha).No"off"
nobakDo not make a backup if the generated file exists.No"off"
switchUse code generation method switch.No"off"
tableUse code generation method table.No"off"
packUse code generation method pack.No"on"
-

Example

-
-<jflex
-    file="src/parser/Parser.flex"
-    destdir="build/generated/"
-/>
-
-

- JFlex generates the lexical analyzer for src/parser/Parser.flex and saves the result - to build/generated/parser/, providing Parser.flex declares to be in package parser. -

- -
-<jflex
-    file="src/parser/Parser.flex"
-    destdir="build/generated/"
-/>
-<javac
-    srcdir="build/generated/"
-    destdir="build/classes/"
-/>
-
-

- The same as above plus compile generated classes to build/classes -

-
- - - - diff --git a/tools/lexer/jflex-1.4/doc/logo.gif b/tools/lexer/jflex-1.4/doc/logo.gif deleted file mode 100644 index 1da5d28c1d94710f0bf52ec871b3fd76afd4c830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31753 zcmX6^3pkVS``_6%yO{HYnvpY&rRGr0c{G~yLYiYpnnO~lc5s+uBWWZ}q!Bejl4^6D zq9kb*g(#JZjyinXf4}R$XYaGm{kh*=?{nSn?&p2q=l;yg+mq-J%%}O9BY{DpDl)zLlOa;T>G7|_2rmBj` z%;GW`OeT}d%;G6r3cyu>EFPBu7*!m7l*?uExLJh%0WOcr`xSv($>&tvj< zJU)*r_#eaL^A&_9=x74c9ELN4Gl`Fx&$&jk?V1O+Q6@cDcJpC{yV2?T|gFA(sA z0y|#+Uxb$Yy89mu982v$Cbx@!8qgB?VX-Ur~@tvXv!8KfAJ| zV3t-CU`4?!t*p$-6|R*fxx!pokt@vq;T6SkGgdrqNOWW#)Phs5(^}X90MoyarHb;!KU%G!5 zA9Jt9`+DQpIb!5=P~A6_7FkOn>-!beptoAchaZ=^iNQ^#^_HM|}fUMbf!zt?l< zim88X^6iUh9|v6c z4cxY4MaG5Y0Za^X9-@RcIT94DLtfhaiuKyj$8$s>zr=||1q@MB#aAX=f* zK)8WvvA7mT7&3ob<9R7sX+x&|oQIAdU{%J8%$f5jbKPEn?79a z?b@7gkgnP8p~Kl?GFZ!Tv|oy)SV;!ZOz0z>Du-qCK&Ok9ETKMB(=6W>lv*x0V%0H@ zJ!osJ<LCpq%af*pa1wc!w{zC(;?c_ya``cK$u+nGN2hf?vk&c z((~(Of5PR~{TBHhp2O>09*Afc2!OVkOoKd16x?)0Zf$T(#r4-7lp}gQ=VBo)we_OR zuJmK))F&}S=P7FQuG5s!agee_#WB}2>PQJty|re-$6`3U{wQ&==JjvK<&M)2oI0NV z^K$;#i?RZAId!Wsm}aUSYFxwGX_2rp2=ZD2!m(9h1^(UqZLxi97 z=FPl_k;A1kzaC`X+^O_QKg;R)?tWbzO^!rmirxO-=Ob8DUE)giqDQxgGeB3l_xhJToR;fApBs& zGGuVaMQx?OLk?kY9T7fgc31xl#B!}PgBFw3YsS+VFo9_=`s6T*>-}l00)Om9)oh{G z`Zb1<<^&7LeC}GW(kZYzRN&$wbD2}W>4xpw#r+%zVs|s3c;=ioq|EKc^Bd*KVB~7fSGAIn2Y6ruHo97)n_MbJ#qV-v6$BOc zp>{ks=5$Rq+u45I+59}J^Js##r{kCW@?MaRS)w~W$PfEktY5MDyZ07KEF8n=GjAax z_X+*;!H zLoC?rA3Q@>B2Z&hvSiZzL%R^Wm=#+jRCilh40Z@m{;zRBPwTG8+#a*x$Jeu!;IPJq}F_dH~?d}?ZA z4Bnd=VUGQNeBs}x4L_JeD-4#vdO%e2@n%x|u%(xGOBCD$<0o6d=Dih3&==2h2RtPO zcP@27h##I3&Lez9&nxq{JAXjW6keZ@!y@yyZI0i?ut2m%~sM{v3bQ<4Fda}D$xf=sgGrR9Z5e= z+Ji1g+|Vp5+?4>9pJ|TB|Ina3bZp#a0N1$38ImSRKp8cJ^9=PI7aGq_tc@qU=4jFZ zZ1@6kSeF69{+{jAW?#knYNl*B{<~`HX>ekXM?iT8k=`2b@?Dsr|0@Pn{Dsa zRGt0=waMl1;gy=XybV<>#GnydgWSB2cuLjr;i>Dn z+X3?`A1d9-(^paqEze7lzj8wcvEPkNZ(iABf0j19?!~h$?X&uW2U0X__UAr5y8JC% zL~@ouU7lZh`q%BNo3j?s{jZf)gJ@`L>2Z}*&C0{hC0;LIm7Q|>?1uf3U`0SlqIGes zcGL0w^7-LY+8#{3FQxf^Q?VP4)Pgf6>?UJVpU?jKt=FfGJOVYP*dnvNE*}I)xBdx9 zlD8j?$|V;-_D8&h1XH0wr2V+K{T)M4+Ekpe76D|abW0m@YtG>%F!@Q8V=EqcM}VAO z@eBLr_$YYaM5yYw6_w0NRd8L}WmqF{@PdL)F&*H)TWhXwEuIo2E;w}V7(~o2@ zU>~$0%Ru-_WnvXnYpwH7YUoz2t!_-Ev zBD8r~qbc(nDEy(O`-_W3>)wT|cQ|HfzP}^X-6JDFmtXD=va?3}sHr6ziSzlh%IT&w zxaPjMSf{SXfksdH`7+f4cxev6SRjRY&zj8LsHiT`SY9eU^;4hfaB9~xeFC7cBTea9 zChVgJs4=T>#UAdH52xg#%SDLG0Jxe%(Y|L}AEoXEVTgdUdL>^V*v_)vB__H%59!5H zz7cmsOphElel^Fk0yrLlgWRa3%S`x$F#B^wvS!7uNx9eYUnEtMIeKXpHOfSVu0TVn zZt>&T!Bv-YyD!+WjJ9X#pEEm^Vt2+!3=&|rRG7e?O`S5O!&YDiBaiR`WQiB|9SlV? z)pU!zO$g6Ixl<34Mo$8Cg>i$&+ z;L$Sz84Q^QV&V~33*e%H!m3JTm?6@$3tYb?={mXYu6I)6$i}Vs9q>M;!SBjY?TZH% zi;~D^(~m%Bap?N-+ES3+u_jR8TQt4^aY;@Qv7QKJmh zA<~Y8wU~#jQs1y<%Qjdf9$dcF;G*rRRpKcl>Y2u-_13UL%tZCMyh5mV<8^QJw=Kvb zrr~b>xpraf+NH2>I0x*z%AuyBU@>$2cZ&*{uwFM{=oiFKP`39gB%XPec=ox@nXTo5Gf>l_qNcWsiXgb7&(j=jx*SV0IhFy?``MIqBg5IZK=3$K)l?TU5kig8l1d3SB>x@Pn9^zzFE zBF9q*JwXiTn)TGB^JlN9?`+Hy!?MiKs!2!+o{4p0s#k|K{xqblAcwI^2LOe}mau^9 zd3V=}LWh_`G0sC(t)V~cTN%nZzv<`PA`a-N5mx}49ohEgC9mlGk*TXYf{*{2WkcJV z&O7edODZLduh$OO$j2)Y0T2TbP-hk}c&r!A?9~zVs)>O8`$4W)Xga_&>4kI4EX2PW z`0+;b)i8ZQvnW%(|B9&?!UZ(e>YR%~?q#AO8C3M8;4oxB_lCZM8}7IL)duH{tNt4A zPMd|zDHqbIJEBQD4t_7XZyta{n!h`}og!eJn>6T;GtdB@t{o?wCh@l(O737H4$izbIdVvG?L6#&;AlCS@{&uBk zXr)9qH%gBr0-28kcT59Kupm-U)Dx@_wy2AS|cCUlS&6?W(E{cll9P4@FjQ`YKKPO)`cj-1a$?f&_M~?7CdnSd zOFuyL6-0wrC2(fDi^$=r1oTvGW?h=W)ZCNOl8TBmTaC~&PbGTca^KV^8eokYkQ&`F z^)TvhM*aQJ!>9@sqba`99BLSkikO8o?k?@Ur5?uwn*hLzYC78g8LaPHKOvdiHEH-I zdK2QGdriIJ+wuqbsm5itkh8uMmW=zB^xYQ>Hl(9r&0(XL#()c3E|rI#xnFbZ=CM-( zOr6S?oQSGKRCQt)Xd{f(7STH?-eYJKX!!jLD8y~kmG1~46Zvme^}iM5sp}ihy`Fyg z-}L!`C$?gpxmAN8zr|U@^|XIF=0=k$t4h*1WHTOl0^?lR8|C%FsVnff-+uHD>PWK) zY*Bj6@cM+I1XsmFG@2%7f*>Qy}t^SN_8u7FxkAMCT9 z-nKnrd+mo1jg5b!;SDQ@JM@KLv&vuU&HmLrDh6FY-YdTUa(VRM@^Sr-ezVbB(p%)* z^@C@T7x2hOc%<$$QU=)dW%6prX;nij^c({v8CP-_KMkjDS#VS@6hSx#FoCntABrk| z^ljwzlOx7qDJ$Loo!jX{UivVl1V6PRSZk-UpHN-bd*O_Cia5{(<4_}cE=NwWw z9C{o+hw8_pO442-N(}K9>LE-Jo{kAuO#1-%=^u0_dPsq$1Fs(fyKsc5x`x=X#@Pf5 z7EziH6aDBF-)ukz%=^CLKHUwP!ywRtXUc}V!2ac~&$8N$yTqTochv2|E$SV-SzUX%bSnf_OZu`s6S)t~+3E>+pk#Z``u&U8#QyTrv0d zVu;kO1iGFrHgRhEODx^-vKT(haM2w_&dINOT=_;ivSmc3gBo6Wv%t9~qwGHU-?i*0 zz1h<^4pu3U;a}GO^T!5AabXmnSC|Jtr$MI50xv&w$zh?_SG;a4;aj*wQ))1=J23<| z3Ri}8b#Fdt=uv9Cdm@(Xd&Y!78^g63;#FMF_16OY?fIf@&M8#TqNR+1li*Hk*W{R7&% zKWXy6P~&mkbF8{6?07GaftXrtq&3Tn4zdM)BmQ8X@lYQDE>e+BAL% z0NPA0ey*o+aCuyE+>2*feAMM!X!^OW^iGVmbCzfEIYRRE-ZEJ;o^v@Dbv}Ku&0B6iHm?!zt$A?6@lOsWa9kSSFc*W`FTtBN z7283_M3XI+>O7+;2-HG`x9qs1h!W(Q~jxKFNDUc1d7lK=_AEf32^bmAHlxPa6IfJSgY)xg;&Z#o+F zobIZMGV0LtIoSV|3St2hkEgn+4g_i4A1(w`$ii@$-mG- z`RAu!rjDGWXZy1Y=G4#EUC|un^AwLD#w-q+w}#_BU=`05gwNjmv*B2=OOA5WSAmhL z!vNz6-K0ejo!eQ`>cZysYq!uzrl=^mB@^gnGv3wp?0pE4)~Byxd*f#umGk+-2>Q3S z+#0182M;ien&UGRrJ*+#^^UTY?{gjpL%5QBu_W3 z`SD2XSLC*5u=rn$5!-B+LIa}VvG4?7y`R`dX*CK;cLXZ+u(y9teSjXLYj2NK-$BuD zP|3hbwT@P3SrQGQz+|2&pe+|mlpq4}v)be;Z*0QCe${Nch&JLA1*}s}=MBIP9J!BJ zJYa74SKuGbfZFg9!u@W73d%`+tr;6(MRbU=!M@72l~Nmi_am$)3;ta`v-8}{BbLfF z?wx0dA+(43yeaC@sa?kR3O+#8xa4ovQI!eE=`@f=9<|ZZt}ao|fJNb_s(JwGrUA16 zgMhLj;+bN<=VH&~0sqpcZ*W13rh708J#DF_*YIaL&=M%5YavQ#!j%ol2)KE17f(s z+Gu?#DL5vrz#8RZ<_`1;{Sz-eoV3$Y(hI_jW?XDFtFxRtQl^Y_sUHcximqP)ElJ&b zKG9b5UuhQCk^TJ)VXi8JfQs{ETm~{pT@dBwBe9CdD||A6=r)>32&`l%YE%# z)v_H2FeV0K34_L^hNe@-r}Xasfw>>(FFm}}zj12C!|Li!sA-Q6p)(t88BYhHne=Sa zr8nOzs69XI)lJ1T_YD?R*XM~6l3>Ew-C*{srF`A0SKRev(+t8**WZ4;gtX}F1`@z$)xJ+siCU3 z6<_pzDG81I`aINf{tV*u5~PefS@40r+=k1v(lFM0He5>_G=jOARFGCae#VPd^EA?Fau z_ev>8;|^VcKF&XW=Cme9w=Kp$8+y+#s<1rR_F7;KVlUoE_knO}M@uSH_Ux-os+keI zX1s87S9HmhsImQb)Xq(LemlZ)9Pv1knrkrIMJ)L6lC#E$Q^_cxxKsPk6->lWXyFTu zv{>e-VZH@ZxhI<8sv-`VS>F?ah} z9oUDsq@!E05R^^Wf?E4Eex-V1ea$R2PU}tJUnhRkfsOF$o38ABP*V5QqL%TIT&$;I z-skMo87_xAwQjBysN8>!e%enfIPwuPl5z=Ymgg7~?A#usA5$_4AK6|if!Gv1vT4xv z)j&2E`qTS#`r~6dPqnnCFE`0dt6(x^{DJ!|sN`O+Inpqv zcQqU%+RX--Lma7%2g<;?(u#*Mr?yKu+oc=043Hy--@l}3AZ206Z2z!rU`H$zC*jj` z@kG#WJM9-cUCU`;0zd=#>s;hK^B+iL4c`s`8-a{aanbso0DE_7O%L`~8862}oD+Qg z&P9U3?#Idj0FL|

4R&Uc=35HQeg!X)8BzZWJIdikufiyBiD7=ZW&XS4{oul}n%5 z_T!ciY0DvQX{CIIb zV+9u54GqTRkk&jNrb}Wr4`C>tt%B`^#Nzdmb$__vT?_=S1~^1K2Yau2C$_ni$TKtp z8$-Mz+7&1E>Lv2%-KNR|hN45L?dlGv+tll|qVzj3MY>C6J!E#dEXN50{k`TDdOznj z2^xU+4I<@I&}~}BKuvBfxuZ8s@m8)v=-!pw_YQec-Q;+5I}fguLmdfOZzQ z;7gn!a!F@8tn1HR@1UwPM+SLfr3fJu-_5d~HT&dW3fRroTmoN6&JAJa`e(7d1^E{v zc7<&Ac|VFcDa-dtgdV?coafC_Mq?i>RlB8G;YhI4Vx@za{P1xo1)md@?DB&+^hXWu zjD{aL!j@HW^@_p%!~!BlTbIv5#-VhH=d@w8zLs-%5=b3xGiZgZ zqdKS+IIBOZv@pK2XA&uq+8pf|4qR2!Geo!pAiL1Mq3N8*?qidieO z6wr7wDYuHDbdU$zL(C-yP&>1!f66#cXgCYaF{SeDF}daR+>O%vy0arHP>TTE#;3}g zBMl$j*^I^#U7I8P5w@eV-jqQI3k9#S)W4H;k-ax*X8{qY)eYLUUq2lPv2Ir;MMFtw z<%cc-meK5uzP76JrdodJo=|b;iCM zQZ608o*4F)30$Iqj)6A4YiC|`Ik}1Hun*N>dn96w8je>K^c2kRRuqn17?!R+t z7LD!dcl4h4t0N6&%E9;DmE(&om+Ha0(BKKfPzg8ZkU_*D>uGg2=}?$7KV!_44h|T1 ze=#{RJsrAZ+4tQqSgB^4v4ETZxUCGrDyNj}VFq@6z3Ye|ohj3;xb3%5tZVA1VznDw za)`ZX6?AIbB+p~AEO-*7Sx~tVA@@S&hXY_SXjsfj-m6?50f6sxMg2vguQ;oyubJ9l z@?mP@2bj6xBuGxyI7h1aN5*zV7wjamFCPd~83UT~!V(MBe~!5{cY-3nZ+J>*mfZrN z$riL~Y)_&Sg_q;TSL4H#@M$9$f z^5x63Om)1mo(9-q1$vBsgP4K_1QxX**8ew+a8W$o__I%c$&J%hc3a}yN59%h)Kh7F z*BA%-Vb2c*Dz40~5~0E5&Ta43y{FW&4QEIG9AY9FOl5kK5+)AL0O%9h${ve51!XOx z@4+fpEwE)mjEQB7zYWu2{v3Qi@@ZPCNhe?VmQ+@@1l>-9Wc{MMVx!_S-_RJjy_FpG z@aX|pD_cG!RG7Q}M3nC|^w@bR?%%|Y<~5XJgdJca zlj-wkMGv->0P$uj>z+BioKQ@$?E9%2HdDFT=-v3pCA{a-_i2*np20}W2lZ?S>kzKjy?aTCh;nk{1&0B{GQJ(0`y)!4}8mK z31_B5SCMX{o*+Y&kkxm+x0O#qn(MSTnPZy`*Q}M&-Z!Qs>6=Yy*@G>yK#lSDEt5Qr zqqF)4D08Q4^yApeMBpD9WYMU|DFHavq5Mz_5rXHy|IS(_#H&Bpum1D{jR-FGw{?Jk z-Ke=VZf*#6IgB}Xpf-v=JNEc@UKUArT|dTHb~W8^;Nc~XzggOJhxBE|V|h`@smua~ z5bBC=+ICOf;zfZk@jVv3B&$7;8@Vg@U)r?F*O@U=GJq4}WGLSvFzpj||033X!QU&- zdU$p%=RniNP{Vfsf5;Yc&7E@2ao5US_@eC?kTxCU$ONvYgkg!GnxR20U^}irGOoeN zC!NW$R9X9>R#E^g(C{R99OBNYO^`^pW zDviw~5Kj2$0qqJhrEKUCD|EHYWr?C~8~^Apz|m?pQguKWj+u+f`k(pK13&`G|4Q1XtG#?A&$RMm(ZMW^EdIua*F$ z_dE)_c8LC4oBn$vy-#HZ1VQer+f;$s@XVoHQ0ml;-~6|9JN<`_YPRlY$mjlAlG(KS zogcb;vk$z<)qUVNl<9X&9Fg{8bzMu*>*<0+Hfc0CZ0zN7R+mPV$gdi;)ij!A?fsZ9 z%h@Qa#S+c7n&+RG{bFmP?BN`0U>NnjeTgu`K zVaH?GH$^C?1T={Tj&r?WxrB>d&5vC9WSGS=6o8X6RP;&gjb!$yLd-Z`6uUk*Y&`FY z5E{&fgv14x_z``EPyQ0i=KyeMvzXE+`~7y+ zNXo-`m0Km2FKi?b{2DN+t^);X#(ohu+o8q2HR0W|g(HJ+QTV-A%?eo5!D4T2g|e+?`)Q(>;c~e_Ol5MIi8=_d-*e-8NH#9E5zWGUe_V3?|A8z#S-Es0kUEo=j zJ&u_tyr4F@GL%KbPkz9>nl$twA<#@O8PSXTTKF8n3J3yy*+qZE9 zc3|^UE&BB2W39*)WBD8HP_9deZ}^}H?dxOS3CFp&=(;Hf`FiA&8@YzwXvggDmqQ(w z1#YJMnx2G&cMq_YZ8~cVL$!{_ekrgxyx4ixGJnfGWt$viW>|E;RV9k>fF4+CKjq$+ zqd`H{apJ2N@rz#BOomcoGuotCIEwA3Y<|$NPK6;|xj3K_Rc$zgLR|vDTXXeUJdI|B zy3+dFxBiD|WBxh@H(q)EJaBk1a;vwx50>VdWlkygbL6)Gz_&k)F~MjTkwX2&XQbWt z{$($8SErcSLNv&zN4l*W%%g|YO?jezq;kq*{0aFQ2Zd8BEOSL=SlJG!UA?;brEaEw zp^nX~g?{-i=g-pVXvdE&=?@$iYm7?mg-sI$h9qQ@o?Z&S?e(~~YH;oqax)&Jq)+Gd zX`^DY?HT5a;|phYzo$3)IuzUvsL4AYrNLosD%H( zX^@}Ke2JM~MMUG3EU-}sN1D2hNvh7yCYvNU7zb^KPRVTXJErHqQ#dh3^K z2-yk11o8bQgJ z*GS1QGB+C}1@}HGY395(@KPHNHRvPGN49I&|S?Ax^l;Se}_U=w7+v+`wRcU{fgJU2krMcJY1bRH1tF@{hLJY8A)gR z!+@oc#3-00^P$x9O>@~HGq^)E*p2~L<=ni6Ba2!808x3W1_Q{}?x+)MZ%aynt|(wJ zrw?tn-c9CFmW9Z(m(A5=4(V7K(tm83Mhw;w0xh5b8gGz0NQ zQQ)8~qJRaLG9Uz^v5L_;^$=ms{`t8m-+>hk!=q7(bwS+jyuKWr4lHxC1fr?Ky5Bi7 zW|oBFVi`H z$9_Z9^1!upr5(xOE%uGJCv#q(YDo&Ec$=oju?Ku`*!`rK#S#DpH%)%e_s>xO80;HGuPTYCYN#nCKJwWB^N5j?PA z!|%K97@T@Bcfc4QF^M#dR@2-vfHj72T_Di|O!$BtTcf6IDup6Mg=gIH@s`_b*a0`z zG?TXE7caHDb#7lj;+$=me|6~-(s=>dIzMYj5MI=}4DkHY^~Czb^7k{-J?-23I-TFa z>nqpAJ&CAcKut5?QC^IA375*7tv}vPzYXixon)RT z@avFT^ic5gK{0B-Z12iT>Q!vipmv_P({c>UjhSbkt>8!2Rut^C-+kJx7Cz{r?|wJ9 zBM|M`r{utw9Aw?f4CT)jLR5#+P&SmP9{J=O5(d|oCtw&`6vLJGXZ2S}A*T4%f-NU- z8Xg}9j4vj^9caNByT?!oiHCX~=?|yX1yGuD&WsWBbMz`C4WBX$IQzy9A>ckP?}N$; z(-(}6TwBhHybyRQ$fxSwgJY%ksHA7{T?cI(9l=O@i?5dqCdW>T^Svf~EEC15CtAXm zkx!{RR(qN7Xeo3GG;{t*rqzIzIZz>($a9DtIvOsaLS4>;Zclq0`fwK|u8_ zliZ=E-TkP&H7u|?H36nw$XafsBReYFR65O+UJ`+5)b;+XV|-pU%A-CZa1%c#%jAOa zBZTTN(K3Ei;k{zRwCa3}?8U0f{rNz2H)Q%1tP|{(@ggvH&I2EC?KdsR#fu_fW4f`h zO&vTW@nXNh3h$58B=F~!b~OX$rud8!&yw0My6iy&THJKS4w4S>^v$SUTBK<%J0(*60?8n?rvdxty8MPd!uyJFZ(pwi6aw09a?0qUD;3^qe{iXeT6?yxIS zOjIffX$AZ>bAI0nP{T$pQQxerYG0`@d-=sh*~0^++6M8g)A3uYp8sz^wlWYgJD@_0 z460$i5RVyjFoT?5%uI_za@{Q`Kv{Ghp;3H?=dVVX@D*3S}kOx~-FJnzN*x?}BEiD?2xEve=sLB^aKk zC7^#Bt=h)M>(8Nx%6A-R>E2CU9h zP&(~`p>jROm~+UoYcm69J3@C>#`t2TlPl+#y&5AuO zSNcj=;iU!~$MME+o0%buYbf)TN*hV}TSEmGr4%bRa6V&E)4y#%-cQ$lUGlAt z0KOo;M0AigP(UUqw#u@x*6k=%^1PP}qy+%^BH}{1>ou77a^fF^*$m;0-RwFddDA37 zmBo=%vzwJyZnl#yZVXcv19*KT<+W07+Cu!SE)FSYrMh3xy>w|)(5oc(HuR;BkQtTQMn?{jw(-O}!GhL*LY zBmGVp2C3iciIak~Og9y~q#ZXsH@mx8VHX-~j1QHPP-ZReZ6K6c2qcoFnI-v@1vD<- z-Dfrx1LdkvAjKPjdir|t3quI=(W^(!v<}ts|F-Jf+vl_HoO%s&tWq&Sm>LyV_-(Oa z1q>p2izXDH0USfql<73}1$?o*YX`egD!*qtz+V1H_Vo;jFBZBlh~0&sP{OMpO5bK3 z6@Ko%a;xjZEk}uVGAOhFV2~Xho~8F4$#G2e3imPDS`1R-<$A%)qz$A-kkVeyF)cD2 zN9*6#+g~`|FSRx~v*#VXx@LQ?+v%iDKS8EametJ!bBoBBkvB`fOA`fW26%I@H7#~) zQ=`t37@osKnz_Uk=OiPm&sQsFa+7zE;J9gzg*9{GBhJtYuFj9wxM$q?S$&#$bL{5k zXI0hu12YXF7BEbmmh+}5QJ*{3%zzIx5J}pFt;Uh=SBzbLxmUhxPDm+!7Dsm15;j+U zLvKZTv{o1BJa~)d)Fl*pxz)%gjh#Kt8((R+laTo?UeD%USqb%Hue=csy>)~UGEz+d z0)29vJI|z`>(hImfdoHyW{r(r{ih(_Zo{>i-!h~L;LYAOHtjrYb51gFr->Z|RQBkl zim$%9@iVkL(g0;?B9fNhaoc7Uf2L6#@)K7?d;Z-farjV+#m4yG+6Vu>Zz+A=WZxKl zwh$Vc%)$%+vEN+XpRsk9!m=R1$0Tt7SiDj#ZZ&N92B|+_R8gF2Rs37~(#Wf5n**uq zFJC_HrsUE3c5_nmGIp~uXn$8&*@N?!R9KNd6^Dm_1{vvFjg}A}{i;N*efo&lrj#Q? zOn%8TmFZTm6d=5qqzaWoEtFGVso2gU{i}mmbA?{sH%koZc{Aj}*M5UY(xlfnSBz}Y z;HZbrJAlTD>-QrzH_}pd_GUEU`*Ul7Q`v=U=L>HYEAmW@KvUtcm z)~7!E#U0niyV{$!K{ygKme-vx1A~ALt7Sz(ZLspNl#Xr_O3NcR#e4w|;o^Uk))*b0 zjt)!iu8E)@!QMNOM$T#fvAAURHiAIEib-}EJrR1W{S6`rr7@Za$ZvOilUC`dv=!qT zsn3DF(vW9aNo~zhk<~uF#f)-+FMl5|Ah^GMJLAYoi7oJ0J%HA#y?PXZ9&S&!xQl!!vtgRVA@MvsMOKB`rYZb3o#$ zbQgv^F2*B-PnBqjk+CJ;;SnU&t=_F{;Kz~m$L~#}|9sSOG^#~w_nM!7N(W-c+c z2Ci*nEa=lqlFol4PkG3uh|OtF9YpS-n^9m)I?&ZB#!*Mz`$n5a4l6U}vR8(d!2?JMbF@F`_GrVAP^xnC{O?A>qrs1RobJakVIU=4B}8{KGW&H8|g>Jk{;=M)j! z*Ie5NK~uq&S%2*Wf0~UR+MM6UyXmsW1=HbTxRU9902EWg91DS|$-cB6_R9b8B?C~I zM(elDa7#Pk=Cq>v=aBxk1@PeiHFO_dN%dhIz}d16qBu}d0S9Uh+%pCD%3PVN#E~m2 zb7dP)5l4nIH7lH%S}*2Ed(Ci<%*d?NvT&ts%Z6ERzMgacgnNF^@80M8e4cU7Cjp5y zX#>a~PY#~}rEAqicpwoL>W;Y|k%`8K2DVSHBf1r)Pv6_i>hle0Eo|}`Y{ChGQvb>I)z3n(kYCbpP3P8sIkcJe%t`yhqTZg;wD%0UlH|GnmgnMR;S|G2gE zk*+cE)6ccAlyi1QLw84S7&kQi!%ckS(CqME=l%Q^7pt4e+JM(@?{9%kw6aKb0{lzh zW%m-jbfE6#OLt8M0QXaYr#Dm9$;sY9*8Zo>@gI?Y7kB%As8?8hGR05g1Y?lPhtDuq1$G>C)TLbQTQ{g=wp4n7c1G~qknI$p`(Nm4>p|o zV)~oaQS+G-h^)hx-FD-EGv0Ism7{=gwmiCVspc1b?WpSvC=NB_4H{R^>=|9MoU2fr z^8qJd?Ewu)kNh`CNArCabQ1nv^=U`k%%ZkQ#X~U1K;1!S-|XbZ8M{CS)s{Ohr~3XK zrU~7~6qlK0_?`ZXqagL;vwMesewx3R`5pVJ_Jl#0?K$c9P7~J)!s!`G8)JDEhGF-4 zTU(_cRzEMho!_;6^V{>=I~mjM*k>tkeODe{{t>*#2;!QrV9d06YH~^@&bNNMAdqe! z;Rx4sWH(OT@H^yQqUrWkO<`(#(en7~@w3LiC+ls`$!am!{A_-6y)3=qIEAdIohtWE%x^f%i15;6c2-BM3u(N zyo@}eS9&;y7*Sqr^A%8$-;dO*i-YZQR&Xi}h|j5)3yoiZ%BSkyjwKiRFJD(J+M+ig zo7mD|#JX?!x_#XuH+34w5M z+e4EO2V>(oMx=>xE-ErF^g!EUu3kf8KSHx=rXNXRlrMC?bQU8sUpr&H@>gqidj&7` zVwdKg)S*}z%1zA$h*xs?3lLg4ey`0JvW)?UIOsZ_&v;R~w>S9P6NAdXjbr9Qpv1R4 z1;dv-FghtxMB0{6#uQ*}M!n9K+Xr~AWjO2$y#ZaqetZ}+hEwx3RPAt#aFHdKF!}?G zBVtJ$0=BN_X8wEs*k2riFhkIzV0M4I z(bQQORpJ-yqak+_>!ZhEVJRmk$Yd!6lXqB%W@ukP2p5P77H8ddqo3&cQh4B~GcQe0 ztBk(kTlzH|+ZmXd_>((j`IVvalbMY;JDQ=x@iES6bn*xx7rRGHIkbdd&@|UZJl|qn z@bRpXOo1bnAuPMv9_=IYLLs!1n%UR`ur&;X&Hq`xPGg~2MdPTjz{QK2$0zh8PiEU- zeI@VaujofFpv>;lT{fH+p`6D{5%^+|dhBFQv6K_icc)X8z(F48J&pA$Zq{}MrV6)% z=cS{-)^kvjgz-$lCkq;T_=9E!rM&Nss~f>^bFyS+j&)HH$6l%EbD^ZGb~lKL?+Qmw zS$5HVZ3;6Cn5(BT1lX@XvgP069F*o=qs{NK5a!cBw5K-^HD{WkB>GHWssKuZa_lI8 zaEB(rOg5E+Iy_zL9+xueGIMg^)S5lQ-PJyIg5e>Tuz2XI0Q4zJA=6FvUG!(IQ96E6 z>rSH@iPAJ>`O2ptxwZM+(ia~ruOT-wP)+&#;@m!AlxYRy2-nIHp=%Kiw;H8uMWL3Z z2#LV^}e7?l`~H~EPFGHxcD)Wf5hlE9eqg4eXO-$ zZOKVRvKTn{@~HpuwT7%k+NfU28{=pOIL^1WS=*bQ+8+V>Sd{4YYe;OKIri{lk~ydm zl3h~QQ+9BO&sRN^ZPgi{!9Jtz6Y^>*>tikuSJaxOL> zAuPK{^f^R7I*k^5IAVkTd2Z+b7z2j+Pm*~P;6t6^PG0>!5l3-+Y>6lBEs>338@oPw zfLVYv>bgRc1bGJ%8VXo-85fWzN9lPoQYS@``g7?Eu{XwU!?n>i2H58>c(A<4#0=$w zcXK5NzWH4Fk)d1*xGZf4hKE=fViI!!5Hf&*P5{6Kh&}{+JMpUR^uwb>Kk?q1d3D#* z)RfKRq#chQ4#^}gN9S%Rh3S@h9#(h2?5nSWZKhiq1ClyCTC;FHI#$)(YE<*_hid1C ztY%+Y6z^(#h~Ovv>vgWkd<06@*$7_lZ2|}~wSl;qM3~`d-`ORQB+-^NGw2*3k-@x# zBYaai^|bHIs>ADOy`f9JD_LhhE?_iee?0qj2zOfBwv_CfnC<7U%LEP%nd?_!?Jf!Q zVr>ddZzUQn3?8-#KC3|Hh|1T;Nd}x?7fY*hV^po5+lN4xk;SjbgV?^^4L6XXq!M;k z;Yj6O$Ro|-6QH{93;0nn=jAv5VU>eNcIn@RY62c-Z$JK0t@RT(Bpo{bTFZ(Ck*uWi z{{6%LmQ=64`v?W8x;WhXMWa8?vdJOgv_%Hj$KdqwDpRslhScd?!-q*A+ZCG%5A=eW zANKIg&UL8Etxv-auJ-)_4?)pcj9YgXXmDrYqgS-76VCcc*oX>cObHX>$;-gcc`K{l zVA826BX*OARyLSFWnJG6VH*Hfl|^}o396>ie>Fi?S7&wiLJdv+q3)4|(8Dpl`2ReW zzNTH)!D!B46Ann_#DR042^iab1m{NBg*2 zDftE3bL<^S@7IT9o7QR1&@8i&Q&?22aYkm}cJ`{FmR@>9&XtNU4U+c?zPDJv^C=N% zDPN;PrV^YaXv>S|f&qQ42Trk&TEAWH_}QmNB%))pCw58G#a6GAE+w|rHvX6HfqcQ` zWz>O>pL>B)e%p8ND9@Q`*_&msGoUnAC+0hFjBRxWPp1iHpHC-8Vq%Efsj-P&|v zDmamwhk|%_v-&sOA?G7Uj)31V6E*+tSSZ{BI5 zmgto=bN35}e8;N^@zt1@%#(6;^d#D9@EiKA8}xIJ{Hqu+i)ER?u?PlGKH*J&gJULD z?+WLQ(iRg@A{ME`?K$rcAs68317+Lq_{U^i2x}4gNPD%T%^%Fz{d3iFxA^;SF>Z?Y zKs=eef~-%m8Bi^)Vh$0mg8D3j>e-t7oHX*32UCdJbCl7azX`-+!@r!pw#6TrBi z`?20eA_$&g7$HP%iP89@(rL(J(;$|O{T0uP18emDIeXF%!6P&|=GnsBvQ|YwwWM=G z(oqRWG%=Z&Xrvy#6H5gzs~1%P5a+OI9Pv%hhsotm;xlL|1+|j$LqVO)-$JL1bD7kV z3B*ewI`9kn6JK(fZ=>m`d352wgN^O427dC`7&Z~%>18_zs0h`^Uef`91>Td@xMks3 z2@(1#rX34AN6c(b5hJ(phAzR)pb(bK;ElB^QVcu-{2Tpb`mJ(7pG1W?c!KXNT$27Y zlIshwJ<69Xx^WD`)3=IMYfu;2)Tm68+}uayc@6TH5-&4|P%9#w&IiNCl7oplQ{LzX zvP44xLf;o*m~$ZT;pd|3PeX4$=Y=a&^-)gU{IUjse*nDKcl`S8!OT`3yX@h}RlX#M zg@u!_U-`K7CO1bAtDuhj=Y#$mEuT!SEF?u`t0fi^KNV$AvBs5(pk2g9{!9YHb|&gu zeY69CxE3ZP4U7n&1RkV}`0}A9hNCHwTQ-kzyWNm<#?}w_g{#caGmu3U%*m4Li{p}U z>tf8Zuxz^=pu*;Aq8GAepoaVO-~mRuBN+$FS#4XNw`ErGZ~KkjlCkgjR`>#F;v_;f z>N6oqz9Y#FlZCy-SY;D+!y;45L}mQz zPj4@&odjd$BOVV0RL*_`j`WdOyr6&N84?0k0{jbS&^X-5V zucQH|-N%1U?GgJHLdu~K>B+IL?~q3sJtZv=6@B>f*Rg{ipRS2vfkLH%epPYbf1z5p z7gu4+pS2RgVdoz2URIN0eAN0CVVZ9)cIRez{%AW`V$aMu9_c| z6JahF<<$b$Y}+BX&hHAm73`ThK5=uzJkQXQik=RpvWEaC#OCn@K*KFLIPp65M3+>Yg#fiR~N0E15;=JXZvZ}>b!7nFIxwrlGi5$sh3s3df?lJ$aBY$^1L7(r-6 zx^{fzit$x_@>H1PoY|vzdZ%k2wl0!BQ6x;^OD8*-#15GfN6{u~&{I!y_Zw+*AKure zZ8I_q zaO_@8J0KmF^hpu*OG`Z*y19CO+ZHJ6ynvUX5T21PpHIswOX9;X_>)}GRm97c@bhmN zvm7B787{-=vjZ(F>1x2fEMBu1jfO?U?zUHbRbBFNTGpS11(m`f4VW!r<#ZXM>Zv+= zT(N)@Np)tbY&kghVP7&4HRh*|U~D5|P*=N*Z2}?AM7R^v9z%!dO4cji3HpPCbY+3L zG>q&12E%*SUO1@rGIHJ+52VsW``pxez`o)VejVEL0nu3Pt+E+){#SgCvHmMMVM~at zLMJwBS1h?mNGG?R}x8+Ep#*kCV;4C2LEO)@lbu)g4pbqJ}_PzXzKX8v9al^{UnU19qTb$m)Yz+-9 z0L|NbY>Gzawtkd4gZ&u>r=o*{%O=#0czh=p{y?GWvLCi^TQu|x4HM8!(E05as=)nA zl9xf9l^U+vSj`F+FSGe_BI?=zNJVjEG+pYSc zTIB;!{~cYmfF+|+DPu+df)4+}Yd{M5a!27FY3{XNY?W!CVgcRJcXuSr)zN!_Tb~2v zuR?Qet?g){>pTMMBO+gJb?5DheSy@~se=v1mcaqS>UPwRc0wyyZb{}sU zt1K$KWUf_k6Io_HU4NkLXNcUh@Lj_t)-0*s6;wbFK|evV*hu*$NpJxqg|t4KjMHvl zz^0(KgZz%0g!38Q-|>qoQ*Tw`Ns^G^voH%=#X34Rx_$DVCZ^oM`!_BE_(m?fYmZ#k zM!GVm8hM5%^N@*X^pU>%R`Smg_^Hz}WzKf%4q<${U+~d*ph$OZQCV(YC3t4XKT&X9 z79&Ygw@yo2^~LOV?sGg)H^C)z0ejpW9n-Q1RSMm>~{iT2b_@FvQY<( z5`a>RL~)}K+XE;TL?Q#hvcI&8&bQ1U3dF8}Q2ytWQQFW~YDbzGsF(c3-W9p^1=XIu zlG9ZsKgtw6V>5Lk9=F-5FxQY6YYCB=wqy9yL9lH*-Qwek?vO{1+nHwo)aeA~a$ET`Yv5x>VsCUX#utr9Ps zHfvoV;FR7SoWU;Wb7d&HWn$ri+f~~PFx39L-fN$ezwi&5UH*9$dFr!H$hqgYk}MBT zd;MtM>JD3(ct6(~a^lv!<+SOeoVGZ>mv`Lq&?kX?z(KTe`Qp}Jq)qxd^*BxZMhL@^ z9irLo=}9ZdV%+pT&tGKcQ$=_^uS8X_^6a+C7> zT{owTJXW|Hl?f}E$tzaRn8%%D_m`76IKv4nSlIzK3ki!LSh`c~oHq8jPIH&@P1SrH zCe71)ldro?^D}+TSKFtjET65-`kKt!{J{GfkhA>lewoxu`j>KGbNd2j2QcQ7;+i_b z$68TEBfICDW$rkoP(c5IlTS@SVQQH>8BIg3d!Q-{o0K2nB$X-|H9YPYlq(Va z%**Oy=93_kRaaTr=t(QXJ8$EhlfcN(VUcqgwxH@8`c1aE98@)0orf~gnh2}}2 zK(XwsleySX=heWB57KPS%jU1i^aG6SCt^Pe;Br zKifsh#($i}J7)Q;dXox#TwBi{74 zEjo8D&cD3imgMf$wFu`+UXbcn+XyuX%iQXIDqSA_&nuO_gAMExY{orBxro-1)=jUd zLXE=;ZKcq8%(7aR!x6i!su^98?H$d6!-D$xBD0Q}!*HDTpdd^AJv~H)W<;{sXW`FB!CY~;-d`Xw7E3vx}oulqex5GSIe?7ZXGc6rPtuc$hzn1&J9FG0#EJO4L zz-Tn(7)(uE7;k{AX^8O5*Uk6BRse=XFzS5FQJ_g+%JLHq-4&~f>xSYE3PG~zTm<-? zG<-V_K8%MNx#qd}c+C*cd%8+Q=W?}t#aGWmYaCgGU`)_AvWkk4ZwI52(69k&)-aT? z7W!oAY^y))aRb4wSxiy_4BgXzVi21(E3iRL{Fk0#;kCP6B+??fU^M)vH9k{ zwTZcE1i4mtV}<>`ivj9BqH@Xu*%b%6%Tg%0o>H0218eMWAEs<6K;D&0K*C&~Hl1Rzo=!&K!hvcX`Nm7tSUMPb_JnNWy+#>ZW%B!cn3x3MV9eAm(mQRhjH{TWAThZsDopF&r0mXE=hZR=X)W@ z?5kzt6?i`|K53?3cIxij^T&&-w^Q4sD z*Ko#<<6w)U82xrU2Z+Z{KZ6vZ*S=7x-p z)h==*QxuXdF3t;`+d_P^3l*YJmR)`5eo-`0<|!hEzpiEbRkIK><7GG;apmgW5gT%( z`ax%8j!yh5$Vx^a^%u-!xy#=cnyxsu>6n&y2Gqgh>m935=4Jh9`kGI>xgh00+}zsb zuuj$-Z|)M6pLnY1{zGYk;cPnIRRS?GxT z6ZJjC#=N_}^62fj0fm5wkUcLCka00E`l{&3yYs5jRzM5&CjP*Mn<|O#()(`Sx6DL1 z3V<)>^|z1`kHXmEU13t>u{rGAC&~A^xWl_{e`-LCSofElv#8g;)1z|eAISMx=B^`` zFZ`#nPs)xKx)64Ns=8Dg1UKdbkXWDtgK0_C-0?NihqobaSk;Ys2u2H*vyQmJNA?I% zJ>IA$Ci1r!`%r|Q5}~`VRjCE)SO*Vk8J=K=> zjW1bmjIfrIDiWzsL}*<2fw$s_M;tSKlG3e0Mam)yIS9e4n>wYc-8T!H|9<{H3E{v* zxGbWSfk*R}EPla|=i3vaHDIA+T6`VYi;;Ys=5GjqFUW8PnCL=@NWu?)pF@loztetG zinbYnZv~j*WOU(AsluP9Q&BH9-VQT2DMH zILo1;&HNR8pXq+5`KVJopF7~@dE4j_9-ic)9n4YuoUJjxsOPnrAo0Wh3J@I=4clIX z)I80KO@R=Z03;9Oz=XK);!!_U=*$>b8pM?c*%-3VzU1gBq|>nlZZd{%ER3zzlOq6d z<~m4!Cbc*Xlp{hECelK^Gxk%Fm0u$XoxBmv2P;DmpR;)Pee|nj> zyW~3})mwrtCM`A=I*9Uxtzor9iM!HZbFAtc86q$#gvAUw%Z$!pMsq|a0Fb619~}QJ z?MNrYG%j20XwWM>wcHtgPV2O3s+mu}+2$^vR152ROqhJuA{@O7%-QN+Z=VMCRm>$@6U;V)K;251p0BZo|? zYp4r(M{9S_B<8(dkK0oy^EeTz)^N!W6#X^ZY;TRUNj>LR1AzlbrcjejC9bX}L$t9M z@C@eF93>?o&|eX9PyjVcgZ}A=7^{s{{&+0WrobtuU2YG8?o5auph#4B zvp4|QY@f!p^^4eWS(`vq168U<1p4p`vX5D?9uCW3*yYSg{BS^xGtdQd=wT81#d_5b zf#e5j66>cy&yT}7mmEvG>!cRa^}Ip*W122TH;tZ14LQk{eiGb~r5u@}79!lv%6|@} z^1-^iYZ`FpCgK@87N=x{VkEaOd8(wBitgR<=maf04&Y=H|M47uOn{aMmS|9qYtDjH z&P4WxOFWW4tE_l-SW1OixL+r(CI^dR*Id%CykzST^r>?9Kfv?xk;prNn5s7pt3r6( zThvB8uH5vz4@g6sg^XIEWDZasi;x}Ra4#XqP;|b!()>IYZ227UB$nyLgfLl3T|mw7 zME}Tks6STOtgQY^pMhRxjF-2UpP=3g0Iw1tt}zi;iI>g(g@5@jA6s#=ka+zX50S*k zNY&XngJeJRt8fd@?+fjFA3)qv*t0<~`+ml%3snM7>v+|ItRuFWF6yS)chY6vV=qx5 zK#_lGQB%l+7gNz2$gHq8 zhi>NWp2J1kHX-427+Z+;4p^uGQ0-xO?p&)^Xo9HWB+XWr^X%}fC3Fvs%@Laz3!sr6 zo$r$%mQgsmIp0uJe+jo$GsdW9&jsxF`WF7Au2UI2PP*fO!z@+cQ+(jR)B ze(`KLY+WFEY~`lbdN<$tu9KWfC^Oeh4pGcR=`HBBK0dv#zjivvbGRhv=Qx^EBDpF! zKP{zt3mfglHOowrPIojjlGOt`Q+gBSxK_3gEbavv?~wg_kN}V+gXtlF8Zwn$p+Fx` z54=HX2F@`g+F)9q5-0fQSC+RSegf)-HIyWTY&JLi+I881XZ&UJK7k0!jE=3NB4WI+ zpPe*@qty^ipi#Tx?r>$bhrREW)IQ|($LkIJ zS=`}vv2*|=2oJH~ITEYXoJ^DV&tne@pzFGizPyAU#J*@dI}lEj$mYXyiHL4J1UC_$ zCr0d7maq^%a$vYac3&i|gT5RODHb6H&%`#;Ca!zO>Nz3zJWr_=q6??&DHBrN8^?=#=V7NWx!Z`-S8uGi`UHQ;Fi@2Aroa7*(~sainAqA}zEF|%p6`f&inSWrRWx5ijQ zzal|)1c~M|1A$ghSRd@xnSS-g&f7ipX3?o>u5D)jKCflKq*h4BPJxFA^P4AN5qvi! zOR`pkYLPZLTL|{Y)$cpHvabLF<3hY>1H?AyANvc>%CY3s^uSRGV!@lbr#py`{6Y(; z+gDT^5VdOA_oa`PQ5aPxWIetBZ)_}5b#UDGTONAvUI@0s(;N9#uzb7^X(Y-~u>vKn zbl1K}jo*Qvd5B^@assOb`kO#&DqmzWGC>-;Cr(DCqNn*pq_1S2cc#|nw#qjk{91w5 zAqT(xCX8{^Q}Hkwc^IDbpFz0ze4IX^lfe{mm9C7fc#7}&D}vb!_~FE7PdJ@^yxtV* z(m&|ST&!lw%}!2lY6}0k*>6OZ7~#lcTN+;^h+$d7tj`6=RFT9`mgF`5Os@}|xDLSc zfRa35T~DGmu>$n9V-t1hSRa@w7 zhBA1kpt%X)ad)2=C4y&vJy;zBRtV;sn7?i@&*$DmrQ--GSfI4a!o@h(zUyvd8H&PW$6`IQ){|%Nj4eYvd_4AMW*UT?tCA_HM&e!Ya(v#El)LD1s z5A@V9Pi2*_Agt+$cZMf)%J<{Sl$|=Fqxo>N`)&oVfLC|zuR$4fKTh2*aDVjQ%OvzPFDO{8H4c`?VK~vy0K1r$6_>CM|a%bk2S8bR*BBkgeBq(UXvAg^Pu|TyUv|O#r zrK?{~I-#G^+31tXgEVe%lGH{K@AgcHVx~_lP!mB4dqe58-ZqSED7SKO(s*I}}@mZ#jW z3Bx&{ftfit&J5dJ=~&eml2VmOWY@sdIHQYW+-k(9=BU^-AKnh`b^`(LFhU%>^ID9l1q5D7# zM3Y5CHqA2e1B+&mtP3LhS%jNDW=E1tJ?t)%I!S}VR=>S=&{FdNeW_8MYw#ddYNl&Ho<+TvrXaAc2LdwJwn3gkR7 z(DA>PyRBo8)C3*YsoQ< z|6V^azdc+l{rE^s5iu?CVF$vcE3(R7eVK_M3-anirVsq&swG1UG}TumqYH;33v%km z>4VhMdG^c0e>Jolcx31UHgc+o_-cTeV_#(zlwWcsYW9%!@0~(iA%EkSPHmM1Dbv6b z&O$gk_dzJjLQPZIhx&wcIt6ZAPD9%V-mPFg75<>m-QMgiXXQs?4^{kgNYA^x&l9Q) zWv>YsrUMEf^6fkJa-CR8t(7AQ6E0C(5|3~Q>X+*mWa+0@qt0kS$SUcz)bg0!LyPFP z^li=Tm?QeZT>`mIc#74+g~@a^vecK`f#l?%Nac@-!?KJGMe-mslb#N>XrX26@fZ+C zI9s}ipL?{_gE2Hv>*`-ZmQ&CTf7I+Wz(|p&%=Bd)TXMj;%U1A^*R=xNfQ4(s(PGmZ zZbALy0gT~nojvyFxPtMAY@zYrvtxRIWk>06Q*8NmZP?*Op}brp(o%QP`K)irGp)c5 z6QlT#cg7dOk)O%MUo@)bb_}1=6PMLPs^CINj zWRS<@{;AST;+Rc-xv*CqXg!0lS9f6|P6)wpGIv1st323Jhb{}WekCj~wAq%?-m9*? z6{&i$uO^&OTfL7hb(km0iec;QuvqMiQ~-#05?w?K?=NJO)CGkfLPj5dt-OxC@1zwW zy^|#g{$>vP?>G^bvN@u@GcG=8?3i8Dow0TAES@^ zKXr**0{CnSvvbp)Hiv!mM@}qV{h7~^0^C8P=Heg$Y&)W>UbI(F)59!_1e zut5#Z#&h|QH&y)JA07W3a3#VF9T#yU_?Rg0JE;}70QC}C7xOKC{cX`fl?}r{r^)O(RGm_wbdfvXx zl6?*)_1Y=ejHCMl%8GLrb}`HAC?Ps+p+~|?4o;~~x$p3fXCmOXL${F_GH05+??#ZH z|1)%{);fE?QQ2cUroR}8zcc%gY6}Uni!8HfDZy;-@hv_0DKE^{?mFbpo@(hGjvFJAUN_@&_7lm3U7~TAsXea;#ZG6JBfrk8?g=1 zVP~Gnrz_sXdkNWkfW?O$+8O@+LN-d6U2Ad|DVqcUp+$Y#HBJ!KX$l91t3bY30RL%O z_H|^`bj8i0v}>zCd)>KvY?1x4pF}HOL*YI$glYW;ghs+L(>kFywPytx5CB+|^jm*{ zZQ)D;;SLq-xf3l?(o z$}#L$T9KXN#7W9(f(bHP)3G0Fww}hiU0moyHMniRo z8ZcXq6#3J7mWLG!aZ%q$d6QNzK>yS;eF4J#xD@(d784rkmkSL+07x3%RNRFEY6``Rk775rwyuCf5~4%X3@^4(AbsfuO*VQ zksrMt`V-cK$hk|e|E%dblD5;jAnMq9tuoIb|0>L;P`-D4;xX|2Z(8=S2OQ$C4m-o+ zT*k7>3VAZ#><$Fm4tcL6S?f{oz0$m${0XeQxck|FaBnQ0mJX8RmhZ8+Uv2@qlb5lX zeo=vn(pkSZ7m=%yOm}3cHFITk67Lp&1=%pKIWZt^Oxt+W?G9QcQd^^rj?t3JlFbF% z67OT9`ZfJ;`YdGVZDM|&u2VF!)z1O8qHJtEr2iI4VevpOX7-WM91H+tj0e5(rfFbz zXWQ?7#I_8`8+aPI8|}Z_Y7iPG%<^Mu8Fc08SwJXJ&`UWPB%;|S9?0;cQ}FeA_{_)b zK{~_aa*nL#wlFvF3y8Lsp(B;I&<|0O0o&fVQ5l@4B;HL=?DzK{+ShVnKew7{apT7e zskZgTU5*&mlCdWIHa=0(kSTFSWKrb`B*4Mjd1}wSp;H;%kBTf&Ee_9?vUZ*WT<6&7 zfw<+Jpa^sy97O|Uu9dSl;_a=wz}9^5=xLeP#y4s_fHqp0o5zukS`g>M0&RHJ@(YkH zAhT?$ui_-ilLj#xRjB(_gyUTZP9_BSk7h-=R`9AV)5Q6e>qB zhh;0!9De%>l{Yitbpzpz!?DZIgb9aGF?7fAEFT=+zmyd+>KrO4;>NQEeVm-IcE;Oq zg(yXKn>St2leH_hyn*THz_YvF+~@wXz-y6SG27=Rgct|rWhk+=vEY!yqyOwk3N{eO zK(Il%{h%9Y;G}vB1V|G|xVK%PGJ&@R26L=hPsZ*FKR0x!TYSpc0nu zKugv`Rw0pkQ-95N!w;gZ<*4zli(##;2>|Mx9CXQdF-x?$o-cbk1!PcOcdkTrk*x2T z$i~w^T0Yf+%!f07+_gTiwaZ-xNx30H3BPr4qNk%(4EK zEbF++H~wDzEl{LMCY{kL2M1&Qhx}tfJGU&=$zu;==A%J{AJBIT65 zwyx42_!*fc54YMMWz}8QUx%d6AaQG;vv*O?xx8IG@OD4+5@BLR*K@T8*U*aFpXj}s zFd4|e;|n`v5*@Rmpn5ZGjacBOV9+VQRADV+qfq6fV~#=NpgUxb0rsYo*v-^D$ z*z&>3mbS9_rFs@-IOSgZSi!d_cE6OGayiJDmZ>rQ*gVURumZjs$s#^Qg;o_1pZb~3 zvUXWyY%waKxlkeApYmVc{Y2mWftm8aOcMf|3h)S-$+X`V-Xj1&FB24uc^RhsjGK+J zCb|U+qcY03Rm?9u@pIZY+YV|Wfc9K5Jk^T%&A#=g$!}+?mN60H49|D?j=GPB`fs9y zqnXGvJ;c$;nJ6e-3!-?Nw2&A;1hNBLLCQf@_7+Y4L(dXQ_gqs$UhJ3s0yZ*cJ|$+! z{42_{F5O3#&7g51{zT{rjjX+ZfPH)~T9-&qYd<$PA^Tfcac$Jq?t^ zzm|W3F)UnH8%bn4n)!!U#!<+$WtM1nO`Ur>b75u1Kc93hc?V+5X{Uk{oo+WKQdv*h zY?P;P=|D13qk!W)BEPj0SA=npj}!oo|ewf zeh&?>u%8>6fBAHNer5jE_xab*S7O;$3mUH$OQeeE JGZY+P{XdZ7i9`SZ diff --git a/tools/lexer/jflex-1.4/doc/manual.css b/tools/lexer/jflex-1.4/doc/manual.css deleted file mode 100644 index 1d69acfd988b..000000000000 --- a/tools/lexer/jflex-1.4/doc/manual.css +++ /dev/null @@ -1,19 +0,0 @@ -body { background-color:#FFFFFF; } -table { background-color:#F0F0F0; } -h1 { font-size:16pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; - border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; } -h2 { font-size:14pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; - border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; } -h3 { font-size:14pt; font-weight:bold; font-family:arial,helvetica; margin-top:1cm; } -h4 { font-size:12pt; font-family:arial,helvetica; } - -SMALL.TINY { font-size:xx-small } -SMALL.SCRIPTSIZE { font-size:xx-small } -SMALL.FOOTNOTESIZE { font-size:x-small } -SMALL.SMALL { font-size:small } -BIG.LARGE { font-size:large } -BIG.XLARGE { font-size:x-large } -BIG.XXLARGE { font-size:xx-large } -BIG.HUGE { font-size:xx-large } -BIG.XHUGE { font-size:xx-large } - diff --git a/tools/lexer/jflex-1.4/doc/manual.html b/tools/lexer/jflex-1.4/doc/manual.html deleted file mode 100644 index 26713a5afe91..000000000000 --- a/tools/lexer/jflex-1.4/doc/manual.html +++ /dev/null @@ -1,3920 +0,0 @@ - - - - - -JFlex User's Manual - - - - - - - - - - - - - - - -

- -

- - -
- -

-

-The Fast Lexical Analyser Generator -
-

-
-

-
Copyright ©1998-2004 by Gerwin Klein -
-


-

JFlex User's Manual -
-


-

Version 1.4, April 12, 2004 - -
- -

-
- -

-Contents -

- - - - - -


-Introduction -

-JFlex is a lexical analyzer generator for Java[*]written in Java. It is also a rewrite of the very useful tool JLex [3] which -was developed by Elliot Berk at Princeton University. As Vern Paxon states -for his C/C++ tool flex [11]: They do not share any code though. - -

- -

-Design goals -

-The main design goals of JFlex are: - -
    -
  • Full unicode support -
  • -
  • Fast generated scanners -
  • -
  • Fast scanner generation -
  • -
  • Convenient specification syntax -
  • -
  • Platform independence -
  • -
  • JLex compatibility -
  • -
- -

- -

-About this manual -

-This manual gives a brief but complete description of the tool JFlex. It -assumes that you are familiar with the issue of lexical analysis. The references [1], -[2], and [13] provide a good introduction to this topic. - -

-The next section of this manual describes installation procedures -for JFlex. If you never worked with JLex or -just want to compare a JLex and a JFlex scanner specification you -should also read Working with JFlex - an example -(section [*]). All options and the complete -specification syntax are presented in -Lexical specifications (section [*]); -Encodings, Platforms, and Unicode (section [*]) -provides information about scannig text vs. binary files. -If you are interested in performance -considerations and comparing JLex with JFlex speed, -a few words on performance (section [*]) -might be just right for you. Those who want to -use their old JLex specifications may want to check out section [*] -Porting from JLex to avoid possible problems -with not portable or non standard JLex behavior that has been fixed in -JFlex. Section [*] talks about porting scanners from the -Unix tools lex and flex. Interfacing JFlex scanners with the LALR -parser generators CUP and BYacc/J is explained in working - together (section [*]). Section [*] -Bugs gives a list of currently known active bugs. -The manual concludes with notes about -Copying and License (section [*]) and -references. - -

- -


-Installing and Running JFlex -

- -

- -

-Installing JFlex -

- -

- -


-Windows -

-To install JFlex on Windows 95/98/NT/XP, follow these three steps: - -
    -
  1. Unzip the file you downloaded into the directory you want JFlex in (using -something like -WinZip). -If you unzipped it to say C:\, the following directory structure -should be generated: - -
    -C:\JFlex\                          
    -      +--bin\                   (start scripts) 
    -      +--doc\                   (FAQ and manual)
    -      +--examples\ 
    -               +--binary\       (scanning binary files)
    -               +--byaccj\       (calculator example for BYacc/J)
    -               +--cup\          (calculator example for cup)
    -               +--interpreter\  (interpreter example for cup)
    -               +--java\         (Java lexer specification) 
    -               +--simple\       (example scanner)
    -               +--standalone\   (a simple standalone scanner) 
    -      +--lib\                   (the precompiled classes) 
    -      +--src\ 
    -          +--JFlex\             (source code of JFlex) 
    -          +--JFlex\gui          (source code of JFlex UI classes)
    -          +--java_cup\runtime\  (source code of cup runtime classes)
    -
    - -

    -

  2. -
  3. Edit the file bin\jflex.bat -(in the example it's C:\JFlex\bin\jflex.bat) -such that - -

    - -

      -
    • JAVA_HOME contains the directory where your Java JDK is installed - (for instance C:\java) and -
    • -
    • JFLEX_HOME the directory that contains JFlex (in the example: - C:\JFlex) -
    • -
    - -

    -

  4. -
  5. Include the bin\ directory of JFlex in your path. -(the one that contains the start script, in the example: C:\JFlex\bin). -
  6. -
- -

- -

-Unix with tar archive -

- -

-To install JFlex on a Unix system, follow these two steps: - -

    -
  • Uncompress the archive into a directory of your choice - with GNU tar, for instance to /usr/share: - -

    -tar -C /usr/share -xvzf jflex-1.4.tar.gz - -

    -(The example is for site wide installation. You need to - be root for that. User installation works exactly the - same way--just choose a directory where you have write - permission) - -

    -

  • -
  • Make a symbolic link from somewhere in your binary - path to bin/jflex, for instance: - -

    -ln -s /usr/share/JFlex/bin/jflex /usr/bin/jflex - -

    -If the java interpreter is not in your binary path, you - need to supply its location in the script bin/jflex. -

  • -
- -

-You can verify the integrity of the downloaded file with -the MD5 checksum available on the JFlex download page. -If you put the checksum file in the same directory -as the archive, you run: - -

-md5sum --check jflex-1.4.tar.gz.md5 - -

-It should tell you - -

-jflex-1.4.tar.gz: OK - -

- -

-Linux with RPM -

- -

- -

    -
  • become root -
  • -
  • issue -
    rpm -U jflex-1.4-0.rpm -
  • -
- -

-You can verify the integrity of the downloaded rpm file with - -

-rpm --checksig jflex-1.4-0.rpm - -

-This requires my pgp public key. If you don't have it, you can use - -

-rpm --checksig --nopgp jflex-1.4-0.rpm - -

-or you can get it from http://www.jflex.de/public-key.asc. - -

- -

-Running JFlex -

-You run JFlex with: - -

-jflex <options> <inputfiles> - -

-It is also possible to skip the start script in bin\ -and include the file lib\JFlex.jar -in your CLASSPATH environment variable instead. - -

-Then you run JFlex with: - -

-java JFlex.Main <options> <inputfiles> - -

-The input files and options are in both cases optional. If you don't provide a file name on -the command line, JFlex will pop up a window to ask you for one. - -

-JFlex knows about the following options: - -

-

-
-
-d <directory> -
writes the generated file to the directory <directory> - -

-

-
-
--skel <file> -
uses external skeleton <file>. This is mainly for JFlex - maintenance and special low level customizations. Use only when you - know what you are doing! JFlex comes with a skeleton file in the - src directory that reflects exactly the internal, precompiled - skeleton and can be used with the -skel option. - -

-

-
-
--nomin -
skip the DFA minimization step during scanner generation. - -

-

-
-
--jlex -
tries even harder to comply to JLex interpretation of specs. - -

-

-
-
--dot -
generate graphviz dot files for the NFA, DFA and minimized - DFA. This feature is still in alpha status, and not - fully implemented yet. - -

-

-
-
--dump -
display transition tables of NFA, initial DFA, and minimized DFA - -

-

-
-
--verbose or -v -
display generation progress messages (enabled by default) - -

-

-
-
--quiet or -q -
display error messages only (no chatter about what JFlex is - currently doing) - -

-

-
-
--time -
display time statistics about the code generation process - (not very accurate) - -

-

-
-
--version -
print version number - -

-

-
-
--info -
print system and JDK information (useful if you'd like - to report a problem) - -

-

-
-
--pack -
use the %pack code generation method by default - -

-

-
-
--table -
use the %table code generation method by default - -

-

-
-
--switch -
use the %switch code generation method by default - -

-

-
-
--help or -h -
print a help message explaining options and usage of JFlex. -
-
- -

- -


-A simple Example: How to work with JFlex -

-To demonstrate what a lexical specification with JFlex looks like, this -section presents a part of the specification for the Java language. -The example does not describe the whole lexical structure of Java programs, -but only a small and simplified part of it (some keywords, some operators, -comments and only two kinds of literals). It also shows how to interface -with the LALR parser generator CUP [8] and therefore -uses a class sym (generated by CUP), where integer constants for -the terminal tokens of the CUP grammar are declared. JFlex comes with a -directory examples, where you can find a small standalone scanner -that doesn't need other tools like CUP to give you a running example. -The "examples" directory also contains a complete JFlex -specification of the lexical structure of Java programs together with the -CUP parser specification for Java by -C. Scott Ananian, obtained -from the CUP [8] website (it was modified to interface with the JFlex scanner). -Both specifications adhere to the Java Language Specification [7]. - -

-

-/* JFlex example: part of Java language lexer specification */
-import java_cup.runtime.*;
-
-/**
- * This class is a simple example lexer.
- */
-%%
-
-
-%class Lexer
-%unicode
-%cup
-%line
-%column
-
-
-%{
-  StringBuffer string = new StringBuffer();
-
-  private Symbol symbol(int type) {
-    return new Symbol(type, yyline, yycolumn);
-  }
-  private Symbol symbol(int type, Object value) {
-    return new Symbol(type, yyline, yycolumn, value);
-  }
-%}
-
-
-LineTerminator = \r|\n|\r\n
-InputCharacter = [^\r\n]
-WhiteSpace     = {LineTerminator} | [ \t\f]
-
-/* comments */
-Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}
-
-TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
-EndOfLineComment     = "//" {InputCharacter}* {LineTerminator}
-DocumentationComment = "/**" {CommentContent} "*"+ "/"
-CommentContent       = ( [^*] | \*+ [^/*] )*
-
-Identifier = [:jletter:] [:jletterdigit:]*
-
-DecIntegerLiteral = 0 | [1-9][0-9]*
-
-
-%state STRING
-
-%%
-
-
-/* keywords */
-<YYINITIAL> "abstract"           { return symbol(sym.ABSTRACT); }
-<YYINITIAL> "boolean"            { return symbol(sym.BOOLEAN); }
-<YYINITIAL> "break"              { return symbol(sym.BREAK); }
-
-
-<YYINITIAL> {
-  /* identifiers */ 
-  {Identifier}                   { return symbol(sym.IDENTIFIER); }
- 
-  /* literals */
-  {DecIntegerLiteral}            { return symbol(sym.INTEGER_LITERAL); }
-  \"                             { string.setLength(0); yybegin(STRING); }
-
-  /* operators */
-  "="                            { return symbol(sym.EQ); }
-  "=="                           { return symbol(sym.EQEQ); }
-  "+"                            { return symbol(sym.PLUS); }
-
-  /* comments */
-  {Comment}                      { /* ignore */ }
- 
-  /* whitespace */
-  {WhiteSpace}                   { /* ignore */ }
-}
-
-
-<STRING> {
-  \"                             { yybegin(YYINITIAL); 
-                                   return symbol(sym.STRING_LITERAL, 
-                                   string.toString()); }
-  [^\n\r\"\\]+                   { string.append( yytext() ); }
-  \\t                            { string.append('\t'); }
-  \\n                            { string.append('\n'); }
-
-  \\r                            { string.append('\r'); }
-  \\\"                           { string.append('\"'); }
-  \\                             { string.append('\\'); }
-}
-
-
-/* error fallback */
-.|\n                             { throw new Error("Illegal character <"+
-                                                    yytext()+">"); }
-
- -

-From this specification JFlex generates a .java file with one -class that contains code for the scanner. The class will have a -constructor taking a java.io.Reader from which the input is -read. The class will also have a function yylex() that runs the -scanner and that can be used to get the next token from the input (in this -example the function actually has the name next_token() because -the specification uses the %cup switch). - -

-As with JLex, the specification consists of three parts, divided by %%: - -

- -

- -


-Code to include -

-Let's take a look at the first section, ``user code'': The text up to the -first line starting with %% is copied verbatim to the top -of the generated lexer class (before the actual class declaration). -Beside package and import statements there is usually not much -to do here. If the code ends with a javadoc class comment, the generated class -will get this comment, if not, JFlex will generate one automatically. - -

- -


-Options and Macros -

-The second section ``options and declarations'' is more interesting. It consists -of a set of options, code that is included inside the generated scanner -class, lexical states and macro declarations. Each JFlex option must begin -a line of the specification and starts with a %. In our example -the following options are used: - -

- -

    -
  • %class Lexer tells JFlex to give the - generated class the name ``Lexer'' and to write the code to a file ``Lexer.java''. - -

    -

  • -
  • %unicode defines the set of characters the scanner will - work on. For scanning text files, %unicode should always be used. See also - section [*] for more information on character sets, encodings, and - scanning text vs. binary files. - -

    -

  • -
  • %cup switches to CUP compatibility - mode to interface with a CUP generated parser. - -

    -

  • -
  • %line switches line counting on (the - current line number can be accessed via the variable yyline) - -

    -

  • -
  • %column switches column counting on - (current column is accessed via yycolumn) - -

    -

  • -
- -

-The code included in %{...%} -is copied verbatim into the generated lexer class source. -Here you can declare member variables and functions that are used -inside scanner actions. In our example we declare a StringBuffer ``string'' -in which we will store parts of string literals and two helper functions -``symbol'' that create java_cup.runtime.Symbol objects -with position information of the current token (see section [*] -JFlex and CUP -for how to interface with the parser generator CUP). As JFlex options, both -%{ and \%} must begin a line. - -

-The specification continues with macro declarations. Macros are -abbreviations for regular expressions, used to make lexical specifications -easier to read and understand. A macro declaration -consists of a macro identifier followed by =, then followed by -the regular expression it represents. This regular expression may -itself contain macro usages. Although this allows a grammar like specification -style, macros are still just abbreviations and not non terminals - they -cannot be recursive or mutually recursive. Cycles in macro definitions -are detected and reported at generation time by JFlex. - -

-Here some of the example macros in more detail: - -

    -
  • LineTerminator stands for the regular - expression that matches an ASCII CR, an ASCII LF or an CR followed by LF. - -

    -

  • -
  • InputCharacter stands for all characters - that are not a CR or LF. - -

    -

  • -
  • TraditionalComment is the expression - that matches the string "/*" followed by a character that is not - a * followed by anything that matches the macro - CommentContent - followed by any number of * followed by /. - -

    -

  • -
  • CommentContent matches zero or more - occurrences of any character except a * or any number of - * followed by a character that is not a / - -

    -

  • -
  • Identifier matches each string that - starts with a character of class jletter followed by zero or more characters - of class jletterdigit. jletter and jletterdigit - are predefined character classes. jletter includes all characters for which - the Java function Character.isJavaIdentifierStart returns true and - jletterdigit all characters for that Character.isJavaIdentifierPart - returns true. -
  • -
- -

-The last part of the second section in our -lexical specification is a lexical state declaration: -%state STRING -declares a lexical state STRING that can be -used in the ``lexical rules'' part of the specification. A state declaration -is a line starting with %state followed by a space or comma -separated list of state identifiers. There can be more than one line starting -with %state. - -

- -


-Rules and Actions -

-The "lexical rules" section of a JFlex specification contains regular expressions -and actions (Java code) that are executed when the scanner matches the -associated regular expression. As the scanner reads its input, it keeps -track of all regular expressions and activates the action of the expression -that has the longest match. Our specification above for instance would with input -"breaker" match the regular expression for Identifier -and not the keyword "break" -followed by the Identifier "er", because rule {Identifier} -matches more of this input at once (i.e. it matches all of it) -than any other rule in the specification. If two regular expressions both -have the longest match for a certain input, the scanner chooses the action -of the expression that appears first in the specification. In that way, we -get for input "break" the keyword "break" and not an -Identifier "break". - -

-Additional to regular expression matches, one can use lexical states to -refine a specification. A lexical state acts like a start condition. -If the scanner is in lexical state STRING, only expressions that -are preceded by the start condition <STRING> can be matched. -A start condition of a regular expression can contain more than one lexical -state. It is then matched when the lexer is in any of these lexical states. -The lexical state YYINITIAL is predefined and is also the state -in which the lexer begins scanning. If a regular expression has no start -conditions it is matched in all lexical states. - -

-Since you often have a bunch of expressions with the same start conditions, -JFlex allows the same abbreviation as the Unix tool flex: -

-<STRING> {
-  expr1   { action1 }
-  expr2   { action2 }
-}
-
-means that both expr1 and expr2 have start condition <STRING>. - -

-The first three rules in our example demonstrate the syntax of a regular -expression preceded by the start condition <YYINITIAL>. - -

-<YYINITIAL> "abstract" { return symbol(sym.ABSTRACT); } - -

-matches the input "abstract" only if the scanner is in its -start state "YYINITIAL". When the string "abstract" is -matched, the scanner function returns the CUP symbol sym.ABSTRACT. -If an action does not return a value, the scanning process is resumed immediately -after executing the action. - -

-The rules enclosed in - -

-<YYINITIAL> { -
... -
}
- -

-demonstrate the abbreviated syntax and are also only matched in state YYINITIAL. - -

-Of these rules, one may be of special interest: - -

-\" { string.setLength(0); yybegin(STRING); } - -

-If the scanner matches a double quote in state YYINITIAL we -have recognized the start of a string literal. Therefore we clear our StringBuffer -that will hold the content of this string literal and tell the scanner -with yybegin(STRING) to switch into the lexical state STRING. -Because we do not yet return a value to the parser, our scanner proceeds -immediately. - -

-In lexical state STRING another -rule demonstrates how to refer to the input that has been matched: - -

-[^\n\r\"]+ { string.append( yytext() ); } - -

-The expression [^\n\r\"]+ matches -all characters in the input up to the next backslash (indicating an -escape sequence such as \n), double quote (indicating the end -of the string), or line terminator (which must not occur in a string literal). -The matched region of the input is referred to with yytext() -and appended to the content of the string literal parsed so far. - -

-The last lexical rule in the example specification -is used as an error fallback. It matches any character in any state that -has not been matched by another rule. It doesn't conflict with any other -rule because it has the least priority (because it's the last rule) and -because it matches only one character (so it can't have longest match -precedence over any other rule). - -

- -

-How to get it going -

- -
    -
  • Install JFlex (see section [*] Installing JFlex) - -

    -

  • -
  • If you have written your specification file (or chosen one from the examples -directory), save it (say under the name java-lang.flex). - -

    -

  • -
  • Run JFlex with - -

    -jflex java-lang.flex - -

    -

  • -
  • JFlex should then report some progress messages about generating the scanner -and write the generated code to the directory of your specification file. - -

    -

  • -
  • Compile the generated .java file and your own classes. (If you -use CUP, generate your parser classes first) - -

    -

  • -
  • That's it. -
  • -
- -

- -


-Lexical Specifications -

-As shown above, a lexical specification file for JFlex consists of three -parts divided by a single line starting with %%: - -

-UserCode -
%% -
Options and declarations -
%% -
Lexical rules - -

-In all parts of the specification comments of the form -/* comment text */ and the Java style end of line comments starting with // -are permitted. JFlex comments do nest - so the number of /* and */ -should be balanced. - -

- -


-User code -

-The first part contains user code that is copied verbatim into the beginning -of the source file of the generated lexer before the scanner class is declared. -As shown in the example above, this is the place to put package -declarations and import -statements. It is possible, but not considered as good Java programming -style to put own helper class (such as token classes) in this section. -They should get their own .java file instead. - -

- -


-Options and declarations -

-The second part of the lexical specification contains options -to customize your generated lexer (JFlex directives and Java code to include in -different parts of the lexer), declarations of lexical states and -macro definitions for use in the third section -``Lexical rules'' of the lexical specification file. - -

-Each JFlex directive must be situated at the beginning of a line -and starts with the % character. Directives that have one or -more parameters are described as follows: - -

-%class "classname" - -

-means that you start a line with %class followed by a space followed -by the name of the class for the generated scanner (the double quotes are -not to be entered, see the example specification in -section [*]). - -

- -


-Class options and user class code -

-These options regard name, constructor, API, and related parts of the -generated scanner class. - -
    -
  • %class "classname" - -

    -Tells JFlex to give the generated class the name "classname" and to -write the generated code to a file "classname.java". If the --d <directory> command line option is not used, the code -will be written to the directory where the specification file resides. If -no %class directive is present in the specification, the generated -class will get the name "Yylex" and will be written to a file -"Yylex.java". There should be only one %class directive -in a specification. - -

    -

  • -
  • %implements "interface 1"[, "interface 2", ..] - -

    -Makes the generated class implement the specified interfaces. If more than -one %implements directive is present, all the specified interfaces -will be implemented. - -

    -

  • -
  • %extends "classname" - -

    -Makes the generated class a subclass of the class ``classname''. -There should be only one %extends directive in a specification. - -

    -

  • -
  • %public - -

    -Makes the generated class public (the class is only accessible in its -own package by default). - -

    -

  • -
  • %final - -

    -Makes the generated class final. - -

    -

  • -
  • %abstract - -

    -Makes the generated class abstract. - -

    -

  • -
  • %apiprivate - -

    -Makes all generated methods and fields of the class -private. Exceptions are the constructor, user code in the -specification, and, if %cup is present, the method -next_token. All occurences of -" public " (one space character before and after public) -in the skeleton file are replaced by -" private " (even if a user-specified skeleton is used). -Access to the genarated class is expected to be mediated by user class -code (see next switch). - -

    -

  • -
  • %{ -
    ... -
    %} - -

    -The code enclosed in %{ and %} is copied verbatim -into the generated class. Here you can define your own member variables -and functions in the generated scanner. Like all options, both %{ -and %} must start a line in the specification. If more than one -class code directive %{...%} is present, the code is concatenated -in order of appearance in the specification. - -

    -

  • -
  • %init{ -
    ... -
    %init} - -

    -The code enclosed in %init{ and %init} is copied -verbatim into the constructor of the generated class. Here, member -variables declared in the %{...%} directive can be initialized. -If more than one initializer option is present, the code is concatenated -in order of appearance in the specification. - -

    -

  • -
  • %initthrow{ -
    "exception1"[, "exception2", ...] -
    %initthrow} - -

    -or (on a single line) just - -

    -%initthrow "exception1" [, "exception2", ...] - -

    -Causes the specified exceptions to be declared in the throws -clause of the constructor. If more than one %initthrow{ ... %initthrow} -directive is present in the specification, all specified exceptions will -be declared. - -

    -

  • -
  • %scanerror "exception" - -

    -Causes the generated scanner to throw an instance of the specified -exception in case of an internal error (default is -java.lang.Error). Note that this exception is only for -internal scanner errors. With usual specifications it should never -occur (i.e. if there is an error fallback rule in the specification -and only the documented scanner API is used). - -

    -

  • -
  • %buffer "size" - -

    -Set the initial size of the scan buffer to the specified value -(decimal, in bytes). The default value is 16384. - -

    -

  • -
  • %include "filename" - -

    -Replaces the %include verbatim by the specified file. This -feature is still experimental. It works, but error reporting can be -strange if a syntax error occurs on the last token in the included -file. - -

    -

  • -
- -

- -


-Scanning method -

-This section shows how the scanning method can be customized. You can redefine -the name and return type of the method and it is possible to declare -exceptions that may be thrown in one of the actions of the specification. -If no return type is specified, the scanning method will be declared as -returning values of class Yytoken. - -
    -
  • %function "name" - -

    -Causes the scanning method to get the specified name. If no %function -directive is present in the specification, the scanning method gets the -name ``yylex''. This directive overrides settings of the -%cup switch. Please note that the default name -of the scanning method with the %cup switch is -next_token. Overriding this name might lead to the generated scanner -being implicitly declared as abstract, because it does not provide -the method next_token of the interface java_cup.runtime.Scanner. -It is of course possible to provide a dummy implemention of that method -in the class code section, if you still want to override the function name. - -

    -

  • -
  • %integer -
    %int - -

    -Both cause the scanning method to be declared as of Java type int. -Actions in the specification can then return int values as tokens. -The default end of file value under this setting is YYEOF, which is a public -static final int member of the generated class. - -

    -

  • -
  • %intwrap - -

    -Causes the scanning method to be declared as of the Java wrapper type -Integer. Actions in the specification can then return Integer -values as tokens. The default end of file value under this setting is null. - -

    -

  • -
  • %type "typename" - -

    -Causes the scanning method to be declared as returning values of the specified type. -Actions in the specification can then return values of typename -as tokens. The default end of file value under this setting is null. -If typename is not a subclass of java.lang.Object, -you should specify another end of file value using the -%eofval{ ... %eofval} -directive or the <<EOF>> rule. -The %type directive overrides settings of the -%cup switch. - -

    -

  • -
  • %yylexthrow{ -
    "exception1"[, "exception2", ... ] -
    %yylexthrow} - -

    -or (on a single line) just - -

    -%yylexthrow "exception1" [, "exception2", ...] - -

    -The exceptions listed inside %yylexthrow{ ... %yylexthrow} -will be declared in the throws clause of the scanning method. If there is -more than one %yylexthrow{ ... %yylexthrow} clause in -the specification, all specified exceptions will be declared. -

  • -
- -

- -


-The end of file -

-There is always a default value that the scanning method will return when -the end of file has been reached. You may however define a specific value -to return and a specific piece of code that should be executed when the -end of file is reached. - -

-The default end of file values depends on the return type of the scanning method: - -

    -
  • For %integer, the scanning method will return the value -YYEOF, which is a public static final int member -of the generated class. - -

    -

  • -
  • For %intwrap, -
  • -
  • no specified type at all, or a -
  • -
  • user defined type, declared using %type, the value is null. - -

    -

  • -
  • In CUP compatibility mode, using %cup, the value is - -

    -new java_cup.runtime.Symbol(sym.EOF) -

  • -
- -

-User values and code to be executed at the end of file can be defined using these directives: - -

    -
  • %eofval{ -
    ... -
    %eofval} - -

    -The code included in %eofval{ ... %eofval} will -be copied verbatim into the scanning method and will be executed each time -when the end of file is reached (this is possible when -the scanning method is called again after the end of file has been -reached). The code should return the value that indicates the end of -file to the parser. There should be only one %eofval{ -... %eofval} clause in the specification. -The %eofval{ ... %eofval} directive overrides settings of the -%cup switch and %byaccj switch. -As of version 1.2 JFlex provides -a more readable way to specify the end of file value using the -<<EOF>> rule (see also section [*]). - -

    -

  • -
  • %eof{ -
    ... -
    %eof} - -

    -The code included in %{eof ... %eof} will be executed - exactly once, when the end of file is reached. The code is included - inside a method void yy_do_eof() and should not return any - value (use %eofval{...%eofval} or - <<EOF>> for this purpose). If more than one - end of file code directive is present, the code will be concatenated - in order of appearance in the specification. - -

    -

  • -
  • %eofthrow{ -
    "exception1"[,"exception2", ... ] -
    %eofthrow} - -

    -or (on a single line) just - -

    -%eofthrow "exception1" [, "exception2", ...] - -

    -The exceptions listed inside %eofthrow{...%eofthrow} will - be declared in the throws clause of the method yy_do_eof() - (see %eof for more on that method). - If there is more than one %eofthrow{...%eofthrow} clause - in the specification, all specified exceptions will be declared. - -

    -

  • -
  • %eofclose - -

    -Causes JFlex to close the input stream at the end of file. The code - yyclose() is appended to the method yy_do_eof() - (together with the code specified in %eof{...%eof}) and - the exception java.io.IOException is declared in the throws - clause of this method (together with those of - %eofthrow{...%eofthrow}) - -

    -

  • -
  • %eofclose false - -

    -Turns the effect of %eofclose off again (e.g. in case closing of - input stream is not wanted after %cup). - -

    -

  • -
- -

- -


-Standalone scanners -

- -
    -
  • %debug - -

    -Creates a main function in the generated class that expects the name -of an input file on the command line and then runs the scanner on this -input file by printing information about each returned token to the Java -console until the end of file is reached. The information includes: -line number (if line counting is enabled), column (if column counting is enabled), -the matched text, and the executed action (with line number in the specification). - -

    -

  • -
  • %standalone - -

    -Creates a main function in the generated class that expects the name -of an input file on the command line and then runs the scanner on this -input file. The values returned by the scanner are ignored, but any unmatched -text is printed to the Java console instead (as the C/C++ tool flex does, if -run as standalone program). To avoid having to use an extra token class, the -scanning method will be declared as having default type int, not YYtoken -(if there isn't any other type explicitly specified). -This is in most cases irrelevant, but could be useful to know when making -another scanner standalone for some purpose. You should also consider using -the %debug directive, if you just want to be able to run the scanner -without a parser attached for testing etc. - -

    -

  • -
- -

- -


-CUP compatibility -

-You may also want to read section [*] JFlex and CUP -if you are interested in how to interface your generated -scanner with CUP. - -
    -
  • %cup - -

    -The %cup directive enables the CUP compatibility mode and is equivalent -to the following set of directives: - -

    -

    -%implements java_cup.runtime.Scanner
    -%function next_token
    -%type java_cup.runtime.Symbol
    -%eofval{
    -  return new java_cup.runtime.Symbol(<CUPSYM>.EOF);
    -%eofval}
    -%eofclose
    -
    - -

    -The value of <CUPSYM> defaults to sym and can be -changed with the %cupsym directive. In JLex compatibility -mode (-jlex switch on the command line), %eofclose -will not be turned on. - -

    -

  • -
  • %cupsym "classname" - -

    -Customizes the name of the CUP generated class/interface -containing the names of terminal tokens. Default is sym. -The directive should not be used after %cup, but before. - -

    -

  • -
  • %cupdebug - -

    -Creates a main function in the generated class that expects the name -of an input file on the command line and then runs the scanner on this -input file. Prints line, column, matched text, and CUP symbol name for -each returned token to standard out. - -

    -

  • -
- -

- -


-BYacc/J compatibility -

-You may also want to read section [*] JFlex and BYacc/J -if you are interested in how to interface your generated -scanner with Byacc/J. - -
    -
  • %byacc - -

    -The %byacc directive enables the BYacc/J compatibility mode and is equivalent -to the following set of directives: - -

    -

    -%integer
    -%eofval{
    -  return 0;
    -%eofval}
    -%eofclose
    -
    - -

    -

  • -
- -

- -


-Code generation -

-The following options define what kind of lexical analyzer code JFlex -will produce. %pack is the default setting and will be used, -when no code generation method is specified. - -

- -

    -
  • %switch - -

    -With %switch JFlex will generate a scanner that has - the DFA hard coded into a nested switch statement. This method gives - a good deal of compression in terms of the size of the compiled - .class file while still providing very good performance. If your - scanner gets to big though (say more than about 200 states) - performance may vastly degenerate and you should consider using one - of the %table or %pack directives. If your scanner - gets even bigger (about 300 states), the Java compiler javac - could produce corrupted code, that will crash when executed or will - give you an java.lang.VerifyError when checked by the virtual - machine. This is due to the size limitation of 64 KB of Java - methods as described in the Java Virtual Machine Specification - [10]. In this case you will be forced to use the - %pack directive, since %switch - usually provides more compression of the DFA table than the - %table directive. - -

    -

  • -
  • %table - -

    -The %table direction causes JFlex to produce a classical - table driven scanner that encodes its DFA table in an array. In - this mode, JFlex only does a small amount of table compression (see - [6], [12], [1] and [13] - for more details on the matter of table compression) and uses the - same method that JLex did up to version 1.2.1. See section [*] - performance of this manual to compare - these methods. The same reason as above (64 KB size limitation of - methods) causes the same problem, when the scanner gets too big. - This is, because the virtual machine treats static initializers of - arrays as normal methods. You will in this case again be forced to - use the %pack directive to avoid the problem. - -

    -

  • -
  • %pack - -

    -%pack causes JFlex to compress the generated DFA table and to - store it in one or more string literals. JFlex takes care that the - strings are not longer than permitted by the class file format. - The strings have to be unpacked when - the first scanner object is created and initialized. - After unpacking the internal access to the DFA table is exactly the - same as with option %table -- the only extra work to be done - at runtime is the unpacking process which is quite fast (not noticeable - in normal cases). It is in time complexity proportional to the - size of the expanded DFA table, and it is static, - i.e. it is done only once for a certain scanner class -- no matter - how often it is instantiated. Again, see section - [*] performance - on the performance of these scanners - With %pack, there should be practically no - limitation to the size of the scanner. %pack is the default - setting and will be used when no code generation method is specified. -

  • -
- -

- -


-Character sets -

- -
    -
  • %7bit - -

    -Causes the generated scanner to use an 7 bit input character set (character -codes 0-127). Because this is the default value in JLex, JFlex also defaults -to 7 bit scanners. If an input character with a code greater than 127 is -encountered in an input at runtime, the scanner will throw an ArrayIndexOutofBoundsException. -Not only because of this, you should consider using the %unicode directive. -See also section [*] for information about character encodings. - -

    -

  • -
  • %full -
    %8bit - -

    -Both options cause the generated scanner to use an 8 bit input character -set (character codes 0-255). If an input character with a code greater -than 255 is encountered in an input at runtime, the scanner will throw -an ArrayIndexOutofBoundsException. Note that even if your platform -uses only one byte per character, the Unicode value of a character may -still be greater than 255. If you are scanning text files, you should -consider using the %unicode directive. See also section [*] -for more information about character encodings. - -

    -

  • -
  • %unicode -
    %16bit - -

    -Both options cause the generated scanner to use the full 16 bit Unicode input -character set (character codes 0-65535). There will be no runtime overflow when -using this set of input characters. %unicode does not mean that the -scanner will read two bytes at a time. What is read and what constitutes a -character depends on the runtime platform. See also section [*] -for more information about character encodings. - -

    -

  • -
  • %caseless -
    %ignorecase - -

    -This option causes JFlex to handle all characters and strings in the -specification as if they were specified in both uppercase and lowercase form. -This enables an easy way to specify a scanner for a language with -case insensitive keywords. The string "break" in a specification is for instance -handled like the expression ([bB][rR][eE][aA][kK]). The %caseless -option does not change the matched text and does not effect character classes. So -[a] still only matches the character a and not A, too. -Which letters are uppercase and which lowercase letters, is defined by the Unicode standard -and determined by JFlex with the Java methods Character.toUpperCase and -Character.toLowerCase. In JLex compatibility -mode (-jlex switch on the command line), %caseless -and %ignorecase also affect character classes. - -

    -

  • -
-


-Line, character and column counting -

- -
    -
  • %char - -

    -Turns character counting on. The int member variable yychar -contains the number of characters (starting with 0) from the beginning -of input to the beginning of the current token. - -

    -

  • -
  • %line - -

    -Turns line counting on. The int member variable yyline -contains the number of lines (starting with 0) from the beginning of input -to the beginning of the current token. - -

    -

  • -
  • %column - -

    -Turns column counting on. The int member variable yycolumn -contains the number of characters (starting with 0) from the beginning -of the current line to the beginning of the current token. - -

    -

  • -
- -

- -


-Obsolete JLex options -

- -
    -
  • %notunix - -

    -This JLex option is obsolete in JFlex but still recognized as valid directive. -It used to switch between Windows and Unix kind of line terminators (\r\n -and \n) for the $ operator in regular expressions. JFlex -always recognizes both styles of platform dependent line terminators. - -

    -

  • -
  • %yyeof - -

    -This JLex option is obsolete in JFlex but still recognized as valid directive. -In JLex it declares a public member constant YYEOF. JFlex declares it in any case. -

  • -
- -

- -


-State declarations -

-State declarations have the following from: - -

-%s[tate] "state identifier" [, "state identifier", ... ] for inclusive or -
%x[state] "state identifier" [, "state identifier", ... ] for exlusive states - -

-There may be more than one line of state declarations, each starting with -%state or %xstate (the first character is sufficient, -%s and %x works, too). State identifiers are letters followed -by a sequence of letters, digits or underscores. State identifiers can be separated -by whitespace or comma. - -

-The sequence - -

-%state STATE1 -
%xstate STATE3, XYZ, STATE_10 -
%state ABC STATE5 - -

-declares the set of identifiers STATE1, STATE3, XYZ, - STATE_10, ABC, STATE5 as lexical states, STATE1, ABC, STATE5 -as inclusive, and STATE3, XYZ, STATE_10 as exclusive. -See also section -[*] on the way lexical states influence how the input is -matched. - -

- -


-Macro definitions -

-A macro definition has the form - -

-macroidentifier = regular expression - -

-That means, a macro definition is a macro identifier (letter followed -by a sequence of letters, digits or underscores), that can later be -used to reference the macro, followed by optional whitespace, followed -by an "=", followed by optional whitespace, followed by a -regular expression (see section [*] lexical - rules for more information about regular expressions). - -

-The regular expression on the right hand side must be well formed and -must not contain the ^, / or $ operators. Differently -to JLex, macros are not just pieces of text that are expanded by copying -- they are parsed and must be well formed. - -

-This is a feature. It eliminates some very hard to find bugs in -lexical specifications (such like not having parentheses around more -complicated macros - which is not necessary with JFlex). See section -[*] Porting from JLex for more -details on the problems of JLex style macros. - -

-Since it is allowed to have macro usages in macro definitions, it is -possible to use a grammar like notation to specify the desired lexical -structure. Macros however remain just abbreviations of the regular expressions -they represent. They are not non terminals of a grammar and cannot be used -recursively in any way. JFlex detects cycles in macro definitions and reports -them at generation time. JFlex also warns you about macros that have been -defined but never used in the ``lexical rules'' section of the specification. - -

- -


-Lexical rules -

-The ``lexical rules'' section of an JFlex specification contains a set of -regular expressions and actions (Java code) that are executed when the -scanner matches the associated regular expression. - -

- -


-Syntax -

-The syntax of the "lexical rules" section is described by the following -BNF grammar (terminal symbols are enclosed in 'quotes'): - -

-

-LexicalRules ::= Rule+ 
-Rule         ::= [StateList] ['^'] RegExp [LookAhead] Action 
-               | [StateList] '<<EOF>>' Action
-               | StateGroup 
-StateGroup   ::= StateList '{' Rule+ '}' 
-StateList    ::= '<' Identifier (',' Identifier)* '>' 
-LookAhead    ::= '$' | '/' RegExp
-Action       ::= '{' JavaCode '}' | '|'
-
-RegExp       ::= RegExp '|' RegExp 
-               | RegExp RegExp 
-               | '(' RegExp ')'
-               | ('!'|'~') RegExp
-               | RegExp ('*'|'+'|'?')
-               | RegExp "{" Number ["," Number] "}" 
-               | '[' ['^'] (Character|Character'-'Character)* ']' 
-               | PredefinedClass 
-               | '{' Identifier '}' 
-               | '"' StringCharacter+ '"' 
-               | Character 
-
-PredefinedClass ::= '[:jletter:]' 
-                  | '[:jletterdigit:]' 
-                  | '[:letter:]' 
-                  | '[:digit:]' 
-                  | '[:uppercase:]' 
-                  | '[:lowercase:]' 
-                  | '.'
-
- -

-The grammar uses the following terminal symbols: - -

    -
  • JavaCode -
    a sequence of BlockStatements as described in the Java - Language Specification [7], section 14.2. - -

    -

  • -
  • Number -
    a non negative decimal integer. - -

    -

  • -
  • Identifier -
    a letter [a-zA-Z] followed by a sequence of zero or more - letters, digits or underscores [a-zA-Z0-9_] - -

    -

  • -
  • Character -
    an escape sequence or any unicode character that is not one of these - meta characters: - | ( ) { } [ ] < > \ . * + ? ^ $ / . " ~ ! - -

    -

  • -
  • StringCharacter -
    an escape sequence or any unicode character that is not one of these - meta characters: - \ " - -

    -

  • -
  • An escape sequence - -

    - -

      -
    • \n \r \t \f \b -
    • -
    • a \x followed by two hexadecimal digits [a-fA-F0-9] (denoting - a standard ASCII escape sequence), - -

      -

    • -
    • a \u followed by four hexadecimal digits [a-fA-F0-9] - (denoting an unicode escape sequence), - -

      -

    • -
    • a backslash followed by a three digit octal number from 000 to 377 (denoting - a standard ASCII escape sequence), or - -

      -

    • -
    • a backslash followed by any other unicode character that stands for this - character. - -

      -

    • -
    - -

    -

  • -
- -

-Please note that the \n escape sequence stands for the ASCII -LF character - not for the end of line. If you would like to match the -line terminator, you should use the expression \r|\n|\r\n if you want -the Java conventions, or \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 -if you want to be fully Unicode compliant (see also [5]). - -

-As of version 1.1 of JFlex the whitespace characters " " -(space) and "\t" (tab) can be used to improve the readability of -regular expressions. They will be ignored by JFlex. In character -classes and strings however, whitespace characters keep standing for -themselves (so the string " " still matches exactly one space -character and [ \n] still matches an ASCII LF or a space -character). - -

-JFlex applies the following standard operator precedences in regular -expression (from highest to lowest): - -

- -

    -
  • unary postfix operators ('*', '+', '?', {n}, {n,m}) - -

    -

  • -
  • unary prefix operators ('!', '~') - -

    -

  • -
  • concatenation (RegExp::= RegExp Regexp) - -

    -

  • -
  • union (RegExp::= RegExp '|' RegExp) -
  • -
- -

-So the expression a | abc | !cd* for instance is parsed as -(a|(abc)) | ((!c)(d*)). - -

- -


-Semantics -

-This section gives an informal description of which text is matched by -a regular expression (i.e. an expression described by the RegExp -production of the grammar presented above). - -

-A regular expression that consists solely of - -

    -
  • a Character matches this character. - -

    -

  • -
  • a character class '[' (Character|Character'-'Character)* ']' matches - any character in that class. A Character is to be considered an - element of a class, if it is listed in the class or if its code lies within - a listed character range Character'-'Character. So [a0-3\n] - for instance matches the characters - -

    -a 0 1 2 3 \n - -

    -If the list of characters is empty (i.e. just []), the expression - matches nothing at all (the empty set), not even the empty string. This - may be useful in combination with the negation operator '!'. - -

    -

  • -
  • a negated character class '[^' (Character|Character'-'Character)* ']' - matches all characters not listed in the class. If the list of characters - is empty (i.e. [^]), the expression matches any character of the - input character set. - -

    -

  • -
  • a string '"' StringCharacter+ '" ' matches the exact - text enclosed in double quotes. All meta characters but \ and - " loose their special meaning inside a string. See also the - %ignorecase switch. - -

    -

  • -
  • a macro usage '{' Identifier '}' matches the input that is matched - by the right hand side of the macro with name "Identifier". - -

    -

  • -
  • a predefined character class matches any of - the characters in that class. There are the following predefined character - classes: - -

    -. contains all characters but \n. - -

    -All other predefined character classes are defined in the Unicode - specification or the Java Language Specification and determined by - Java functions of class - java.lang.Character. - -

    -

    -[:jletter:]      isJavaIdentifierStart()
    -[:jletterdigit:] isJavaIdentifierPart()
    -[:letter:]       isLetter()
    -[:digit:]        isDigit()
    -[:uppercase:]    isUpperCase()
    -[:lowercase:]    isLowerCase()
    -
    - -

    -They are especially useful when working with the unicode character set. - -

    -

  • -
- -

-If a and b are regular expressions, then - -

-

-
a | b
-
(union) - -

-is the regular expression, that matches - all input that is matched by a or by b. - -

-

-
a b
-
(concatenation) - -

-is the regular expression, - that matches the input matched by a followed by the - input matched by b. - -

-

-
a*
-
(kleene closure) - -

-matches zero or more repetitions - of the input matched by a - -

-

-
a+
-
(iteration) - -

-is equivalent to aa* - -

-

-
a?
-
(option) - -

-matches the empty input or the input matched - by a - -

-

-
!a
-
(negation) - -

-matches everything but the strings matched by a. - Use with care: the construction of !a involves - an additional, possibly exponential NFA to DFA transformation - on the NFA for a. Note that - with negation and union you also have (by applying DeMorgan) - intersection and set difference: the intersection of - a and b is !(!a|!b), the expression - that matches everything of a not matched by b is - !(!a|b) - -

-

-
~a
-
(upto) - -

-matches everything up to (and including) the first occurrence of a text - matched by a. The expression ~a is equivalent - to !([^]* a [^]* | "") a. A traditional C-style comment - is matched by "/*" ~"*/" - -

-

-
a{n}
-
(repeat) - -

-is equivalent to n times the concatenation of a. - So a{4} for instance is equivalent to the expression a a a a. - The decimal integer n must be positive. - -

-

-
a{n,m}
-
is equivalent to at least n times and at most m times the - concatenation of a. So a{2,4} for instance is equivalent - to the expression a a a? a?. Both n and m are non - negative decimal integers and m must not be smaller than n. - -

-

-
( a )
-
matches the same input as a. - -

-

-
- -

-In a lexical rule, a regular expression r may be preceded by a -'^' (the beginning of line operator). r is then -only matched at the beginning of a line in the input. A line begins -after each occurrence of \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 -(see also [5]) and at the beginning of input. -The preceding line terminator in the input is not consumed and can -be matched by another rule. - -

-In a lexical rule, a regular expression r may be followed by a -lookahead expression. A lookahead expression is either a '$' -(the end of line operator) or a '/' followed by an arbitrary -regular expression. In both cases the lookahead is not consumed and -not included in the matched text region, but it is considered -while determining which rule has the longest match (see also -[*] How the input is matched). - -

-In the '$' case r is only matched at the end of a line in -the input. The end of a line is denoted by the regular expression -\r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085. -So a$ is equivalent to a / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085.This is a bit different to the situation described in [5]: -since in JFlex $ is a true trailing context, the end of file -does not count as end of line. - -

- -

-For arbitrary lookahead (also called trailing context) the -expression is matched only when followed by input that matches the -trailing context. Unfortunately the lookahead expression is not -really arbitrary: In a rule r1 / r2, either the text matched -by r1 must have a fixed length (e.g. if r1 is a string) -or the beginning of the trailing context r2 must not match the -end of r1. So for example "abc" / "a"|"b" is ok because -"abc" has a fixed length, "a"|"ab" / "x"* is ok because -no prefix of "x"* matches a postfix of "a"|"ab", but -"x"|"xy" / "yx" is not possible, because the postfix "y" -of "x"|"xy" is also a prefix of "yx". JFlex will report -such cases at generation time. The algorithm JFlex currently uses for matching -trailing context expressions is the one described in [1] (leading -to the deficiencies mentioned above). - -

-As of version 1.2, JFlex allows lex/flex style «EOF» rules in -lexical specifications. A rule -

-[StateList]  <<EOF>>    { some action code }
-
-is very similar to the %eofval directive (section [*]). -The difference lies in the optional StateList that may precede the «EOF» rule. The -action code will only be executed when the end of file is read and the -scanner is currently in one of the lexical states listed in StateList. -The same StateGroup (see section [*] -How the input is matched) and precedence -rules as in the ``normal'' rule case apply -(i.e. if there is more than one «EOF» -rule for a certain lexical state, the action of the one appearing -earlier in the specification will be executed). «EOF» rules -override settings of the %cup and %byaccj options and -should not be mixed with the %eofval directive. - -

-An Action consists either of a piece of Java code enclosed in -curly braces or is the special | action. The | action is -an abbreviation for the action of the following expression. - -

-Example: -

-expression1   |
-expression2   |
-expression3   { some action }
-
-is equivalent to the expanded form -
-expression1   { some action }
-expression2   { some action }
-expression3   { some action }
-
- -

-They are useful when you work with trailing context expressions. The -expression a | (c / d) | b is not syntactically legal, but can -easily be expressed using the | action: -

-a       |
-c / d   |
-b       { some action }
-
- -

- -


-How the input is matched -

-When consuming its input, the scanner determines the regular expression -that matches the longest portion of the input (longest match rule). If -there is more than one regular expression that matches the longest portion -of input (i.e. they all match the same input), the generated scanner chooses -the expression that appears first in the specification. After determining -the active regular expression, the associated action is executed. If there -is no matching regular expression, the scanner terminates the program with -an error message (if the %standalone directive has been used, the -scanner prints the unmatched input to java.lang.System.out instead -and resumes scanning). - -

-Lexical states can be used to further restrict the set of regular expressions -that match the current input. - -

- -

    -
  • A regular expression can only be matched when its associated set of lexical -states includes the currently active lexical state of the scanner or if -the set of associated lexical states is empty and the currently active lexical -state is inclusive. Exclusive and inclusive states only differ at this point: -rules with an empty set of associated states. - -

    -

  • -
  • The currently active lexical state of the scanner can be changed from within -an action of a regular expression using the method yybegin(). - -

    -

  • -
  • The scanner starts in the inclusive lexical state -YYINITIAL, which is always declared by default. - -

    -

  • -
  • The set of lexical states associated with a regular expression is -the StateList that precedes the expression. If a rule is -contained in one or more StateGroups, then the states of -these are also associated with the rule, i.e. they accumulate over -StateGroups. - -

    -Example: -

    -%states A, B
    -%xstates C
    -%%
    -expr1                   { yybegin(A); action }
    -<YYINITIAL, A> expr2    { action }
    -<A> {
    -  expr3                 { action }
    -  <B,C> expr4           { action }
    -}
    -
    -The first line declares two (inclusive) lexical states A and B, -the second line an exclusive lexical state C. -The default (inclusive) state YYINITIAL is always implicitly there and -doesn't need to be declared. The rule with expr1 has no -states listed, and is thus matched in all states but the exclusive -ones, i.e. A, B, and YYINITIAL. In its -action, the scanner is switched to state A. The second rule -expr2 can only match when the scanner is in state -YYINITIAL or A. The rule expr3 can only be -matched in state A and expr4 in states A, B, -and C. - -

    -

  • -
  • Lexical states are declared and used as Java int constants in -the generated class under the same name as they are used in the specification. -There is no guarantee that the values of these integer constants are -distinct. They are pointers into the generated DFA table, and if JFlex -recognizes two states as lexically equivalent (if they are used with the -exact same set of regular expressions), then the two constants will get -the same value. - -

    -

  • -
- -

- -

-The generated class -

-JFlex generates exactly one file containing one class from the specification -(unless you have declared another class in the first specification section). - -

-The generated class contains (among other things) the DFA tables, an input buffer, -the lexical states of the specification, a constructor, and the scanning method -with the user supplied actions. - -

-The name of the class is by default Yylex, it is customizable -with the %class directive (see also section -[*]). The input buffer of the lexer is connected with an -input stream over the java.io.Reader object which is passed -to the lexer in the generated constructor. If you want to provide your -own constructor for the lexer, you should always call the generated -one in it to initialize the input buffer. The input buffer should not -be accessed directly, but only over the advertised API (see also -section [*]). Its internal implementation may change -between releases or skeleton files without notice. - -

-The main interface to the outside world is the generated scanning -method (default name yylex, default return type -Yytoken). Most of its aspects are customizable (name, return -type, declared exceptions etc., see also section -[*]). If it is called, it will consume input until -one of the expressions in the specification is matched or an error -occurs. If an expression is matched, the corresponding action is -executed. It may return a value of the specified return type (in which -case the scanning method return with this value), or if it doesn't -return a value, the scanner resumes consuming input until the next -expression is matched. If the end of file is reached, the scanner -executes the EOF action, and (also upon each further call to the scanning -method) returns the specified EOF value (see also section [*]). - -

- -


-Scanner methods and fields accessible in actions (API) -

-Generated methods and member fields in JFlex scanners are prefixed -with yy to indicate that they are generated and to avoid name -conflicts with user code copied into the class. Since user code is -part of the same class, JFlex has no language means like the -private modifier to indicate which members and methods are -internal and which ones belong to the API. Instead, JFlex follows a -naming convention: everything starting with a zz prefix like -zzStartRead is to be considered internal and subject to -change without notice between JFlex releases. Methods and members of -the generated class that do not have a zz prefix like -yycharat belong to the API that the scanner class provides to -users in action code of the specification. They will be remain stable -and supported between JFlex releases as long as possible. - -

-Currently, the API consists of the following methods and member fields: - -

    -
  • String yytext() -
    returns the matched input text region - -

    -

  • -
  • int yylength() -
    returns the length of the matched input text region (does not require - a String object to be created) - -

    -

  • -
  • char yycharat(int pos) -
    returns the character at position pos from the matched text. - It is equivalent to yytext().charAt(pos), but faster. pos must be a value from 0 to yylength()-1. - -

    -

  • -
  • void yyclose() -
    closes the input stream. All subsequent calls to the scanning method will - return the end of file value - -

    -

  • -
  • void yyreset(java.io.Reader reader) -
    closes the current input stream, and resets the scanner to read from - a new input stream. All internal variables are reset, the old input - stream cannot be reused (content of the internal buffer is - discarded and lost). The lexical state is set to YY_INITIAL. - -

    -

  • -
  • void yypushStream(java.io.Reader reader) -
    Stores the current input stream on a stack, and - reads from a new stream. Lexical state, line, - char, and column counting remain untouched. - The current input stream can be restored with - yypopstream (usually in an «EOF» action). - -

    -A typical example for this are include files in - style of the C preprocessor. The corresponding - JFlex specification could look somewhat like this: -

    -"#include" {FILE}  { yypushStream(new FileReader(getFile(yytext()))); }
    -..
    -<<EOF>>        { if (yymoreStreams()) yypopStream(); else return EOF; }
    -
    - -

    -This method is only available in the skeleton file - skeleton.nested. You can find it in the - src directory of the JFlex distribution. - -

    -

  • -
  • void yypopStream() -
    Closes the current input stream and continues to - read from the one on top of the stream stack. - -

    -This method is only available in the skeleton file - skeleton.nested. You can find it in the - src directory of the JFlex distribution. - -

    -

  • -
  • boolean yymoreStreams() -
    Returns true iff there are still streams for yypopStream - left to read from on the stream stack. - -

    -This method is only available in the skeleton file - skeleton.nested. You can find it in the - src directory of the JFlex distribution. - -

    -

  • -
  • int yystate() -
    returns the current lexical state of the scanner. - -

    -

  • -
  • void yybegin(int lexicalState) -
    enters the lexical state lexicalState - -

    -

  • -
  • void yypushback(int number) -
    pushes number characters of the matched text back into the inputstream. - They will be read again in the next call of the scanning method. - The number of characters to be read again must not be greater than the length - of the matched text. The pushed back characters will after the call of - yypushback not be included in yylength and yytext(). - Please note that in Java strings are unchangeable, i.e. an action code like -
    -    String matched = yytext();
    -    yypushback(1);
    -    return matched;
    -
    - will return the whole matched text, while -
    -    yypushback(1);
    -    return yytext();
    -
    - will return the matched text minus the last character. - -

    -

  • -
  • int yyline -
    contains the current line of input (starting with 0, only active with - the %line directive) - -

    -

  • -
  • int yychar -
    contains the current character count in the input (starting with 0, - only active with the %char directive) - -

    -

  • -
  • int yycolumn -
    contains the current column of the current line (starting with 0, only - active with the %column directive) - -

    -

  • -
- -

- -


-Encodings, Platforms, and Unicode -

- -

-This section tries to shed some light on the issues of Unicode and -encodings, cross platform scanning, and how to deal with binary data. -My thanks go to Stephen Ostermiller for his input on this topic. - -

- -


-The Problem -

- -

-Before we dive straight into details, let's take a look at what the -problem is. The problem is Java's platform independence when you want -to use it. For scanners the interesting part about platform -independence is character encodings and how they are handled. - -

-If a program reads a file from disk, it gets a stream of bytes. In -earlier times, when the grass was green, and the world was much -simpler, everybody knew that the byte value 65 is, of course, an A. -It was no problem to see which bytes meant which characters (actually -these times never existed, but anyway). The normal Latin alphabet -only has 26 characters, so 7 bits or 128 distinct values should surely -be enough to map them, even if you allow yourself the luxury of upper -and lower case. Nowadays, things are different. The world suddenly -grew much larger, and all kinds of people wanted all kinds of special -characters, just because they use them in their language and writing. -This is were the mess starts. Since the 128 distinct values were -already filled up with other stuff, people began to use all 8 bits of -the byte, and extended the byte/character mappings to fit their need, -and of course everybody did it differently. Some people for instance -may have said ``let's use the value 213 for the German character ä''. Others -may have found that 213 should much rather mean é, because they didn't need -German and wrote French instead. As long as you use your program and -data files only on one platform, this is no problem, as all know what -means what, and everything gets used consistently. - -

-Now Java comes into play, and wants to run everywhere (once written, -that is) and now there suddenly is a problem: how do I get the same -program to say ä to a certain byte when it runs in Germany and maybe é -when it runs in France? And also the other way around: when I want to -say é on the screen, which byte value should I send to the operating -system? - -

-Java's solution to this is to use Unicode internally. Unicode aims to -be a superset of all known character sets and is therefore a perfect base -for encoding things that might get used all over the world. To make -things work correctly, you still have to know where you are and how to -map byte values to Unicode characters and vice versa, but the -important thing is, that this mapping is at least possible (you can -map Kanji characters to Unicode, but you cannot map them to ASCII or -iso-latin-1). - -

- -


-Scanning text files -

- -

-Scanning text files is the standard application for scanners like -JFlex. Therefore it should also be the most convenient one. Most times -it is. - -

-The following scenario works like a breeze: -You work on a platform X, write your lexer specification there, can -use any obscure Unicode character in it as you like, and compile the -program. Your users work on any platform Y (possibly but not -necessarily something different from X), they write their input files -on Y and they run your program on Y. No problems. - -

-Java does this as follows: -If you want to read anything in Java that is supposed to contain text, -you use a FileReader or some InputStream together with -an InputStreamReader. InputStreams return the raw bytes, the -InputStreamReader converts the bytes into Unicode characters with -the platform's default encoding. If a text file is produced on the -same platform, the platform's default encoding should do the mapping -correctly. Since JFlex also uses readers and Unicode internally, this -mechanism also works for the scanner specifications. If you write an -A in your text editor and the editor uses the platform's encoding (say A is 65), -then Java translates this into the logical Unicode A internally. -If a user writes an A on a completely different platform (say A is 237 there), -then Java also translates this into the logical Unicode A internally. Scanning -is performed after that translation and both match. - -

-Note that because of this mapping from bytes to characters, you should always -use the %unicode switch in you lexer specification if you want to scan -text files. %8bit may not be enough, even if -you know that your platform only uses one byte per character. The encoding -Cp1252 used on many Windows machines for instance knows 256 characters, but -the character ´ with Cp1252 code \x92 has the Unicode value \u2019, which -is larger than 255 and which would make your scanner throw an -ArrayIndexOutOfBoundsException if it is encountered. - -

-So for the usual case you don't have to do anything but use the -%unicode switch in your lexer specification. - -

-Things may break when you produce a text file on platform X and -consume it on a different platform Y. Let's say you have a file -written on a Windows PC using the encoding Cp1252. Then you move -this file to a Linux PC with encoding ISO 8859-1 and there you want -to run your scanner on it. Java now thinks the file is encoded -in ISO 8859-1 (the platform's default encoding) while it really is -encoded in Cp1252. For most characters -Cp1252 and ISO 8859-1 are the same, but for the byte values \x80 -to \x9f they disagree: ISO 8859-1 is undefined there. You can fix -the problem by telling Java explicitly which encoding to use. When -constructing the InputStreamReader, you can give the encoding -as argument. The line -

-Reader r = new InputStreamReader(input, "Cp1252"); - -
-will do the trick. - -

-Of course the encoding to use can also come from the data itself: -for instance, when you scan a HTML page, it may have embedded -information about its character encoding in the headers. - -

-More information about encodings, which ones are supported, how -they are called, and how to set them may be found in the -official Java documentation in the chapter about -internationalization. -The link -http://java.sun.com/j2se/1.3/docs/guide/intl/ -leads to an online version of this for Sun's JDK 1.3. - -

- -


-Scanning binaries -

- -

-Scanning binaries is both easier and more difficult -than scanning text files. It's easier because you want -the raw bytes and not their meaning, i.e. you don't want -any translation. -It's more difficult because it's not so easy to get -``no translation'' when you use Java readers. - -

-The problem (for binaries) is that JFlex scanners are -designed to work on text. Therefore the interface is -the Reader class (there is a constructor -for InputStream instances, but it's just there -for convenience and wraps an InputStreamReader -around it to get characters, not bytes). -You can still get a binary scanner when you write -your own custom InputStreamReader class that -does explicitly no translation, but just copies -byte values to character codes instead. It sounds -quite easy, and actually it is no big deal, but there -are a few little pitfalls on the way. In the scanner -specification you can only enter positive character -codes (for bytes that is \x00 -to \xFF). Java's byte type on the other hand -is a signed 8 bit integer (-128 to 127), so you have to convert -them properly in your custom Reader. Also, you should -take care when you write your lexer spec: if you -use text in there, it gets interpreted by an encoding -first, and what scanner you get as result might depend -on which platform you run JFlex on when you generate -the scanner (this is what you want for text, but for binaries it -gets in the way). If you are not sure, or if the development -platform might change, it's probably best to use character -code escapes in all places, since they don't change their -meaning. - -

-To illustrate these points, the example in examples/binary -contains a very small binary scanner that tries to -detect if a file is a Java class file. For that -purpose it looks if the file begins with the magic number \xCAFEBABE. - -

- -


-A few words on performance -

-This section gives some empirical results about the speed of JFlex generated -scanners in comparison to those generated by JLex, -compares a JFlex scanner with a handwritten -one, and presents some tips on how to make -your specification produce a faster scanner. - -

- -


-Comparison of JLex and JFlex -

-Scanners generated by the tool JLex are quite fast. It was however -possible to further improve the performance of generated scanners -using JFlex. The following table shows the results that were produced -by the scanner specification of a small toy programming language (in -fact the example from the JLex website). The scanner was generated -using JLex and all three different JFlex code generation methods. Then -it was run on a W98 system using Sun's JDK 1.3 with different sample inputs -of that toy programming language. All test runs were made under the -same conditions on an otherwise idle machine. - -

-The values presented in the table denote the time from the first call -to the scanning method to returning the EOF value and the speedup in -percent. The tests were run both int the mixed (HotSpot) JVM mode and -the pure interpreted mode. The mixed mode JVM brings -about a factor of 10 performance improvement, the difference between -JLex and JFlex only decreases slightly. - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 KBJVMJLex%switchspeedup%tablespeedup%packspeedup
 496hotspot325 ms261 ms24.5 %261 ms24.5 %261 ms24.5 %
 187hotspot127 ms98 ms29.6 %94 ms35.1 %96 ms32.3 %
 93hotspot66 ms50 ms32.0 %50 ms32.0 %48 ms37.5 %
 496interpr.4009 ms3025 ms32.5 %3258 ms23.1 %3231 ms24.1 %
 187interpr.1641 ms1155 ms42.1 %1245 ms31.8 %1234 ms33.0 %
 93interpr.817 ms573 ms42.6 %617 ms32.4 %613 ms33.3 %
- -


- -

-Since the scanning time of the lexical analyzer examined in the table -above includes lexical actions that often need to create new object instances, -another table shows the execution time for the same specification with empty -lexical actions to compare the pure scanning engines. - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 KBJVMJLex%switchspeedup%tablespeedup%packspeedup
 496hotspot204 ms140 ms45.7 %138 ms47.8 %140 ms45.7 %
 187hotspot83 ms55 ms50.9 %52 ms59.6 %52 ms59.6 %
 93hotspot41 ms28 ms46.4 %26 ms57.7 %26 ms57.7 %
 496interpr.2983 ms2036 ms46.5 %2230 ms33.8 %2232 ms33.6 %
 187interpr.1260 ms793 ms58.9 %865 ms45.7 %867 ms45.3 %
 93interpr.628 ms395 ms59.0 %432 ms45.4 %432 ms45.4 %
- -


- -

-Execution time of single instructions depends on the platform and -the implementation of the Java Virtual Machine the program is executed -on. Therefore the tables above cannot be used as a reference to which -code generation method of JFlex is the right one to choose in general. -The following table was produced by the same lexical specification and -the same input on a Linux system also using Sun's JDK 1.3. - -

-With actions: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 KBJVMJLex%switchspeedup%tablespeedup%packspeedup
 496hotspot246 ms203 ms21.2 %193 ms27.5 %190 ms29.5 %
 187hotspot99 ms76 ms30.3 %69 ms43.5 %70 ms41.4 %
 93hotspot48 ms36 ms33.3 %34 ms41.2 %35 ms37.1 %
 496interpr.3251 ms2247 ms44.7 %2430 ms33.8 %2444 ms33.0 %
 187interpr.1320 ms848 ms55.7 %958 ms37.8 %920 ms43.5 %
 93interpr.658 ms423 ms55.6 %456 ms44.3 %452 ms45.6 %
- -


- -

-Without actions: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 KBJVMJLex%switchspeedup%tablespeedup%packspeedup
 496hotspot136 ms78 ms74.4 %76 ms78.9 %77 ms76.6 %
 187hotspot59 ms31 ms90.3 %48 ms22.9 %32 ms84.4 %
 93hotspot28 ms15 ms86.7 %15 ms86.7 %15 ms86.7 %
 496interpr.1992 ms1047 ms90.3 %1246 ms59.9 %1215 ms64.0 %
 187interpr.859 ms408 ms110.5 %479 ms79.3 %487 ms76.4 %
 93interpr.435 ms200 ms117.5 %237 ms83.5 %242 ms79.8 %
- -


- -

-Although all JFlex scanners were faster than those generated by JLex, -slight differences between JFlex code generation methods show up when compared -to the run on the W98 system. - -

-The following table compares a handwritten scanner for the Java language -obtained from the website of CUP with the JFlex generated scanner for Java -that comes with JFlex in the examples directory. They were tested -on different .java files on a Linux machine with Sun's JDK 1.3. - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 linesKBJVMhandwritten scannerJFlex generated scanner
 19050496hotspot824 ms248 ms235 % faster
 6350165hotspot272 ms84 ms232 % faster
 127033hotspot53 ms18 ms194 % faster
 19050496interpreted5.83 s3.85 s51 % faster
 6350165interpreted1.95 s1.29 s51 % faster
 127033interpreted0.38 s0.25 s52 % faster
- -


- -

-Although JDK 1.3 seems to speed up the handwritten scanner if compared -to JDK 1.1 or 1.2 more than the generated one, the generated scanner is -still up to 3.3 times as fast as the handwritten one. One example of -a handwritten scanner that is -considerably slower than the equivalent generated one is surely no -proof for all generated scanners being faster than handwritten. It is -clearly impossible to prove something like that, since you could -always write the generated scanner by hand. From a software -engineering point of view however, there is no excuse for writing a -scanner by hand since this task takes more time, is more difficult and -therefore more error prone than writing a compact, readable and easy -to change lexical specification. (I'd like to add, that I do not -think, that the handwritten scanner from the CUP website used here in -the test is stupid or badly written or anything like that. I actually -think, Scott did a great job with it, and that for learning about -lexers it is quite valuable to study it or even to write a similar one -for oneself.) - -

- -


-How to write a faster specification -

-Although JFlex generated scanners show good performance without -special optimizations, there are some heuristics that can make a -lexical specification produce an even faster scanner. Those are -(roughly in order of performance gain): - -

- -

    -
  • Avoid rules that require backtracking - -

    -From the C/C++ flex [11] manpage: ``Getting rid -of backtracking is messy and often may be an enormous amount of work for -a complicated scanner.'' Backtracking is introduced by the longest match -rule and occurs for instance on this set of expressions: - -

    - "averylongkeyword" -
    . - -

    -With input "averylongjoke" the scanner has to read all charcters -up to 'j' to decide that rule . should be matched. All -characters of "verylong" have to be read again for the next -matching process. Backtracking can be avoided in general by adding -error rules that match those error conditions - -

    - "av"|"ave"|"avery"|"averyl"|.. - -

    -While this is impractical in most scanners, there is still the -possibility to add a ``catch all'' rule for a lengthy list of keywords -

    -"keyword1"  { return symbol(KEYWORD1); } 
    -.. 
    -"keywordn"  { return symbol(KEYWORDn); }
    -[a-z]+      { error("not a keyword"); }
    -
    -Most programming language scanners already have a rule like this for -some kind of variable length identifiers. - -

    -

  • -
  • Avoid line and column counting - -

    -It costs multiple additional comparisons per input character and the - matched text has to be rescanned for counting. In most scanners it - is possible to do the line counting in the specification by - incrementing yyline each time a line terminator has been - matched. Column counting could also be included in actions. This - will be faster, but can in some cases become quite messy. - -

    -

  • -
  • Avoid lookahead expressions and the end of line operator '$' - -

    -The trailing context will first have to be read and then (because - it is not to be consumed) read again. - -

    -

  • -
  • Avoid the beginning of line operator '^' - -

    -It costs multiple additional comparisons per match. In some - cases one extra lookahead character is needed (when the last character read is - \r the scanner has to read one character ahead to check if - the next one is an \n or not). - -

    -

  • -
  • Match as much text as possible in a rule. - -

    -One rule is matched in the innermost loop of the scanner. After - each action some overhead for setting up the internal state of the - scanner is necessary. -

  • -
- -

-Note that writing more rules in a specification does not make the generated -scanner slower (except when you have to switch to another code generation -method because of the larger size). - -

-The two main rules of optimization apply also for lexical specifications: - -

    -
  1. don't do it -
  2. -
  3. (for experts only) don't do it yet -
  4. -
- -

-Some of the performance tips above contradict a readable and compact -specification style. When in doubt or when requirements are not or not -yet fixed: don't use them - the specification can always be optimized -in a later state of the development process. - -

- -

-Porting Issues -

- -

- -


-Porting from JLex -

-JFlex was designed to read old JLex specifications unchanged and to -generate a scanner which behaves exactly the same as the one generated -by JLex with the only difference of being faster. - -

-This works as expected on all well formed JLex specifications. - -

-Since the statement above is somewhat absolute, let's take a look at -what ``well formed'' means here. A JLex specification is well formed, when -it - -

    -
  • generates a working scanner with JLex - -

    -

  • -
  • doesn't contain the unescaped characters ! and ~ - -

    -They are operators in JFlex while JLex treats them as normal - input characters. You can easily port such a JLex specification - to JFlex by replacing every ! with \! and every - ~ with \~ in all regular expressions. - -

    -

  • -
  • has only complete regular expressions surrounded by parentheses in - macro definitions - -

    -This may sound a bit harsh, but could otherwise be a major problem - - it can also help you find some disgusting bugs in your - specification that didn't show up in the first place. In JLex, a - right hand side of a macro is just a piece of text, that is copied - to the point where the macro is used. With this, some weird kind of - stuff like -

    -  macro1 = ("hello"
    -  macro2 = {macro1})*
    -
    - was possible (with macro2 expanding to ("hello")*). This - is not allowed in JFlex and you will have to transform such - definitions. There are however some more subtle kinds of errors that - can be introduced by JLex macros. Let's consider a definition like - macro = a|b and a usage like {macro}*. - This expands in JLex to a|b* and not to the probably intended - (a|b)*. - -

    -JFlex uses always the second form of expansion, since this is the natural - form of thinking about abbreviations for regular expressions. - -

    -Most specifications shouldn't suffer from this problem, because - macros often only contain (harmless) character classes like - alpha = [a-zA-Z] and more dangerous definitions like - -

    - ident = {alpha}({alpha}|{digit})* - -

    -are only used to write rules like - -

    - {ident} { .. action .. } - -

    -and not more complex expressions like - -

    - {ident}* { .. action .. } - -

    -where the kind of error presented above would show up. -

  • -
- -

- -


-Porting from lex/flex -

-This section tries to give an overview of activities and possible -problems when porting a lexical specification from the C/C++ tools lex -and flex [11] available on most Unix systems to JFlex. - -

-Most of the C/C++ specific features are naturally not present in JFlex, -but most ``clean'' lex/flex lexical specifications can be ported to -JFlex without very much work. - -

-This section is by far not complete and is based mainly on a survey of -the flex man page and very little personal experience. If you do -engage in any porting activity from lex/flex to JFlex and encounter -problems, have better solutions for points presented here or have just -some tips you would like to share, please do contact me. I will -incorporate your experiences in this manual (with all due credit to you, -of course). - -

- -

-Basic structure -

-A lexical specification for flex has the following basic structure: -
-definitions
-%%
-rules
-%%
-user code
-
- -

-The user code section usually contains some C code that is used -in actions of the rules part of the specification. For JFlex most -of this code will have to be included in the class code %{..%} -directive in the options and declarations section (after -translating the C code to Java, of course). - -

- -

-Macros and Regular Expression Syntax -

-The definitions section of a flex specification is quite similar -to the options and declarations part of JFlex specs. - -

-Macro definitions in flex have the form: -

-<identifier>  <expression>
-
-To port them to JFlex macros, just insert a = between <identifier> -and <expression>. - -

-The syntax and semantics of regular expressions in flex are pretty much the -same as in JFlex. A little attention is needed for some escape sequences -present in flex (such as \a) that are not supported in JFlex. These -escape sequences should be transformed into their octal or hexadecimal -equivalent. - -

-Another point are predefined character classes. Flex offers the ones directly -supported by C, JFlex offers the ones supported by Java. These classes will -sometimes have to be listed manually (if there is need for this feature, it -may be implemented in a future JFlex version). - -

- -

-Lexical Rules -

-Since flex is mostly Unix based, the '^' (beginning of line) and -'$' (end of line) operators, consider the \n character as only line terminator. This should usually cause not much problems, but you -should be prepared for occurrences of \r or \r\n or one of -the characters \u2028, \u2029, \u000B, \u000C, -or \u0085. They are considered to be line terminators in Unicode and -therefore may not be consumed when -^ or $ is present in a rule. -

-The trailing context algorithm of flex is better than the one used in -JFlex. Therefore lookahead expressions could cause major headaches. JFlex -will issue an error message at generation time, if it cannot generate -a scanner for a certain lookahead expression. (sorry, I have no more tips here -on that yet. If anyone knows how the flex lookahead algorithm works (or any better one) -and can be efficiently implemented, again: please contact me). - -

- -


-Working together -

- -

- -


-JFlex and CUP -

-One of the main design goals of JFlex was to make interfacing with the free -Java parser generator CUP [8] as easy as possibly. -This has been done by giving -the %cup directive a special meaning. An -interface however always has two sides. This section concentrates on the -CUP side of the story. - -

- -

-CUP version 0.10j -

-Since CUP version 0.10j, this has been simplified greatly by the new -CUP scanner interface java_cup.runtime.Scanner. JFlex lexers now implement -this interface automatically when then %cup -switch is used. There are no special parser code, init - code or scan with options any more that you have to provide -in your CUP parser specification. You can just concentrate on your grammar. - -

-If your generated Lexer has the class name Scanner, the parser -is started from the a main program like this: - -

-

-...
-  try {
-    parser p = new parser(new Scanner(new FileReader(fileName)));
-    Object result = p.parse().value;
-  }
-  catch (Exception e) {
-...
-
- -

- -

-Using existing JFlex/CUP specifications with CUP 0.10j -

-If you already have an existing specification and you would like to upgrade -both JFlex and CUP to their newest version, you will probably have to adjust -your specification. - -

-The main difference between the %cup switch in -JFlex 1.2.1 and lower, and the current JFlex version is, that JFlex scanners -now automatically implement the java_cup.runtime.Scanner interface. -This means, that the scanning function now changes its name from yylex() -to next_token(). - -

-The main difference from older CUP versions to 0.10j is, that CUP now -has a default constructor that accepts a java_cup.runtime.Scanner -as argument and that uses this scanner as -default (so no scan with code is necessary any more). - -

-If you have an existing CUP specification, it will probably look somewhat like this: -

-parser code {:
-  Lexer lexer;
-
-  public parser (java.io.Reader input) {
-    lexer = new Lexer(input);
-  }
-:};
-
-scan with {: return lexer.yylex(); :};
-
- -

-To upgrade to CUP 0.10j, you could change it to look like this: -

-parser code {:
-  public parser (java.io.Reader input) {
-    super(new Lexer(input));
-  }
-:};
-
- -

-If you do not mind to change the method that is calling the parser, -you could remove the constructor entirely (and if there is nothing else -in it, the whole parser code section as well, of course). The calling -main procedure would then construct the parser as shown in the section above. - -

-The JFlex specification does not need to be changed. - -

- -

-Using older versions of CUP -

-For people, who like or have to use older versions of CUP, the following section -explains ``the old way''. Please note, that the standard name of the scanning -function with the %cup switch is not -yylex(), but next_token(). - -

-If you have a scanner specification that begins like this: - -

-

-package PACKAGE;
-import java_cup.runtime.*;   /* this is convenience, but not necessary */
- 
-%%
- 
-%class Lexer
-%cup
-..
-
- -

-then it matches a CUP specification starting like - -

-

-package PACKAGE;
-
-parser code {:
-  Lexer lexer;
-
-  public parser (java.io.Reader input) {
-    lexer = new Lexer(input);
-  }
-:};
-
-scan with {: return lexer.next_token(); :};
-
-..
-
- -

-This assumes that the generated parser will get the name parser. -If it doesn't, you have to adjust the constructor name. - -

-The parser can then be started in a main routine like this: - -

-

-..
-  try {
-    parser p = new parser(new FileReader(fileName));
-    Object result = p.parse().value; 
-  }
-  catch (Exception e) {
-..
-
- -

-If you want the parser specification to be independent of the name of the generated -scanner, you can instead write an interface Lexer - -

-

-public interface Lexer {
-  public java_cup.runtime.Symbol next_token() throws java.io.IOException;
-}
-
- -

-change the parser code to: - -

-

-package PACKAGE;
-
-parser code {:
-  Lexer lexer;
-
-  public parser (Lexer lexer) {
-    this.lexer = lexer;
-  }
-:};
-
-scan with {: return lexer.next_token(); :};
-
-..
-
- -

-tell JFlex about the Lexer -interface using the %implements -directive: - -

-

-..
-%class Scanner     /* not Lexer now since that is our interface! */
-%implements Lexer
-%cup
-..
-
- -

-and finally change the main routine to look like - -

-

-...
-  try {
-    parser p = new parser(new Scanner(new FileReader(fileName)));
-    Object result = p.parse().value;
-  }
-  catch (Exception e) {
-...
-
- -

-If you want to improve the error messages that CUP generated parsers -produce, you can also override the methods report_error and report_fatal_error -in the ``parser code'' section of the CUP specification. The new methods -could for instance use yyline and yycolumn (stored in -the left and right members of class java_cup.runtime.Symbol) -to report error positions more conveniently for the user. The lexer and -parser for the Java language in the examples/java directory of the -JFlex distribution use this style of error reporting. These specifications -also demonstrate the techniques above in action. - -

- -


-JFlex and BYacc/J -

- -

-JFlex has builtin support for the Java extension -BYacc/J -[9] by Bob Jamison -to the classical Berkeley Yacc parser generator. -This section describes how to interface BYacc/J with JFlex. It -builds on many helpful suggestions and comments from Larry Bell. - -

-Since Yacc's architecture is a bit different from CUP's, the -interface setup also works in a slightly different manner. -BYacc/J expects a function int yylex() in the parser -class that returns each next token. Semantic values are expected -in a field yylval of type parserval where ``parser'' -is the name of the generated parser class. - -

-For a small calculator example, one could use a setup like the -following on the JFlex side: - -

-

-%%
-
-%byaccj
-
-%{
-  /* store a reference to the parser object */
-  private parser yyparser;
-
-  /* constructor taking an additional parser object */
-  public Yylex(java.io.Reader r, parser yyparser) {
-    this(r);
-    this.yyparser = yyparser;
-  }
-%}
-
-NUM = [0-9]+ ("." [0-9]+)?
-NL  = \n | \r | \r\n
-
-%%
-
-/* operators */
-"+" | 
-..
-"(" | 
-")"    { return (int) yycharat(0); }
-
-/* newline */
-{NL}   { return parser.NL; }
-
-/* float */
-{NUM}  { yyparser.yylval = new parserval(Double.parseDouble(yytext()));
-         return parser.NUM; }
-
- -

-The lexer expects a reference to the parser in its constructor. -Since Yacc allows direct use of terminal characters like '+' -in its specifications, we just return the character code for -single char matches (e.g. the operators in the example). Symbolic -token names are stored as public static int constants in -the generated parser class. They are used as in the NL token -above. Finally, for some tokens, a semantic value may have to be -communicated to the parser. The NUM rule demonstrates that -bit. - -

-A matching BYacc/J parser specification could look like this: -

-%{
-  import java.io.*;
-%}
-      
-%token NL          /* newline  */
-%token <dval> NUM  /* a number */
-
-%type <dval> exp
-
-%left '-' '+'
-..
-%right '^'         /* exponentiation */
-      
-%%
-
-..
-      
-exp:     NUM          { $$ = $1; }
-       | exp '+' exp  { $$ = $1 + $3; }
-       ..
-       | exp '^' exp  { $$ = Math.pow($1, $3); }
-       | '(' exp ')'  { $$ = $2; }
-       ;
-
-%%
-  /* a reference to the lexer object */
-  private Yylex lexer;
-
-  /* interface to the lexer */
-  private int yylex () {
-    int yyl_return = -1;
-    try {
-      yyl_return = lexer.yylex();
-    }
-    catch (IOException e) {
-      System.err.println("IO error :"+e);
-    }
-    return yyl_return;
-  }
-
-  /* error reporting */
-  public void yyerror (String error) {
-    System.err.println ("Error: " + error);
-  }
-
-  /* lexer is created in the constructor */
-  public parser(Reader r) {
-    lexer = new Yylex(r, this);
-  }
-
-  /* that's how you use the parser */
-  public static void main(String args[]) throws IOException {
-    parser yyparser = new parser(new FileReader(args[0]));
-    yyparser.yyparse();    
-  }
-
- -

-Here, the customized part is mostly in the user code section: -We create the lexer in the constructor of the parser and store -a reference to it for later use in the parser's int yylex() -method. This yylex in the parser only calls int yylex() -of the generated lexer and passes the result on. If something goes -wrong, it returns -1 to indicate an error. - -

-Runnable versions of the specifications above -are located in the examples/byaccj directory of the JFlex -distribution. - -

- -


-Bugs and Deficiencies -

- -

- -

-Deficiencies -

-The trailing context algorithm described in [1] and used in -JFlex is incorrect. It does not work, when a postfix of the regular -expression matches a prefix of the trailing context and the length -of the text matched by the expression does not have a fixed size. -JFlex will report these cases as errors at generation time. - -

- -

-Bugs -

- -

-As of April 12, 2004 the following bugs are known in JFlex: - -

    -
  • The check if a lookahead expression is legal fails on some expressions. - The lookahead algorithm itself works as advertised, but JFlex will not - report all lookahead expressions that the algorithm can't handle at generation - time. Some cases are caught by the check, but not all. - -

    -Workaround: Check lookahead expressions manually. A lookahead expression - r1/r2 is ok, if no postfix of r1 can match a prefix of r2. -

  • -
- -

-If you find new ones, please use the bugs section of the -JFlex website -to report them. - -

- -


-Copying and License -

-JFlex is free software, published under the terms of the -GNU General Public License. - -

-There is absolutely NO WARRANTY for JFlex, its code and its documentation. - -

-The code generated by JFlex inherits the copyright of the specification it -was produced from. If it was your specification, you may use the generated -code without restriction. - -

-See the file COPYRIGHT -for more information. - -

- -


-Bibliography -

- -

-

1 -
- A. Aho, R. Sethi, J. Ullman, Compilers: Principles, Techniques, and Tools, 1986 - -

-

2 -
- A. W. Appel, Modern Compiler Implementation in Java: basic techniques, 1997 - -

-

3 -
- E. Berk, JLex: A lexical analyser generator for Java, -
http://www.cs.princeton.edu/~appel/modern/java/JLex/ -

-

4 -
- K. Brouwer, W. Gellerich,E. Ploedereder, - Myths and Facts about the Efficient Implementation of Finite Automata and Lexical Analysis, - in: Proceedings of the 7th International Conference on Compiler Construction (CC '98), 1998 - -

-

5 -
- M. Davis, Unicode Regular Expression Guidelines, Unicode Technical Report #18, 2000 -
http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html -

-

6 -
- P. Dencker, K. Dürre, J. Henft, Optimization of Parser Tables for portable Compilers, - in: ACM Transactions on Programming Languages and Systems 6(4), 1984 - -

-

7 -
- J. Gosling, B. Joy, G. Steele, The Java Language Specifcation, 1996, -
http://www.javasoft.com/docs/books/jls/ -

-

8 -
- S. E. Hudson, CUP LALR Parser Generator for Java, -
http://www.cs.princeton.edu/~appel/modern/java/CUP/ -

-

9 -
- B. Jamison, BYacc/J, -
http://troi.lincom-asg.com/~rjamison/byacc/ -

-

10 -
- T. Lindholm, F. Yellin, The Java Virtual Machine Specification, 1996, -
http://www.javasoft.com/docs/books/vmspec/ -

-

11 -
- V. Paxon, flex - The fast lexical analyzer generator, 1995 - -

-

12 -
- R. E. Tarjan, A. Yao, Storing a Sparse Table, in: Communications of the ACM 22(11), 1979 - -

-

13 -
- R. Wilhelm, D. Maurer, Übersetzerbau, Berlin 19972 - -

-

- -

-


Footnotes

-
-
... Java[*] -
Java is a trademark of -Sun Microsystems, Inc., and refers to Sun's Java programming language. -JFlex is not sponsored by or affiliated with Sun Microsystems, Inc. - -


-
-Mon Apr 12 20:58:12 EST 2004, Gerwin Klein -
- - diff --git a/tools/lexer/jflex-1.4/doc/manual.pdf b/tools/lexer/jflex-1.4/doc/manual.pdf deleted file mode 100644 index 96734f8321220623295ca9388cec91c81da3bb7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392211 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 E 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 #;AgSTKvQZp8x8GX_(`& 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

- * Most of the time you want to do character encoding translation when translating bytes to - * characters. If you are planning on displaying the text, you should always do this and should - * use an InputStreamReader for the purpose. Sometimes it is useful to treat characters as bytes - * with some extra bits. In these cases you would want to use a StraightStreamReader. - *

- * For top efficiency, consider wrapping an StraightStreamReader within a BufferedReader. For example:
- * BufferedReader in = new BufferedReader(new StraightStreamReader(System.in)); - */ -public class StraightStreamReader extends Reader{ - - /** - * The input stream from which all methods in this class read. - */ - private InputStream in; - - /** - * A byte array to be used for calls to the InputStream. This - * is cached as a class variable to avoid object creation and - * deletion each time a read is called. This buffer may be - * null and may not be large enough. Make sure to check it - * before using it. - */ - private byte[] buffer; - - /** - * Create a StraightStreamReader from an InputStream - * - * @param in InputStream to wrap a Reader around. - */ - public StraightStreamReader(InputStream in) { - this.in = in; - } - - /** - * Close the stream. - * - * @throws IOException If an I/O error occurs - */ - public void close() throws IOException { - in.close(); - } - - /** - * Mark the present position in the stream. Subsequent calls to reset() - * will attempt to reposition the stream to this point. Not all - * character-input streams support the mark() operation. - * - * @param readAheadLimit Limit on the number of characters that may be read - * while still preserving the mark. After reading this many characters, - * attempting to reset the stream may fail. - * @throws IOException If the stream does not support mark(), or if some other I/O error occurs - */ - public void mark(int readAheadLimit) throws IOException { - in.mark(readAheadLimit); - } - - /** - * Tell whether this stream supports the mark() operation. - * - * @return true if and only if this stream supports the mark operation. - */ - public boolean markSupported(){ - return in.markSupported(); - } - - /** - * Read a single character. This method will block until a character is available, an - * I/O error occurs, or the end of the stream is reached. - * - * @return The character read, as an integer in the range 0 to 256 (0x00-0xff), or -1 if - * the end of the stream has been reached - * @throws IOException If an I/O error occurs - */ - public int read() throws IOException { - return in.read(); - } - - /** - * Read characters into an array. This method will block until some input is available, - * an I/O error occurs, or the end of the stream is reached. - * - * @param cbuf Destination buffer - * @return The number of bytes read, or -1 if the end of the stream has been reached - * @throws IOException If an I/O error occurs - */ - public int read(char[] cbuf) throws IOException { - return read(cbuf, 0, cbuf.length); - } - - /** - * Read characters into an array. This method will block until some input is available, - * an I/O error occurs, or the end of the stream is reached. - * - * @param cbuf Destination buffer - * @param off Offset at which to start storing characters - * @param len Maximum number of characters to read - * @return The number of bytes read, or -1 if the end of the stream has been reached - * @throws IOException If an I/O error occurs - */ - public int read(char[] cbuf, int off, int len) throws IOException { - // ensure the capacity of the buffer that we will be using - // to read from the input stream - if (buffer == null || buffer.length < len){ - buffer = new byte[len]; - } - // read from the input stream and copy it to the character array - int length = in.read(buffer, 0, len); - for (int i=0; i 0); - } - - /** - * Reset the stream. If the stream has been marked, then attempt to reposition it at the mark. - * If the stream has not been marked, then attempt to reset it in some way appropriate to the - * particular stream, for example by repositioning it to its starting point. Not all - * character-input streams support the reset() operation, and some support reset() - * without supporting mark(). - * - * @throws IOException If the stream has not been marked, or if the mark has been invalidated, - * or if the stream does not support reset(), or if some other I/O error occurs - */ - public void reset() throws IOException { - in.reset(); - } - - /** - * Skip characters. This method will block until some characters are available, - * an I/O error occurs, or the end of the stream is reached. - * - * @param n The number of characters to skip - * @return The number of characters actually skipped - * @throws IllegalArgumentException If n is negative - * @throws IOException If an I/O error occurs - */ - public long skip(long n) throws IOException { - return in.skip(n); - } - - /** - * Regression test for this class. If this class is working, this should - * run and print no errors. - *

- * This method creates a tempory file in the working directory called "test.txt". - * This file should not exist before hand, and the program should have create, - * read, write, and delete access to this file. - * - * @param args command line arguments (ignored) - */ - private static void main(String[] args){ - try { - File f = new File("test.txt"); - if (f.exists()){ - throw new IOException(f + " already exists. I don't want to overwrite it."); - } - StraightStreamReader in; - char[] cbuf = new char[0x1000]; - int read; - int totRead; - - // write a file with all possible values of bytes - FileOutputStream out = new FileOutputStream(f); - for (int i=0x00; i<0x100; i++){ - out.write(i); - } - out.close(); - - // read it back using the read single character method - in = new StraightStreamReader(new FileInputStream(f)); - for (int i=0x00; i<0x100; i++){ - read = in.read(); - if (read != i){ - System.err.println("Error: " + i + " read as " + read); - } - } - in.close(); - - // read as much of it back as possible with one simple buffer read. - in = new StraightStreamReader(new FileInputStream(f)); - totRead = in.read(cbuf); - if (totRead != 0x100){ - System.err.println("Simple buffered read did not read the full amount: 0x" + Integer.toHexString(totRead)); - } - for (int i=0x00; i 0){ - totRead += read; - } - if (totRead != 0x100){ - System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); - } - for (int i=0x00; i 0){ - totRead += read; - } - if (totRead != 0x100){ - System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); - } - for (int i=0x00; i 0){ - totRead += read; - } - if (totRead != 0x100){ - System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); - } - for (int i=0x00; i * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -import java.io.*; - -%% - -%class BinaryLexer -%8bit - -%int - -%{ - public static void main(String [] argv) { - for (int i = 0; i < argv.length; i++) { - try { - System.out.print("["+argv[i]+"] is "); - BinaryLexer l = new BinaryLexer(new StraightStreamReader(new FileInputStream(argv[i]))); - l.yylex(); - } - catch (Exception e) { - e.printStackTrace(System.out); - System.exit(1); - } - } - } -%} - -magic = \xCA \xFE \xBA \xBE - -%% - -{magic} [^]+ { System.out.println("a class file"); } - -[^]+ { System.out.println("not a class file"); } diff --git a/tools/lexer/jflex-1.4/examples/byaccj/Makefile b/tools/lexer/jflex-1.4/examples/byaccj/Makefile deleted file mode 100644 index 28a361dda157..000000000000 --- a/tools/lexer/jflex-1.4/examples/byaccj/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# only works with the Java extension of yacc: -# byacc/j from http://troi.lincom-asg.com/~rjamison/byacc/ - -JFLEX = jflex -BYACCJ = yacc -J -JAVAC = javac - -# targets: - -all: Parser.class - -run: Parser.class - java Parser - -build: clean Parser.class - -clean: - rm -f *~ *.class *.java - -Parser.class: Yylex.java Parser.java - $(JAVAC) Parser.java - -Yylex.java: calc.flex - $(JFLEX) calc.flex - -Parser.java: calc.y - $(BYACCJ) calc.y diff --git a/tools/lexer/jflex-1.4/examples/byaccj/README b/tools/lexer/jflex-1.4/examples/byaccj/README deleted file mode 100644 index ab6831e8026c..000000000000 --- a/tools/lexer/jflex-1.4/examples/byaccj/README +++ /dev/null @@ -1,22 +0,0 @@ -This directory contains an interoperability example for BYacc/J and JFlex -(a small calculator) - -You need the parser generator byacc/j from -http://troi.lincom-asg.com/~rjamison/byacc/ -for this example to work (version byacc/j 1.1 has been tested). - -Use the Makefile to generate the lexer and parser. -The example can then be started with - -java Parser - - -files: - -calc.flex - JFlex specification for the lexical part of the arithmetic expressions - -calc.y - BYacc/J specification and main program for the calculator - - diff --git a/tools/lexer/jflex-1.4/examples/byaccj/calc.flex b/tools/lexer/jflex-1.4/examples/byaccj/calc.flex deleted file mode 100644 index 8ad62bc4332f..000000000000 --- a/tools/lexer/jflex-1.4/examples/byaccj/calc.flex +++ /dev/null @@ -1,62 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2000 Gerwin Klein * - * All rights reserved. * - * * - * Thanks to Larry Bell and Bob Jamison for suggestions and comments. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -%% - -%byaccj - -%{ - private Parser yyparser; - - public Yylex(java.io.Reader r, Parser yyparser) { - this(r); - this.yyparser = yyparser; - } -%} - -NUM = [0-9]+ ("." [0-9]+)? -NL = \n | \r | \r\n - -%% - -/* operators */ -"+" | -"-" | -"*" | -"/" | -"^" | -"(" | -")" { return (int) yycharat(0); } - -/* newline */ -{NL} { return Parser.NL; } - -/* float */ -{NUM} { yyparser.yylval = new ParserVal(Double.parseDouble(yytext())); - return Parser.NUM; } - -/* whitespace */ -[ \t]+ { } - -\b { System.err.println("Sorry, backspace doesn't work"); } - -/* error fallback */ -[^] { System.err.println("Error: unexpected character '"+yytext()+"'"); return -1; } diff --git a/tools/lexer/jflex-1.4/examples/byaccj/calc.y b/tools/lexer/jflex-1.4/examples/byaccj/calc.y deleted file mode 100644 index 7ab42c271729..000000000000 --- a/tools/lexer/jflex-1.4/examples/byaccj/calc.y +++ /dev/null @@ -1,112 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * All rights reserved. * - * * - * This is a modified version of the example from * - * http://www.lincom-asg.com/~rjamison/byacc/ * - * * - * Thanks to Larry Bell and Bob Jamison for suggestions and comments. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -%{ - import java.io.*; -%} - -%token NL /* newline */ -%token NUM /* a number */ - -%type exp - -%left '-' '+' -%left '*' '/' -%left NEG /* negation--unary minus */ -%right '^' /* exponentiation */ - -%% - -input: /* empty string */ - | input line - ; - -line: NL { if (interactive) System.out.print("Expression: "); } - | exp NL { System.out.println(" = " + $1); - if (interactive) System.out.print("Expression: "); } - ; - -exp: NUM { $$ = $1; } - | exp '+' exp { $$ = $1 + $3; } - | exp '-' exp { $$ = $1 - $3; } - | exp '*' exp { $$ = $1 * $3; } - | exp '/' exp { $$ = $1 / $3; } - | '-' exp %prec NEG { $$ = -$2; } - | exp '^' exp { $$ = Math.pow($1, $3); } - | '(' exp ')' { $$ = $2; } - ; - -%% - - private Yylex lexer; - - - private int yylex () { - int yyl_return = -1; - try { - yylval = new ParserVal(0); - yyl_return = lexer.yylex(); - } - catch (IOException e) { - System.err.println("IO error :"+e); - } - return yyl_return; - } - - - public void yyerror (String error) { - System.err.println ("Error: " + error); - } - - - public Parser(Reader r) { - lexer = new Yylex(r, this); - } - - - static boolean interactive; - - public static void main(String args[]) throws IOException { - System.out.println("BYACC/Java with JFlex Calculator Demo"); - - Parser yyparser; - if ( args.length > 0 ) { - // parse a file - yyparser = new Parser(new FileReader(args[0])); - } - else { - // interactive mode - System.out.println("[Quit with CTRL-D]"); - System.out.print("Expression: "); - interactive = true; - yyparser = new Parser(new InputStreamReader(System.in)); - } - - yyparser.yyparse(); - - if (interactive) { - System.out.println(); - System.out.println("Have a nice day"); - } - } diff --git a/tools/lexer/jflex-1.4/examples/cup/Main.java b/tools/lexer/jflex-1.4/examples/cup/Main.java deleted file mode 100644 index fba453289fe3..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/Main.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This example comes from a short article series in the Linux - Gazette by Richard A. Sevenich and Christopher Lopes, titled - "Compiler Construction Tools". The article series starts at - - http://www.linuxgazette.com/issue39/sevenich.html - - Small changes and updates to newest JFlex+Cup versions - by Gerwin Klein -*/ - -/* - Commented By: Christopher Lopes - File Name: Main.java - To Create: - After the scanner, lcalc.flex, and the parser, ycalc.cup, have been created. - > javac Main.java - - To Run: - > java Main test.txt - where test.txt is an test input file for the calculator. -*/ - -import java.io.FileReader; - -public class Main { - static public void main(String argv[]) { - /* Start the parser */ - try { - parser p = new parser(new Lexer(new FileReader(argv[0]))); - Object result = p.parse().value; - } catch (Exception e) { - /* do cleanup here -- possibly rethrow e */ - e.printStackTrace(); - } - } -} - - diff --git a/tools/lexer/jflex-1.4/examples/cup/Makefile b/tools/lexer/jflex-1.4/examples/cup/Makefile deleted file mode 100644 index fff6fbced6b4..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -JAVA=java -JAVAC=javac -JFLEX=jflex -CUP=$(JAVA) java_cup.Main < - -all: test - -test: output.txt - @(diff output.txt output.good && echo "Test OK!") || echo "Test failed!" - -output.txt: Main.class test.txt - $(JAVA) Main test.txt > output.txt - -Main.class: Main.java Lexer.java parser.java - -%.class: %.java - $(JAVAC) $^ - -Lexer.java: lcalc.flex - $(JFLEX) lcalc.flex - -parser.java: ycalc.cup - $(CUP) ycalc.cup - -clean: - rm -f parser.java Lexer.java sym.java output.txt *.class *~ diff --git a/tools/lexer/jflex-1.4/examples/cup/README b/tools/lexer/jflex-1.4/examples/cup/README deleted file mode 100644 index 6b0d333bd188..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/README +++ /dev/null @@ -1,30 +0,0 @@ -A small JFlex+Cup example - -It comes from a short article series in the Linux Gazette by Richard -A. Sevenich and Christopher Lopes, titled "Compiler Construction -Tools". The article series starts at - -http://www.linuxgazette.com/issue39/sevenich.html - -Small changes and updates to newest JFlex+Cup versions by Gerwin Klein - - -To compile: ->jflex lcalc.flex ->java java_cup.Main < ycalc.cup ->javac Main.java - -To run: ->java Main test.txt - - -Files: - -Main.java demo of a main program -Makefile makefile to compile and test the example -README this file -lcalc.flex the lexer spec -output.good how the output should look like for the test -ycalc.cup the parser spec -test.txt sample input for testing - diff --git a/tools/lexer/jflex-1.4/examples/cup/lcalc.flex b/tools/lexer/jflex-1.4/examples/cup/lcalc.flex deleted file mode 100644 index 181bf0198f01..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/lcalc.flex +++ /dev/null @@ -1,142 +0,0 @@ -/* - This example comes from a short article series in the Linux - Gazette by Richard A. Sevenich and Christopher Lopes, titled - "Compiler Construction Tools". The article series starts at - - http://www.linuxgazette.com/issue39/sevenich.html - - Small changes and updates to newest JFlex+Cup versions - by Gerwin Klein -*/ - -/* - Commented By: Christopher Lopes - File Name: lcalc.flex - To Create: > jflex lcalc.flex - - and then after the parser is created - > javac Lexer.java -*/ - -/* --------------------------Usercode Section------------------------ */ - -import java_cup.runtime.*; - -%% - -/* -----------------Options and Declarations Section----------------- */ - -/* - The name of the class JFlex will create will be Lexer. - Will write the code to the file Lexer.java. -*/ -%class Lexer - -/* - The current line number can be accessed with the variable yyline - and the current column number with the variable yycolumn. -*/ -%line -%column - -/* - Will switch to a CUP compatibility mode to interface with a CUP - generated parser. -*/ -%cup - -/* - Declarations - - Code between %{ and %}, both of which must be at the beginning of a - line, will be copied letter to letter into the lexer class source. - Here you declare member variables and functions that are used inside - scanner actions. -*/ -%{ - /* To create a new java_cup.runtime.Symbol with information about - the current token, the token will have no value in this - case. */ - private Symbol symbol(int type) { - return new Symbol(type, yyline, yycolumn); - } - - /* Also creates a new java_cup.runtime.Symbol with information - about the current token, but this object has a value. */ - private Symbol symbol(int type, Object value) { - return new Symbol(type, yyline, yycolumn, value); - } -%} - - -/* - Macro Declarations - - These declarations are regular expressions that will be used latter - in the Lexical Rules Section. -*/ - -/* A line terminator is a \r (carriage return), \n (line feed), or - \r\n. */ -LineTerminator = \r|\n|\r\n - -/* White space is a line terminator, space, tab, or line feed. */ -WhiteSpace = {LineTerminator} | [ \t\f] - -/* A literal integer is is a number beginning with a number between - one and nine followed by zero or more numbers between zero and nine - or just a zero. */ -dec_int_lit = 0 | [1-9][0-9]* - -/* A identifier integer is a word beginning a letter between A and - Z, a and z, or an underscore followed by zero or more letters - between A and Z, a and z, zero and nine, or an underscore. */ -dec_int_id = [A-Za-z_][A-Za-z_0-9]* - -%% -/* ------------------------Lexical Rules Section---------------------- */ - -/* - This section contains regular expressions and actions, i.e. Java - code, that will be executed when the scanner matches the associated - regular expression. */ - - /* YYINITIAL is the state at which the lexer begins scanning. So - these regular expressions will only be matched if the scanner is in - the start state YYINITIAL. */ - - { - - /* Return the token SEMI declared in the class sym that was found. */ - ";" { return symbol(sym.SEMI); } - - /* Print the token found that was declared in the class sym and then - return it. */ - "+" { System.out.print(" + "); return symbol(sym.PLUS); } - "-" { System.out.print(" - "); return symbol(sym.MINUS); } - "*" { System.out.print(" * "); return symbol(sym.TIMES); } - "/" { System.out.print(" / "); return symbol(sym.DIVIDE); } - "(" { System.out.print(" ( "); return symbol(sym.LPAREN); } - ")" { System.out.print(" ) "); return symbol(sym.RPAREN); } - - /* If an integer is found print it out, return the token NUMBER - that represents an integer and the value of the integer that is - held in the string yytext which will get turned into an integer - before returning */ - {dec_int_lit} { System.out.print(yytext()); - return symbol(sym.NUMBER, new Integer(yytext())); } - - /* If an identifier is found print it out, return the token ID - that represents an identifier and the default value one that is - given to all identifiers. */ - {dec_int_id} { System.out.print(yytext()); - return symbol(sym.ID, new Integer(1));} - - /* Don't do anything if whitespace is found */ - {WhiteSpace} { /* just skip what was found, do nothing */ } -} - - -/* No token was found for the input so through an error. Print out an - Illegal character message with the illegal character that was found. */ -[^] { throw new Error("Illegal character <"+yytext()+">"); } diff --git a/tools/lexer/jflex-1.4/examples/cup/output.good b/tools/lexer/jflex-1.4/examples/cup/output.good deleted file mode 100644 index cbceb636f601..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/output.good +++ /dev/null @@ -1,4 +0,0 @@ -2 + 4 = 6 -5 * ( 6 - 3 ) + 1 = 16 -6 / 3 * 5 + 20 = 30 -4 * 76 / 31 = 9 diff --git a/tools/lexer/jflex-1.4/examples/cup/test.txt b/tools/lexer/jflex-1.4/examples/cup/test.txt deleted file mode 100644 index 3f8344bccdb2..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -2+4; -5*(6-3)+1; -6/3*5+20; -4*76/31; diff --git a/tools/lexer/jflex-1.4/examples/cup/ycalc.cup b/tools/lexer/jflex-1.4/examples/cup/ycalc.cup deleted file mode 100644 index a67a20d3b09a..000000000000 --- a/tools/lexer/jflex-1.4/examples/cup/ycalc.cup +++ /dev/null @@ -1,234 +0,0 @@ -/* - This example comes from a short article series in the Linux - Gazette by Richard A. Sevenich and Christopher Lopes, titled - "Compiler Construction Tools". The article series starts at - - http://www.linuxgazette.com/issue39/sevenich.html - - Small changes and updates to newest JFlex+Cup versions - by Gerwin Klein -*/ - -/* - Commented By: Christopher Lopes - File Name: ycalc.cup - To Create: > java java_cup.Main < ycalc.cup -*/ - - -/* ----------------------Preliminary Declarations Section--------------------*/ - -/* Import the class java_cup.runtime.* */ -import java_cup.runtime.*; - -/* Parser code to change the way the parser reports errors (include - line and column number of the error). */ -parser code {: - - /* Change the method report_error so it will display the line and - column of where the error occurred in the input as well as the - reason for the error which is passed into the method in the - String 'message'. */ - public void report_error(String message, Object info) { - - /* Create a StringBuffer called 'm' with the string 'Error' in it. */ - StringBuffer m = new StringBuffer("Error"); - - /* Check if the information passed to the method is the same - type as the type java_cup.runtime.Symbol. */ - if (info instanceof java_cup.runtime.Symbol) { - /* Declare a java_cup.runtime.Symbol object 's' with the - information in the object info that is being typecasted - as a java_cup.runtime.Symbol object. */ - java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info); - - /* Check if the line number in the input is greater or - equal to zero. */ - if (s.left >= 0) { - /* Add to the end of the StringBuffer error message - the line number of the error in the input. */ - m.append(" in line "+(s.left+1)); - /* Check if the column number in the input is greater - or equal to zero. */ - if (s.right >= 0) - /* Add to the end of the StringBuffer error message - the column number of the error in the input. */ - m.append(", column "+(s.right+1)); - } - } - - /* Add to the end of the StringBuffer error message created in - this method the message that was passed into this method. */ - m.append(" : "+message); - - /* Print the contents of the StringBuffer 'm', which contains - an error message, out on a line. */ - System.err.println(m); - } - - /* Change the method report_fatal_error so when it reports a fatal - error it will display the line and column number of where the - fatal error occurred in the input as well as the reason for the - fatal error which is passed into the method in the object - 'message' and then exit.*/ - public void report_fatal_error(String message, Object info) { - report_error(message, info); - System.exit(1); - } -:}; - - - -/* ------------Declaration of Terminals and Non Terminals Section----------- */ - -/* Terminals (tokens returned by the scanner). - - Terminals that have no value are listed first and then terminals - that do have an value, in this case an integer value, are listed on - the next line down. */ -terminal SEMI, PLUS, MINUS, TIMES, DIVIDE, LPAREN, RPAREN; -terminal Integer NUMBER, ID; - -/* Non terminals used in the grammar section. - - Non terminals that have an object value are listed first and then - non terminals that have an integer value are listed. An object - value means that it can be any type, it isn't set to a specific - type. So it could be an Integer or a String or whatever. */ -non terminal Object expr_list, expr_part; -non terminal Integer expr, factor, term; - - -/* -------------Precedence and Associatively of Terminals Section----------- */ - -/* - Precedence of non terminals could be defined here. If you do define - precedence here you won't need to worry about precedence in the - Grammar Section, i.e. that TIMES should have a higher precedence - than PLUS. - - The precedence defined here would look something like this where the - lower line always will have higher precedence than the line before it. - - precedence left PLUS, MINUS; - precedence left TIMES, DIVIDE; -*/ - - -/* ----------------------------Grammar Section-------------------- */ - -/* The grammar for our parser. - - expr_list ::= expr_list expr_part - | expr_part - expr_part ::= expr SEMI - expr ::= factor PLUS expr - | factor MINUS expr - | factor - factor ::= factor TIMES term - | factor DIVIDE term - | term - term ::= LPAREN expr RPAREN - | NUMBER - | ID -*/ - -/* 'expr_list' is the start of our grammar. It can lead to another - 'expr_list' followed by an 'expr_part' or it can just lead to an - 'expr_part'. The lhs of the non terminals 'expr_list' and - 'expr_part' that are in the rhs side of the production below need - to be found. Then the rhs sides of those non terminals need to be - followed in a similar manner, i.e. if there are any non terminals - in the rhs of those productions then the productions with those non - terminals need to be found and those rhs's followed. This process - keeps continuing until only terminals are found in the rhs of a - production. Then we can work our way back up the grammar bringing - any values that might have been assigned from a terminal. */ - - expr_list ::= expr_list expr_part - | - expr_part; - -/* 'expr_part' is an 'expr' followed by the terminal 'SEMI'. The ':e' - after the non terminal 'expr' is a label an is used to access the - value of 'expr' which will be an integer. The action for the - production lies between {: and :}. This action will print out the - line " = + e" where e is the value of 'expr'. Before the action - takes places we need to go deeper into the grammar since 'expr' is - a non terminal. Whenever a non terminal is encountered on the rhs - of a production we need to find the rhs of that non terminal until - there are no more non terminals in the rhs. So when we finish - going through the grammar and don't encounter any more non - terminals in the rhs productions will return until we get back to - 'expr' and at that point 'expr' will contain an integer value. */ - - expr_part ::= expr:e - {: System.out.println(" = " + e); :} - SEMI - ; - -/* 'expr' can lead to 'factor PLUS expr', 'factor MINUS expr', or - 'factor'. The 'TIMES' and 'DIVIDE' productions are not at this - level. They are at a lower level in the grammar which in affect - makes them have higher precedence. Actions for the rhs of the non - terminal 'expr' return a value to 'expr'. This value that is - created is an integer and gets stored in 'RESULT' in the action. - RESULT is the label that is assigned automatically to the rhs, in - this case 'expr'. If the rhs is just 'factor' then 'f' refers to - the non terminal 'factor'. The value of 'f' is retrieved with the - function 'intValue()' and will be stored in 'RESULT'. In the other - two cases 'f' and 'e' refers to the non terminals 'factor' and - 'expr' respectively with a terminal between them, either 'PLUS' or - 'MINUS'. The value of each is retrieved with the same function - 'intValue'. The values will be added or subtracted and then the - new integer will be stored in 'RESULT'.*/ - - expr ::= factor:f PLUS expr:e - {: RESULT = new Integer(f.intValue() + e.intValue()); :} - | - factor:f MINUS expr:e - {: RESULT = new Integer(f.intValue() - e.intValue()); :} - | - factor:f - {: RESULT = new Integer(f.intValue()); :} - ; - -/* 'factor' can lead to 'factor TIMES term', 'factor DIVIDE term', or - 'term'. Since the productions for TIMES and DIVIDE are lower in - the grammar than 'PLUS' and 'MINUS' they will have higher - precedence. The same sort of actions take place in the rhs of - 'factor' as in 'expr'. The only difference is the operations that - takes place on the values retrieved with 'intValue()', 'TIMES' and - 'DIVIDE' here instead of 'PLUS' and 'MINUS'. */ - - factor ::= factor:f TIMES term:t - {: RESULT = new Integer(f.intValue() * t.intValue()); :} - | - factor:f DIVIDE term:t - {: RESULT = new Integer(f.intValue() / t.intValue()); :} - | - term:t - {: RESULT = new Integer(t.intValue()); :} - ; - -/* 'term' can lead to 'LPAREN expr RPAREN', 'NUMBER', or 'ID'. The - first production has the non terminal 'expr' in it so the - production with its lhs side needs to be found and followed. The - next rhs has no non terminals. So the grammar ends here and can go - back up. When it goes back up it will bring the value that was - retrieved when the scanner encounter the token 'NUMBER'. 'RESULT' - is assigned 'n', which refers to 'NUMBER', as the action for this - production. The same action occurs for 'ID', except the 'i' is - used to refer to 'ID'. 'ID' is also the only thing on the rhs of - the production. And since 'ID' is a terminal the grammar will end - here and go back up. */ - - term ::= LPAREN expr:e RPAREN - {: RESULT = e; :} - | - NUMBER:n - {: RESULT = n; :} - | - ID:i - {: RESULT = i; :} - ; diff --git a/tools/lexer/jflex-1.4/examples/interpreter/AST.java b/tools/lexer/jflex-1.4/examples/interpreter/AST.java deleted file mode 100644 index 194a42c4a33c..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/AST.java +++ /dev/null @@ -1,30 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** - * General interface for nodes in the abstract syntax tree. Contains - * only the method toString which is already inherited from Object, - * so the interface doesn't add any functionality. It only provides - * a common super type for all elements in the AST. - */ -interface AST { - public String toString(); // already inherited from Object -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Main.java b/tools/lexer/jflex-1.4/examples/interpreter/Main.java deleted file mode 100644 index 4fbaf1a7a6e1..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Main.java +++ /dev/null @@ -1,88 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -import java.io.File; -import java.io.FileReader; -import java.io.InputStreamReader; -import java.io.Reader; - -/** - * Main program of the interpreter for the AS programming language. - * Based on JFlex/CUP. - * - * Steps: - * - scanning (Yylex) - * - context free parsing and AST building (yyparse) - * - build up symbol table (setSymtabs) - * - check context conditions (checkcontext) - * - prepare interpretation (prepInterp) - * - start interpretation (interpret) - */ -public class Main { - - public static void main(String [] args) throws Exception { - Reader reader = null; - - if (args.length == 1) { - File input = new File(args[0]); - if (!input.canRead()) { - System.out.println("Error: could not read ["+input+"]"); - } - reader = new FileReader(input); - } - else { - reader = new InputStreamReader(System.in); - } - - Yylex scanner = new Yylex(reader); // create scanner - SymTab symtab = new SymTab(); // set global symbol table - scanner.setSymtab(symtab); - - parser parser = new parser(scanner); // create parser - Tprogram syntaxbaum = null; - - try { - syntaxbaum = (Tprogram) parser.parse().value; // parse - } - catch (Exception e) { - e.printStackTrace(); - } - - // System.out.println(symtab); - System.out.println(syntaxbaum); - - syntaxbaum.setSymtabs(); // set symbol table - // syntaxbaum.printSymtabs(); // print symbol table - - syntaxbaum.checkcontext(); // CoCo (DefVar, DefFun, Arity) - if(contexterror>0) return; - - syntaxbaum.prepInterp(); // var. indices and function pointers - // im Syntaxbaum setzen - syntaxbaum.interpret(); // interpretation - } - - static int contexterror = 0; // number of errors in context conditions - - public static void error(String s) { - System.out.println((contexterror++)+". "+s); - } -} diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Makefile b/tools/lexer/jflex-1.4/examples/interpreter/Makefile deleted file mode 100644 index de5afbe94d7b..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# uses JFlex >= 1.3.2, and CUP >= 0.10j -# -# targets: -# -# make all -# generates lexer, and parser, and compiles all *.java files -# -# make run (or just: make) -# starts the program on a test example -# - - - -.SUFFIXES: $(SUFFIXES) .class .java - -.java.class: - javac $*.java - -FILE= Yylex.java parser.java sym.java \ - SymTab.java AST.java \ - Tnumber.java Tident.java Texp.java \ - Tfun.java Texpinfix.java Tuminus.java \ - Tboolexp.java Tifthenelse.java \ - Tdekl.java Tdekllist.java \ - Tparlist.java Texplist.java Tprogram.java \ - Main.java \ - SymtabEntry.java STEfun.java STEvar.java - - -run: all - java Main < example.as - -all: Yylex.java parser.java $(FILE:java=class) - -clean: - rm -f *.class *~ *.bak Yylex.java parser.java sym.java - -Yylex.java: scanner.flex - jflex scanner.flex - -parser.java: parser.cup - java java_cup.Main -interface < parser.cup diff --git a/tools/lexer/jflex-1.4/examples/interpreter/README b/tools/lexer/jflex-1.4/examples/interpreter/README deleted file mode 100644 index 731bd5c1b208..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/README +++ /dev/null @@ -1,31 +0,0 @@ -This directory contains an interpreter for a small functional -programming language (called "AS"). It uses JFlex and CUP. - -Directory contents: - -- Main.java is the main program. It reads an AS program from - std in and interprets it. - -- Makefile runs jflex, cup, javac and the compiled interpreter - -- Classes beginning with "T" implement the abstract syntax tree. - They also contain context condition checking and the interpreter. - -- Symtab.java, SymtabEntry.java, STEfun.java, STEvar.java implement - the symbol table. - -- scanner.lex and parser.cup contain the scanner and parser. - -- example.as is an example program in AS - - -The language is described in: -Manfred Broy: Einfuehrung in die Informatik, Springer Verlag - -The files are a solution to excercise 3.40 in the book: -Manfred Broy,Bernhard Rumpe: -Uebungen zur Einfuehrung in die Informatik -- -Strukturierte Aufgabensammlung mit Musterloesungen, -Springer Verlag, 2001 - -Both books are only available in German. Sorry. diff --git a/tools/lexer/jflex-1.4/examples/interpreter/STEfun.java b/tools/lexer/jflex-1.4/examples/interpreter/STEfun.java deleted file mode 100644 index 655813b4dcee..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/STEfun.java +++ /dev/null @@ -1,54 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * Symbol table entry for functions. - * - * Contains arity and reference to location of definition - */ -class STEfun extends SymtabEntry { - int arity; - Tdekl dekl; // location of definition - - public STEfun(String f, Tdekl d, int a) { - super(f); - dekl=d; - arity=a; - } - - public int kind() { - return SymtabEntry.FUN; - } - - public String toString() { - return "function "+name+", arity "+arity; - } - - public int arity() { - return arity; - } - - public Tdekl getDekl() { - return dekl; - } -} - - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/STEvar.java b/tools/lexer/jflex-1.4/examples/interpreter/STEvar.java deleted file mode 100644 index c4d420db2e79..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/STEvar.java +++ /dev/null @@ -1,57 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * Symbol table entry for variables. - * - * Contains index in the parameter list and a flag if it - * is an input variable. - */ -class STEvar extends SymtabEntry { - boolean is_input; - int index; - - public STEvar(String v, boolean ii, int ind) { - super(v); - is_input=ii; - index=ind; - } - - public int kind() { - return SymtabEntry.VAR; - } - - public String toString() { - if (is_input) - return "input var "+name+" ("+index+")"; - else - return "parameter "+name+" ("+index+")"; - } - - public int getIndex() { - return index; - } - - public boolean isInput() { - return is_input; - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/SymTab.java b/tools/lexer/jflex-1.4/examples/interpreter/SymTab.java deleted file mode 100644 index 676a736cfb15..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/SymTab.java +++ /dev/null @@ -1,79 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -import java.util.Enumeration; -import java.util.Hashtable; - -/** - * Symbol table for the interpreter, contains information about - * variables and functions. - * - * For every binding location of a name a symbol will be created. - * The symbol tables are connected hierarchically by pointers to - * the predecessor. Lookup takes predecessors into account. - */ -public class SymTab { - Hashtable h; // contains the liste of words - // key: String, value: SymtabEntry - - SymTab pred; // predecessor symbol table (if exists) - - public SymTab() { - this(null); - } - - public SymTab(SymTab p) { - h = new Hashtable(); - pred = p; - } - - public boolean enter(String s, SymtabEntry e) { - Object value = lookup(s); - h.put(s, e); - return(value==null); - } - - public SymtabEntry lookup(String s) { - Object value = h.get(s); - if (value==null && pred!=null) - value = pred.lookup(s); - return ((SymtabEntry)value); - } - - public String toString() { // for output with print - String res = "symbol table\n=============\n"; - Enumeration e = h.keys(); - String key; - - while(e.hasMoreElements()) { - key = (String)e.nextElement(); - res += key+" \t"+h.get(key)+"\n"; - } - - if (pred!=null) res+="++ predecessor!\n"; - return(res); - } - - public int size() { - return(h.size()); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/SymtabEntry.java b/tools/lexer/jflex-1.4/examples/interpreter/SymtabEntry.java deleted file mode 100644 index 9eb7f1385c0d..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/SymtabEntry.java +++ /dev/null @@ -1,48 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * Symbol table entry for names, there are subclasses for - * variables and functions. - * - * Defines constants UNKNOWN, VAR und FUN as kinds of - * symbol table entries. - */ -class SymtabEntry { - String name; - - public SymtabEntry(String v) { - name=v; - } - - public int kind() { - return UNKNOWN; - } - - public String toString() { - return("unknown "+name); - } - - static final int UNKNOWN = 12; - static final int VAR = 13; - static final int FUN = 14; -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tboolexp.java b/tools/lexer/jflex-1.4/examples/interpreter/Tboolexp.java deleted file mode 100644 index 59ab0e30a885..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tboolexp.java +++ /dev/null @@ -1,64 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for bool expressions - */ -class Tboolexp implements AST { - Texp exp1, exp2; // left and right subexpression - char kind; // '=', '<' and '!' for "<=" - - public Tboolexp(Texp e1, char k, Texp e2) { - exp1=e1; - kind=k; - exp2=e2; - } - - public String toString() { - if (kind!='!') - return(""+exp1+kind+exp2); - else - return(exp1+"<="+exp2); - } - - public void checkcontext(SymTab st) { // context conditions - exp1.checkcontext(st); - exp2.checkcontext(st); - } - - public void prepInterp(SymTab st) { // set pointers and indices - exp1.prepInterp(st); - exp2.prepInterp(st); - } - - public boolean interpret(int[] in, int[] par) { - int e1 = exp1.interpret(in,par); - int e2 = exp2.interpret(in,par); - switch(kind) { - case '=': return(e1==e2); - case '<': return(e1 * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for function declarations. - * - * Also contains a reference to the symbol table of - * the paramaters and their arity. - */ -class Tdekl implements AST { - Tident ident; // identifier - Tparlist parlist; // liste of parameter - Texp exp; // function body - - public Tdekl(Tident i, Tparlist p, Texp e) { - parlist=p; - ident=i; - exp=e; - } - - public String toString() { - return(ident+"("+parlist+") = \n "+exp); - } - - SymTab params; // symbol table of the parameters - int arity; - - public void setSymtab(SymTab st) { - params = new SymTab(st); - parlist.setSymtab(params,false,0); - arity = params.size(); - - boolean isNew = st.enter(ident.toString(), - new STEfun(ident.toString(),this,arity)); - // CoCo (Fun) - if(!isNew) Main.error("funktion "+ident+" defined twice!"); - } - - public void printSymtabs() { - System.out.print("funktion "+ident.toString()+"\n"+params); - } - - public void checkcontext() { - exp.checkcontext(params); // CoCo (DefFun,DefVar,Arity) - } - - public void prepInterp(SymTab st) { // set pointers and indices - exp.prepInterp(params); - } - - public int interpret(int[] in, int[] par) { - return(exp.interpret(in,par)); - } - - public int arity() { return(arity); } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tdekllist.java b/tools/lexer/jflex-1.4/examples/interpreter/Tdekllist.java deleted file mode 100644 index 6f409a6a7829..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tdekllist.java +++ /dev/null @@ -1,69 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for declaration lists of functions - */ -class Tdekllist implements AST { - Tdekllist dekllist; // rest list (optional null) - Tdekl dekl; // declaration - - public Tdekllist(Tdekllist p, Tdekl e) { - dekllist=p; - dekl=e; - } - - public Tdekllist(Tdekl e) { - dekllist=null; - dekl=e; - } - - public String toString() { - if (dekllist!=null) - return(dekllist+",\n"+dekl); - else - return(dekl.toString()); - } - - public void setSymtab(SymTab st) { - if (dekllist!=null) - dekllist.setSymtab(st); - dekl.setSymtab(st); - } - - public void printSymtabs() { - if (dekllist!=null) - dekllist.printSymtabs(); - dekl.printSymtabs(); - } - - public void checkcontext() { - if (dekllist!=null) - dekllist.checkcontext(); - dekl.checkcontext(); // CoCo (DefFun,DefVar,Arity) - } // in function body - - public void prepInterp(SymTab st) { // set pointers and indices - dekl.prepInterp(st); - if (dekllist!=null) dekllist.prepInterp(st); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Texp.java b/tools/lexer/jflex-1.4/examples/interpreter/Texp.java deleted file mode 100644 index 8c4ef9460d9a..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Texp.java +++ /dev/null @@ -1,43 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for an integer expression. - * - * The non terminal exp is the sum of multiple variants and - * therefore modeled as an abstract class. - * - * The interpretation function interpret is called with - * valuations of input variables in and parameters - * par. Before interpret can be called, pointers - * and variable indices must be set with prepInterp. - */ -abstract class Texp implements AST { - // test context conditions (DefFun,DefVar,Arity) - abstract public void checkcontext(SymTab st); - - // set pointers and indices for variables and functions - abstract public void prepInterp(SymTab st); - - // interpretation - abstract public int interpret(int[] in, int[] par); -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Texpinfix.java b/tools/lexer/jflex-1.4/examples/interpreter/Texpinfix.java deleted file mode 100644 index 9db0b0c17c5b..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Texpinfix.java +++ /dev/null @@ -1,64 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for infix expressions - */ -class Texpinfix extends Texp implements AST { - Texp exp1, exp2; // left and right sub expression - char kind; // kind ('+', '-', '*', '/') - - public Texpinfix(Texp e1, char k, Texp e2) { - exp1=e1; - kind=k; - exp2=e2; - } - - public String toString() { - return("("+exp1+kind+exp2+")"); - } - - public void checkcontext(SymTab st) { // context conditions - exp1.checkcontext(st); - exp2.checkcontext(st); - } - - public void prepInterp(SymTab st) { // set pointers und indices - exp1.prepInterp(st); - exp2.prepInterp(st); - } - - public int interpret(int[] in, int[] par) { - int e1 = exp1.interpret(in,par); - int e2 = exp2.interpret(in,par); - - switch (kind) { - case '+': return(e1+e2); - case '-': return(e1-e2); - case '*': return(e1*e2); - case '/': return(e1/e2); - } - - return -1; // error - } -} - - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Texplist.java b/tools/lexer/jflex-1.4/examples/interpreter/Texplist.java deleted file mode 100644 index 84ffe96b8ae3..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Texplist.java +++ /dev/null @@ -1,73 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for a list of expressions. - * - * The interpretation of a list of expressions stores the - * results of the expressions in an array that can be used - * as parameter list for function calls. - */ -class Texplist implements AST { - Texplist explist; // next list element (optional null) - Texp exp; // expression of this list node - - public Texplist(Texplist p, Texp e) { - explist=p; - exp=e; - } - - public Texplist(Texp e) { - explist=null; - exp=e; - } - - public String toString() { - if (explist!=null) - return explist+","+exp; - else - return exp.toString(); - } - - public void checkcontext(SymTab st) { - if (explist!=null) - explist.checkcontext(st); - exp.checkcontext(st); // CoCo (DefFun,DefVar,Arity) - } // in expression - - public int length() { - if (explist!=null) - return 1+explist.length(); - else - return 1; - } - - public void prepInterp(SymTab st) { // set pointers and indices - exp.prepInterp(st); - if (explist!=null) explist.prepInterp(st); - } - - public void interpret(int[] in, int[] par, int[] res, int index) { - res[index] = exp.interpret(in,par); - if (explist!=null) explist.interpret(in,par,res,index+1); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tfun.java b/tools/lexer/jflex-1.4/examples/interpreter/Tfun.java deleted file mode 100644 index 9776ae98be05..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tfun.java +++ /dev/null @@ -1,66 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for function application. - * - * Also contains pointer to declaration location of the function. - */ -class Tfun extends Texp implements AST { - Tident ident; // name of the function - Texplist explist; // parameter list - - public Tfun(Tident i, Texplist e) { - ident=i; - explist=e; - } - - public String toString() { - return ident+"("+explist+")"; - } - - public void checkcontext(SymTab st) { // CoCo (DefFun,Arity) - explist.checkcontext(st); - SymtabEntry ste = st.lookup(ident.toString()); - if (ste==null) - Main.error("function not defined: "+ident); - else if (ste.kind() != SymtabEntry.FUN) - Main.error("variable used as funktion: "+ident); - else if (((STEfun)ste).arity() != explist.length()) - Main.error("wrong arity at function call: "+ident); - } - - Tdekl fundekl; // pointer to location of function declaration - - // set pointers and indices - public void prepInterp(SymTab st) { - fundekl = ((STEfun)st.lookup(ident.toString())).getDekl(); - explist.prepInterp(st); - } - - public int interpret(int[] in, int[] par) { - int[] newparams = new int[fundekl.arity()]; - explist.interpret(in,par,newparams,0); - return fundekl.interpret(in,newparams); - } -} - - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tident.java b/tools/lexer/jflex-1.4/examples/interpreter/Tident.java deleted file mode 100644 index dc8cba98a825..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tident.java +++ /dev/null @@ -1,62 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for an identifier - */ -class Tident extends Texp implements AST { - String name; - - public Tident(String s) { - name = s; - } - - public String toString() { - return name; - } - - public void checkcontext(SymTab st) { // CoCo (DefVar) - SymtabEntry ste = st.lookup(name); - - if (ste==null) - Main.error("variable not defined: "+name); - else if (ste.kind() != SymtabEntry.VAR) - Main.error("function used as variable: "+name); - } - - int index; // number of ident in environment - boolean is_input; // is it an input variable? - - public void prepInterp(SymTab st) { // set index for environment - STEvar ste = (STEvar)st.lookup(name); - index = ste.getIndex(); - is_input = ste.isInput(); - } - - public int interpret(int[] in, int[] par) { - if (is_input) - return(in[index]); - else - return(par[index]); - } -} - - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tifthenelse.java b/tools/lexer/jflex-1.4/examples/interpreter/Tifthenelse.java deleted file mode 100644 index e7193f87ab66..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tifthenelse.java +++ /dev/null @@ -1,59 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for if-then-else expressions - */ -class Tifthenelse extends Texp implements AST { - Tboolexp boolexp; // condition - Texp exp1, exp2; // then and else branch - - public Tifthenelse(Tboolexp b, Texp e1, Texp e2) { - boolexp=b; - exp1=e1; - exp2=e2; - } - - public String toString() { - return "if "+boolexp+" then "+exp1+" else "+exp2+" fi"; - } - - public void checkcontext(SymTab st) { - boolexp.checkcontext(st); - exp1.checkcontext(st); - exp2.checkcontext(st); - } - - public void prepInterp(SymTab st) { - boolexp.prepInterp(st); - exp1.prepInterp(st); - exp2.prepInterp(st); - } - - public int interpret(int[] in, int[] par) { - boolean b = boolexp.interpret(in,par); - if (b) - return exp1.interpret(in,par); - else - return exp2.interpret(in,par); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tnumber.java b/tools/lexer/jflex-1.4/examples/interpreter/Tnumber.java deleted file mode 100644 index fef710ae24c5..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tnumber.java +++ /dev/null @@ -1,47 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for a number - */ -class Tnumber extends Texp implements AST { - int n; // value of the number - - public Tnumber(String s) { - try { n = Integer.parseInt(s); } - catch (NumberFormatException e) { n=-1; }; - } - - public String toString() { - return(""+n); - } - - public void checkcontext(SymTab st) { - } - - public void prepInterp(SymTab st) { - } - - public int interpret(int[] in, int[] par) { - return(n); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tparlist.java b/tools/lexer/jflex-1.4/examples/interpreter/Tparlist.java deleted file mode 100644 index 6f2ada93f0a6..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tparlist.java +++ /dev/null @@ -1,54 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for a parameter list. - */ -class Tparlist implements AST { - Tparlist parlist; // rest of the liste (optional null) - Tident ident; // identifier - - public Tparlist(Tparlist p, Tident i) { - parlist=p; - ident=i; - } - - public Tparlist(Tident i) { - parlist=null; - ident=i; - } - - public String toString() { - if (parlist!=null) - return parlist+","+ident; - else - return ident.toString(); - } - - public void setSymtab(SymTab st, boolean isInput, int index) { - boolean isNew = st.enter(ident.toString(), - new STEvar(ident.toString(), isInput, index)); - - if (!isNew) Main.error("Variable "+ident+" defined twice!"); - if (parlist!=null) parlist.setSymtab(st, isInput, index+1); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tprogram.java b/tools/lexer/jflex-1.4/examples/interpreter/Tprogram.java deleted file mode 100644 index 08a93d17fc80..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tprogram.java +++ /dev/null @@ -1,99 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for the whole program (top node). - * - * Also contains two symbol tables, one for input variables, - * one for function names. - * - * All operations like context check, symbol table build up - * etc. start here. - */ -class Tprogram implements AST { - - Tparlist parlist; // input variables - Tdekllist dekllist; // function declarations - Texplist explist; // result expressions - Texplist arguments; // input values - - public Tprogram(Tparlist p, Tdekllist d, Texplist e, Texplist a) { - parlist=p; - dekllist=d; - explist=e; - arguments=a; - } - - public String toString() { - return("Program:\n=============\ninput "+parlist+ - "\nfunctions\n"+dekllist+"\noutput "+explist+ - "\narguments "+arguments+"\nend"); - } - - SymTab inputs; // table of input variables - SymTab functions; // table of functions - - public void setSymtabs() { // calculate symbol table entries - inputs = new SymTab(); // set input variables - parlist.setSymtab(inputs, true, 0); - functions = new SymTab(inputs); - dekllist.setSymtab(functions); - } - - public void printSymtabs() { - System.out.print("Input variables-\n"+inputs); - System.out.print("Functions-\n"+functions); - dekllist.printSymtabs(); - } - - public void checkcontext() { - dekllist.checkcontext(); // CoCo (DefFun,DefVar,Arity) - // in function bodies - explist.checkcontext(functions); // CoCo (DefFun,DefVar,Arity) - // in result expressions - arguments.checkcontext(new SymTab()); // CoCo (constants) - // in arguments - if (arguments.length()!=inputs.size()) - Main.error("Argument list and input variables list differ!"); - } - - public void prepInterp() { // set pointers and indices - dekllist.prepInterp(functions); - explist.prepInterp(functions); - } - - public void interpret() { - int[] inputEnv = new int[inputs.size()]; // set input - - arguments.interpret(null,null,inputEnv,0); - - System.out.println("Result:\n============="); - - int[] ergebnis = new int[explist.length()]; - explist.interpret(inputEnv,null,ergebnis,0); // calculate result - - int i; - for (i=explist.length()-1; i > 0; i--) - System.out.print(ergebnis[i]+", "); - System.out.println(ergebnis[i]); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/Tuminus.java b/tools/lexer/jflex-1.4/examples/interpreter/Tuminus.java deleted file mode 100644 index d269b34f4a5e..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/Tuminus.java +++ /dev/null @@ -1,49 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - * AST node for unary minus expressions. - */ -class Tuminus extends Texp implements AST { - - Texp exp; // the negated expression - - public Tuminus(Texp e) { - exp=e; - } - - public String toString() { - return "-"+exp; - } - - public void checkcontext(SymTab st) { - exp.checkcontext(st); - } - - public void prepInterp(SymTab st) { - exp.prepInterp(st); - } - - public int interpret(int[] in, int[] par) { - return -(exp.interpret(in,par)); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/build.xml b/tools/lexer/jflex-1.4/examples/interpreter/build.xml deleted file mode 100644 index 51829ba97893..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/build.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/lexer/jflex-1.4/examples/interpreter/example.as b/tools/lexer/jflex-1.4/examples/interpreter/example.as deleted file mode 100644 index 81522472e175..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/example.as +++ /dev/null @@ -1,16 +0,0 @@ - -// example program for interpreter testing -// contains division and modulo functins - -input a,b -functions div(x,y) = if x < y - then 0 - else div(x-y,y)+1 - fi, - mod(x,y) = if x < y - then x - else mod(x-y,y) - fi -output div(a,b), mod(a,b) -arguments 324, 17 -end diff --git a/tools/lexer/jflex-1.4/examples/interpreter/parser.cup b/tools/lexer/jflex-1.4/examples/interpreter/parser.cup deleted file mode 100644 index 3d7f856a679d..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/parser.cup +++ /dev/null @@ -1,112 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -// definition of tokens, if applicable with token type -terminal INPUT, FUNCTIONS, OUTPUT, END, ARGUMENTS; -terminal IF, THEN, ELSE, FI, ERROR; -terminal COMMA, LPAR, RPAR; -terminal EQ, LE, LEQ, MINUS, PLUS, TIMES, DIV, UMINUS; - -terminal String ID, NUMBER; - -non terminal Tprogram program; -non terminal Tparlist parlist; -non terminal Texplist explist; -non terminal Tdekllist dekllist; -non terminal Tdekl dekl; -non terminal Texp exp; -non terminal Tboolexp boolexp; -non terminal Tident ident; -non terminal Tnumber number; - - -// precedences, left associativity -precedence left EQ, LE, LEQ; -precedence left MINUS, PLUS; -precedence left TIMES, DIV; -precedence left UMINUS; - - -// here the rules start -program ::= INPUT parlist:p FUNCTIONS dekllist:d OUTPUT explist:o - ARGUMENTS explist:a END - {: RESULT = new Tprogram(p,d,o,a); :} - ; - -parlist ::= ident:i - {: RESULT = new Tparlist(i); :} - | parlist:p COMMA ident:i - {: RESULT = new Tparlist(p,i); :} - ; - -explist ::= exp:e - {: RESULT = new Texplist(e); :} - | explist:l COMMA exp:e - {: RESULT = new Texplist(l,e); :} - ; - -dekllist ::= dekl:d - {: RESULT = new Tdekllist(d);:} - | dekllist:l COMMA dekl:d - {: RESULT = new Tdekllist(l,d); :} - ; - -dekl ::= ident:i LPAR parlist:p RPAR EQ exp:e - {: RESULT = new Tdekl(i,p,e); :} - ; - -exp ::= number:n - {: RESULT = n; :} - | ident:i - {: RESULT = i; :} - | ident:i LPAR explist:e RPAR - {: RESULT = new Tfun(i,e); :} - | LPAR exp:e RPAR - {: RESULT = e; :} - | MINUS exp:e - {: RESULT = new Tuminus(e); :} %prec UMINUS - | exp:l PLUS exp:r - {: RESULT = new Texpinfix(l,'+',r); :} - | exp:l TIMES exp:r - {: RESULT = new Texpinfix(l,'*',r); :} - | exp:l DIV exp:r - {: RESULT = new Texpinfix(l,'/',r); :} - | exp:l MINUS exp:r - {: RESULT = new Texpinfix(l,'-',r); :} - | IF boolexp:b THEN exp:t ELSE exp:e FI - {: RESULT = new Tifthenelse(b,t,e); :} - ; - -boolexp ::= exp:l EQ exp:r - {: RESULT = new Tboolexp(l,'=',r); :} - | exp:l LE exp:r - {: RESULT = new Tboolexp(l,'<',r); :} - | exp:l LEQ exp:r - {: RESULT = new Tboolexp(l,'!',r); :} - ; - -ident ::= ID:n - {: RESULT = new Tident(n); :} - ; - -number ::= NUMBER:z - {: RESULT = new Tnumber(z); :} - ; diff --git a/tools/lexer/jflex-1.4/examples/interpreter/scanner.flex b/tools/lexer/jflex-1.4/examples/interpreter/scanner.flex deleted file mode 100644 index a6c3ca7e6c91..000000000000 --- a/tools/lexer/jflex-1.4/examples/interpreter/scanner.flex +++ /dev/null @@ -1,71 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2001 Gerwin Klein * - * Copyright (C) 2001 Bernhard Rumpe * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -import java_cup.runtime.Symbol; - -%% - -%cup -%implements sym - -%{ - SymTab symtab; // externe symbol table - - public void setSymtab(SymTab symtab) { - this.symtab = symtab; - } - - private Symbol sym(int sym) { - return new Symbol(sym); - } - - private Symbol sym(int sym, Object val) { - return new Symbol(sym, val); - } -%} - -%% - -"arguments" { return sym(ARGUMENTS); } -"input" { return sym(INPUT); } -"functions" { return sym(FUNCTIONS); } -"output" { return sym(OUTPUT); } -"end" { return sym(END); } -"if" { return sym(IF); } -"then" { return sym(THEN); } -"else" { return sym(ELSE); } -"fi" { return sym(FI); } -[a-z]+ { symtab.enter(yytext(),new SymtabEntry(yytext())); - return sym(ID,yytext()); } -[0-9]+ { return sym(NUMBER,yytext()); } -"," { return sym(COMMA); } -"(" { return sym(LPAR); } -")" { return sym(RPAR); } -"=" { return sym(EQ); } -"-" { return sym(MINUS); } -"+" { return sym(PLUS); } -"*" { return sym(TIMES); } -"/" { return sym(DIV); } -"<" { return sym(LE); } -"<=" { return sym(LEQ); } -[\ \t\b\f\r\n]+ { /* eat whitespace */ } -"//"[^\n]* { /* one-line comment */ } -. { throw new Error("Unexpected character ["+yytext()+"]"); } diff --git a/tools/lexer/jflex-1.4/examples/java/JavaParser.java b/tools/lexer/jflex-1.4/examples/java/JavaParser.java deleted file mode 100644 index 4c587051b460..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/JavaParser.java +++ /dev/null @@ -1,47 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 1998-2004 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -import java.io.FileReader; - - -/** - * Simple test driver for the java parser. Just runs it on some - * input files, gives no useful output. - */ -public class JavaParser { - - public static void main(String argv[]) { - - for (int i = 0; i < argv.length; i++) { - try { - System.out.println("Parsing ["+argv[i]+"]"); - Scanner s = new Scanner(new UnicodeEscapes(new FileReader(argv[i]))); - parser p = new parser(s); - p.parse(); - - System.out.println("No errors."); - } - catch (Exception e) { - e.printStackTrace(System.out); - System.exit(1); - } - } - } - -} diff --git a/tools/lexer/jflex-1.4/examples/java/JavaSymbol.java b/tools/lexer/jflex-1.4/examples/java/JavaSymbol.java deleted file mode 100644 index d27b63dfe69f..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/JavaSymbol.java +++ /dev/null @@ -1,31 +0,0 @@ - -public class JavaSymbol extends java_cup.runtime.Symbol { - private int line; - private int column; - - public JavaSymbol(int type, int line, int column) { - this(type, line, column, -1, -1, null); - } - - public JavaSymbol(int type, int line, int column, Object value) { - this(type, line, column, -1, -1, value); - } - - public JavaSymbol(int type, int line, int column, int left, int right, Object value) { - super(type, left, right, value); - this.line = line; - this.column = column; - } - - public int getLine() { - return line; - } - - public int getColumn() { - return column; - } - - public String toString() { - return "line "+line+", column "+column+", sym: "+sym+(value == null ? "" : (", value: '"+value+"'")); - } -} diff --git a/tools/lexer/jflex-1.4/examples/java/Makefile b/tools/lexer/jflex-1.4/examples/java/Makefile deleted file mode 100644 index 655ebd368150..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# You need CUP v0.10j (or newer) for this makefile to work (for java12.cup) -# -# CUP classes should be included in CLASSPATH - -CUP = java java_cup.Main -interface < -JFLEX = jflex -JAVA = java -JAVAC = javac -#JAVAC = jikes -JAVACFLAGS = - -# -------------------------------------------------- - -all: test - -test: lexer-output.txt - @(diff lexer-output.txt lexer-output.good && echo "Test OK!") || echo "Test failed!" - -lexer-output.txt: compile - $(JAVA) TestLexer TestLexer.java > lexer-output.txt - - -compile: scanner parser unicode - $(JAVAC) $(JAVACFLAGS) JavaParser.java TestLexer.java - -parser: parser.java - -parser.java: java12.cup - $(CUP) java12.cup - -scanner: Scanner.java - -Scanner.java: java.flex - $(JFLEX) java.flex - -unicode: UnicodeEscapes.java - -UnicodeEscapes.java: unicode.flex - $(JFLEX) unicode.flex - -clean: - rm -f *.class - rm -f *~ - rm -f Scanner.java - rm -f parser.java - rm -f sym.java - rm -f UnicodeEscapes.java - rm -f lexer-output.txt diff --git a/tools/lexer/jflex-1.4/examples/java/README b/tools/lexer/jflex-1.4/examples/java/README deleted file mode 100644 index 096582bf4417..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/README +++ /dev/null @@ -1,41 +0,0 @@ -This directory contains a scanner and parser for the Java programming language. - -You need the parser generator CUP v0.10j (or newer) for the parser to work. -Use the Makefile to generate the lexer and parser, or type: - -jflex unicode.flex -jflex java.flex -java java_cup.Main -interface < java12.cup -javac JavaParser.java TestLexer.java - - -The parser can be tested with: -java JavaParser - -The scanner (without parser attached) can be test with: -java TestLexer - - -files: - -unicode.flex - JFlex specification for the Unicode preprocessing phase - (see section 3.3 of the Java Language Specification). - Demonstrates how to implement a FilterReader with JFlex. - -java.flex - JFlex specification for the "real" Java 1.2 lexer. - -java12.cup - CUP specification for the Java 1.2 parser - Copyright (C) 1998 by C. Scott Ananian - (with small modifications to interface with the Lexer) - -JavaParser.java - a simple main class to run the parser (no other useful output though) - -TestLexer.java - a simple test driver for the scanner, produces debug output - -lexer-output.good - lexer output for input file TestLexer.java for testing diff --git a/tools/lexer/jflex-1.4/examples/java/TestLexer.java b/tools/lexer/jflex-1.4/examples/java/TestLexer.java deleted file mode 100644 index 90e4f35681bf..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/TestLexer.java +++ /dev/null @@ -1,62 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2004 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -import java_cup.runtime.Symbol; - -import java.io.FileReader; - - -/** - * Simple test driver for the java lexer. Just runs it on some - * input files and produces debug output. Needs symbol class from - * parser. - */ -public class TestLexer { - - /** some numerals to for lexer testing */ - int intDec = 37; - long longDec = 37l; - int intHex = 0x0001; - long longHex = 0xFFFFl; - int intOct = 0377; - long longOc = 007l; - - - public static void main(String argv[]) { - - for (int i = 0; i < argv.length; i++) { - try { - System.out.println("Lexing ["+argv[i]+"]"); - Scanner scanner = new Scanner(new UnicodeEscapes(new FileReader(argv[i]))); - - Symbol s; - do { - s = scanner.debug_next_token(); - System.out.println("token: "+s); - } while (s.sym != sym.EOF); - - System.out.println("No errors."); - } - catch (Exception e) { - e.printStackTrace(System.out); - System.exit(1); - } - } - } -} diff --git a/tools/lexer/jflex-1.4/examples/java/java.flex b/tools/lexer/jflex-1.4/examples/java/java.flex deleted file mode 100644 index cdce5b6a11cb..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/java.flex +++ /dev/null @@ -1,312 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 1998-2004 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Java 1.2 language lexer specification */ - -/* Use together with unicode.flex for Unicode preprocesssing */ -/* and java12.cup for a Java 1.2 parser */ - -/* Note that this lexer specification is not tuned for speed. - It is in fact quite slow on integer and floating point literals, - because the input is read twice and the methods used to parse - the numbers are not very fast. - For a production quality application (e.g. a Java compiler) - this could be optimized */ - - -import java_cup.runtime.*; - -%% - -%public -%class Scanner -%implements sym - -%unicode - -%line -%column - -%cup -%cupdebug - -%{ - StringBuffer string = new StringBuffer(); - - private Symbol symbol(int type) { - return new JavaSymbol(type, yyline+1, yycolumn+1); - } - - private Symbol symbol(int type, Object value) { - return new JavaSymbol(type, yyline+1, yycolumn+1, value); - } - - /** - * assumes correct representation of a long value for - * specified radix in scanner buffer from start - * to end - */ - private long parseLong(int start, int end, int radix) { - long result = 0; - long digit; - - for (int i = start; i < end; i++) { - digit = Character.digit(yycharat(i),radix); - result*= radix; - result+= digit; - } - - return result; - } -%} - -/* main character classes */ -LineTerminator = \r|\n|\r\n -InputCharacter = [^\r\n] - -WhiteSpace = {LineTerminator} | [ \t\f] - -/* comments */ -Comment = {TraditionalComment} | {EndOfLineComment} | - {DocumentationComment} - -TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" -EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? -DocumentationComment = "/*" "*"+ [^/*] ~"*/" - -/* identifiers */ -Identifier = [:jletter:][:jletterdigit:]* - -/* integer literals */ -DecIntegerLiteral = 0 | [1-9][0-9]* -DecLongLiteral = {DecIntegerLiteral} [lL] - -HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8} -HexLongLiteral = 0 [xX] 0* {HexDigit} {1,16} [lL] -HexDigit = [0-9a-fA-F] - -OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} -OctLongLiteral = 0+ 1? {OctDigit} {1,21} [lL] -OctDigit = [0-7] - -/* floating point literals */ -FloatLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF] -DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? - -FLit1 = [0-9]+ \. [0-9]* -FLit2 = \. [0-9]+ -FLit3 = [0-9]+ -Exponent = [eE] [+-]? [0-9]+ - -/* string and character literals */ -StringCharacter = [^\r\n\"\\] -SingleCharacter = [^\r\n\'\\] - -%state STRING, CHARLITERAL - -%% - - { - - /* keywords */ - "abstract" { return symbol(ABSTRACT); } - "boolean" { return symbol(BOOLEAN); } - "break" { return symbol(BREAK); } - "byte" { return symbol(BYTE); } - "case" { return symbol(CASE); } - "catch" { return symbol(CATCH); } - "char" { return symbol(CHAR); } - "class" { return symbol(CLASS); } - "const" { return symbol(CONST); } - "continue" { return symbol(CONTINUE); } - "do" { return symbol(DO); } - "double" { return symbol(DOUBLE); } - "else" { return symbol(ELSE); } - "extends" { return symbol(EXTENDS); } - "final" { return symbol(FINAL); } - "finally" { return symbol(FINALLY); } - "float" { return symbol(FLOAT); } - "for" { return symbol(FOR); } - "default" { return symbol(DEFAULT); } - "implements" { return symbol(IMPLEMENTS); } - "import" { return symbol(IMPORT); } - "instanceof" { return symbol(INSTANCEOF); } - "int" { return symbol(INT); } - "interface" { return symbol(INTERFACE); } - "long" { return symbol(LONG); } - "native" { return symbol(NATIVE); } - "new" { return symbol(NEW); } - "goto" { return symbol(GOTO); } - "if" { return symbol(IF); } - "public" { return symbol(PUBLIC); } - "short" { return symbol(SHORT); } - "super" { return symbol(SUPER); } - "switch" { return symbol(SWITCH); } - "synchronized" { return symbol(SYNCHRONIZED); } - "package" { return symbol(PACKAGE); } - "private" { return symbol(PRIVATE); } - "protected" { return symbol(PROTECTED); } - "transient" { return symbol(TRANSIENT); } - "return" { return symbol(RETURN); } - "void" { return symbol(VOID); } - "static" { return symbol(STATIC); } - "while" { return symbol(WHILE); } - "this" { return symbol(THIS); } - "throw" { return symbol(THROW); } - "throws" { return symbol(THROWS); } - "try" { return symbol(TRY); } - "volatile" { return symbol(VOLATILE); } - "strictfp" { return symbol(STRICTFP); } - - /* boolean literals */ - "true" { return symbol(BOOLEAN_LITERAL, new Boolean(true)); } - "false" { return symbol(BOOLEAN_LITERAL, new Boolean(false)); } - - /* null literal */ - "null" { return symbol(NULL_LITERAL); } - - - /* separators */ - "(" { return symbol(LPAREN); } - ")" { return symbol(RPAREN); } - "{" { return symbol(LBRACE); } - "}" { return symbol(RBRACE); } - "[" { return symbol(LBRACK); } - "]" { return symbol(RBRACK); } - ";" { return symbol(SEMICOLON); } - "," { return symbol(COMMA); } - "." { return symbol(DOT); } - - /* operators */ - "=" { return symbol(EQ); } - ">" { return symbol(GT); } - "<" { return symbol(LT); } - "!" { return symbol(NOT); } - "~" { return symbol(COMP); } - "?" { return symbol(QUESTION); } - ":" { return symbol(COLON); } - "==" { return symbol(EQEQ); } - "<=" { return symbol(LTEQ); } - ">=" { return symbol(GTEQ); } - "!=" { return symbol(NOTEQ); } - "&&" { return symbol(ANDAND); } - "||" { return symbol(OROR); } - "++" { return symbol(PLUSPLUS); } - "--" { return symbol(MINUSMINUS); } - "+" { return symbol(PLUS); } - "-" { return symbol(MINUS); } - "*" { return symbol(MULT); } - "/" { return symbol(DIV); } - "&" { return symbol(AND); } - "|" { return symbol(OR); } - "^" { return symbol(XOR); } - "%" { return symbol(MOD); } - "<<" { return symbol(LSHIFT); } - ">>" { return symbol(RSHIFT); } - ">>>" { return symbol(URSHIFT); } - "+=" { return symbol(PLUSEQ); } - "-=" { return symbol(MINUSEQ); } - "*=" { return symbol(MULTEQ); } - "/=" { return symbol(DIVEQ); } - "&=" { return symbol(ANDEQ); } - "|=" { return symbol(OREQ); } - "^=" { return symbol(XOREQ); } - "%=" { return symbol(MODEQ); } - "<<=" { return symbol(LSHIFTEQ); } - ">>=" { return symbol(RSHIFTEQ); } - ">>>=" { return symbol(URSHIFTEQ); } - - /* string literal */ - \" { yybegin(STRING); string.setLength(0); } - - /* character literal */ - \' { yybegin(CHARLITERAL); } - - /* numeric literals */ - - {DecIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer(yytext())); } - {DecLongLiteral} { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); } - - {HexIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); } - {HexLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); } - - {OctIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); } - {OctLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); } - - {FloatLiteral} { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); } - {DoubleLiteral} { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); } - {DoubleLiteral}[dD] { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); } - - /* comments */ - {Comment} { /* ignore */ } - - /* whitespace */ - {WhiteSpace} { /* ignore */ } - - /* identifiers */ - {Identifier} { return symbol(IDENTIFIER, yytext()); } -} - - { - \" { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); } - - {StringCharacter}+ { string.append( yytext() ); } - - /* escape sequences */ - "\\b" { string.append( '\b' ); } - "\\t" { string.append( '\t' ); } - "\\n" { string.append( '\n' ); } - "\\f" { string.append( '\f' ); } - "\\r" { string.append( '\r' ); } - "\\\"" { string.append( '\"' ); } - "\\'" { string.append( '\'' ); } - "\\\\" { string.append( '\\' ); } - \\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1),8); - string.append( val ); } - - /* error cases */ - \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } - {LineTerminator} { throw new RuntimeException("Unterminated string at end of line"); } -} - - { - {SingleCharacter}\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character(yytext().charAt(0))); } - - /* escape sequences */ - "\\b"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\b'));} - "\\t"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\t'));} - "\\n"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\n'));} - "\\f"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\f'));} - "\\r"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\r'));} - "\\\""\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\"'));} - "\\'"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\''));} - "\\\\"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\\')); } - \\[0-3]?{OctDigit}?{OctDigit}\' { yybegin(YYINITIAL); - int val = Integer.parseInt(yytext().substring(1,yylength()-1),8); - return symbol(CHARACTER_LITERAL, new Character((char)val)); } - - /* error cases */ - \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } - {LineTerminator} { throw new RuntimeException("Unterminated character literal at end of line"); } -} - -/* error fallback */ -.|\n { throw new RuntimeException("Illegal character \""+yytext()+ - "\" at line "+yyline+", column "+yycolumn); } -<> { return symbol(EOF); } \ No newline at end of file diff --git a/tools/lexer/jflex-1.4/examples/java/java12.cup b/tools/lexer/jflex-1.4/examples/java/java12.cup deleted file mode 100644 index d8c258775b48..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/java12.cup +++ /dev/null @@ -1,885 +0,0 @@ -import java_cup.runtime.*; - - -/* August 1999 - modified by Gerwin Klein - to interface with JFlex scanners, - allows empty semicolon in class decls. - - changed productions: - - class_member_declaration ::= - field_declaration - | method_declaration - [..] - | interface_declaration - | SEMICOLON - ; - - interface_member_declaration ::= - constant_declaration - | abstract_method_declaration - | class_declaration - | interface_declaration - | SEMICOLON - ; - -*/ - - -/* Java 1.2 parser for CUP. - * Copyright (C) 1998 C. Scott Ananian - * This program is released under the terms of the GPL; see the file - * COPYING for more details. There is NO WARRANTY on this code. - */ - -/* -JDK 1.2 Features added: - strictfp modifier. - explicit_constructor_invocation ::= ... - | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON ; - field_access ::= ... - | name DOT SUPER DOT IDENTIFIER ; - method_invocation ::= ... - | name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN ; -*/ - -parser code {: - public void report_error(String message, Object info) { - StringBuffer m = new StringBuffer("Error "); - - if (info instanceof java_cup.runtime.Symbol) - m.append( "("+info.toString()+")" ); - - m.append(" : "+message); - - System.out.println(m); - } - - public void report_fatal_error(String message, Object info) { - report_error(message, info); - throw new RuntimeException("Fatal Syntax Error"); - } -:}; - -terminal BOOLEAN; // primitive_type -terminal BYTE, SHORT, INT, LONG, CHAR; // integral_type -terminal FLOAT, DOUBLE; // floating_point_type -terminal LBRACK, RBRACK; // array_type -terminal DOT; // qualified_name -terminal SEMICOLON, MULT, COMMA, LBRACE, RBRACE, EQ, LPAREN, RPAREN, COLON; -terminal PACKAGE; // package_declaration -terminal IMPORT; // import_declaration -terminal PUBLIC, PROTECTED, PRIVATE; // modifier -terminal STATIC; // modifier -terminal ABSTRACT, FINAL, NATIVE, SYNCHRONIZED, TRANSIENT, VOLATILE; -terminal CLASS; // class_declaration -terminal EXTENDS; // super -terminal IMPLEMENTS; // interfaces -terminal VOID; // method_header -terminal THROWS; // throws -terminal THIS, SUPER; // explicit_constructor_invocation -terminal INTERFACE; // interface_declaration -terminal IF, ELSE; // if_then_statement, if_then_else_statement -terminal SWITCH; // switch_statement -terminal CASE, DEFAULT; // switch_label -terminal DO, WHILE; // while_statement, do_statement -terminal FOR; // for_statement -terminal BREAK; // break_statement -terminal CONTINUE; // continue_statement -terminal RETURN; // return_statement -terminal THROW; // throw_statement -terminal TRY; // try_statement -terminal CATCH; // catch_clause -terminal FINALLY; // finally -terminal NEW; // class_instance_creation_expression -terminal PLUSPLUS; // postincrement_expression -terminal MINUSMINUS; // postdecrement_expression -terminal PLUS, MINUS, COMP, NOT, DIV, MOD; -terminal LSHIFT, RSHIFT, URSHIFT; // shift_expression -terminal LT, GT, LTEQ, GTEQ, INSTANCEOF; // relational_expression -terminal EQEQ, NOTEQ; // equality_expression -terminal AND; // and_expression -terminal XOR; // exclusive_or_expression -terminal OR; // inclusive_or_expression -terminal ANDAND; // conditional_and_expression -terminal OROR; // conditional_or_expression -terminal QUESTION; // conditional_expression -terminal MULTEQ, DIVEQ, MODEQ, PLUSEQ, MINUSEQ; // assignment_operator -terminal LSHIFTEQ, RSHIFTEQ, URSHIFTEQ; // assignment_operator -terminal ANDEQ, XOREQ, OREQ; // assignment_operator - -terminal java.lang.Number INTEGER_LITERAL; -terminal java.lang.Number FLOATING_POINT_LITERAL; -terminal java.lang.Boolean BOOLEAN_LITERAL; -terminal java.lang.Character CHARACTER_LITERAL; -terminal java.lang.String STRING_LITERAL; -terminal java.lang.String IDENTIFIER; // name -terminal NULL_LITERAL; - -// strictfp keyword, new in Java 1.2 -terminal STRICTFP; - -// Reserved but unused: -terminal CONST, GOTO; - -// 19.2) The Syntactic Grammar -non terminal goal; -// 19.3) Lexical Structure -non terminal literal; -// 19.4) Types, Values, and Variables -non terminal type, primitive_type, numeric_type; -non terminal integral_type, floating_point_type; -non terminal reference_type; -non terminal class_or_interface_type; -non terminal class_type, interface_type; -non terminal array_type; -// 19.5) Names -non terminal name, simple_name, qualified_name; -// 19.6) Packages -non terminal compilation_unit; -non terminal package_declaration_opt, package_declaration; -non terminal import_declarations_opt, import_declarations; -non terminal type_declarations_opt, type_declarations; -non terminal import_declaration; -non terminal single_type_import_declaration; -non terminal type_import_on_demand_declaration; -non terminal type_declaration; -// 19.7) Productions used only in the LALR(1) grammar -non terminal modifiers_opt, modifiers, modifier; -// 19.8.1) Class Declaration -non terminal class_declaration, super, super_opt; -non terminal interfaces, interfaces_opt, interface_type_list; -non terminal class_body; -non terminal class_body_declarations, class_body_declarations_opt; -non terminal class_body_declaration, class_member_declaration; -// 19.8.2) Field Declarations -non terminal field_declaration, variable_declarators, variable_declarator; -non terminal variable_declarator_id, variable_initializer; -// 19.8.3) Method Declarations -non terminal method_declaration, method_header, method_declarator; -non terminal formal_parameter_list_opt, formal_parameter_list; -non terminal formal_parameter; -non terminal throws_opt, throws; -non terminal class_type_list, method_body; -// 19.8.4) Static Initializers -non terminal static_initializer; -// 19.8.5) Constructor Declarations -non terminal constructor_declaration, constructor_declarator; -non terminal constructor_body; -non terminal explicit_constructor_invocation; -// 19.9.1) Interface Declarations -non terminal interface_declaration; -non terminal extends_interfaces_opt, extends_interfaces; -non terminal interface_body; -non terminal interface_member_declarations_opt, interface_member_declarations; -non terminal interface_member_declaration, constant_declaration; -non terminal abstract_method_declaration; -// 19.10) Arrays -non terminal array_initializer; -non terminal variable_initializers; -// 19.11) Blocks and Statements -non terminal block; -non terminal block_statements_opt, block_statements, block_statement; -non terminal local_variable_declaration_statement, local_variable_declaration; -non terminal statement, statement_no_short_if; -non terminal statement_without_trailing_substatement; -non terminal empty_statement; -non terminal labeled_statement, labeled_statement_no_short_if; -non terminal expression_statement, statement_expression; -non terminal if_then_statement; -non terminal if_then_else_statement, if_then_else_statement_no_short_if; -non terminal switch_statement, switch_block; -non terminal switch_block_statement_groups; -non terminal switch_block_statement_group; -non terminal switch_labels, switch_label; -non terminal while_statement, while_statement_no_short_if; -non terminal do_statement; -non terminal for_statement, for_statement_no_short_if; -non terminal for_init_opt, for_init; -non terminal for_update_opt, for_update; -non terminal statement_expression_list; -non terminal identifier_opt; -non terminal break_statement, continue_statement; -non terminal return_statement, throw_statement; -non terminal synchronized_statement, try_statement; -non terminal catches_opt, catches, catch_clause; -non terminal finally; -// 19.12) Expressions -non terminal primary, primary_no_new_array; -non terminal class_instance_creation_expression; -non terminal argument_list_opt, argument_list; -non terminal array_creation_expression; -non terminal dim_exprs, dim_expr, dims_opt, dims; -non terminal field_access, method_invocation, array_access; -non terminal postfix_expression; -non terminal postincrement_expression, postdecrement_expression; -non terminal unary_expression, unary_expression_not_plus_minus; -non terminal preincrement_expression, predecrement_expression; -non terminal cast_expression; -non terminal multiplicative_expression, additive_expression; -non terminal shift_expression, relational_expression, equality_expression; -non terminal and_expression, exclusive_or_expression, inclusive_or_expression; -non terminal conditional_and_expression, conditional_or_expression; -non terminal conditional_expression, assignment_expression; -non terminal assignment; -non terminal left_hand_side; -non terminal assignment_operator; -non terminal expression_opt, expression; -non terminal constant_expression; - - -start with goal; - -// 19.2) The Syntactic Grammar -goal ::= compilation_unit - ; - -// 19.3) Lexical Structure. -literal ::= INTEGER_LITERAL - | FLOATING_POINT_LITERAL - | BOOLEAN_LITERAL - | CHARACTER_LITERAL - | STRING_LITERAL - | NULL_LITERAL - ; - -// 19.4) Types, Values, and Variables -type ::= primitive_type - | reference_type - ; -primitive_type ::= - numeric_type - | BOOLEAN - ; -numeric_type::= integral_type - | floating_point_type - ; -integral_type ::= - BYTE - | SHORT - | INT - | LONG - | CHAR - ; -floating_point_type ::= - FLOAT - | DOUBLE - ; - -reference_type ::= - class_or_interface_type - | array_type - ; -class_or_interface_type ::= name; - -class_type ::= class_or_interface_type; -interface_type ::= class_or_interface_type; - -array_type ::= primitive_type dims - | name dims - ; - -// 19.5) Names -name ::= simple_name - | qualified_name - ; -simple_name ::= IDENTIFIER - ; -qualified_name ::= - name DOT IDENTIFIER - ; - -// 19.6) Packages -compilation_unit ::= - package_declaration_opt - import_declarations_opt - type_declarations_opt - ; -package_declaration_opt ::= package_declaration | ; -import_declarations_opt ::= import_declarations | ; -type_declarations_opt ::= type_declarations | ; - -import_declarations ::= - import_declaration - | import_declarations import_declaration - ; -type_declarations ::= - type_declaration - | type_declarations type_declaration - ; -package_declaration ::= - PACKAGE name SEMICOLON - ; -import_declaration ::= - single_type_import_declaration - | type_import_on_demand_declaration - ; -single_type_import_declaration ::= - IMPORT name SEMICOLON - ; -type_import_on_demand_declaration ::= - IMPORT name DOT MULT SEMICOLON - ; -type_declaration ::= - class_declaration - | interface_declaration - | SEMICOLON - ; - -// 19.7) Productions used only in the LALR(1) grammar -modifiers_opt::= - | modifiers - ; -modifiers ::= modifier - | modifiers modifier - ; -modifier ::= PUBLIC | PROTECTED | PRIVATE - | STATIC - | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED | TRANSIENT | VOLATILE - | STRICTFP // note that semantic analysis must check that the - // context of the modifier allows strictfp. - ; - -// 19.8) Classes - -// 19.8.1) Class Declaration: -class_declaration ::= - modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body - ; -super ::= EXTENDS class_type - ; -super_opt ::= - | super - ; -interfaces ::= IMPLEMENTS interface_type_list - ; -interfaces_opt::= - | interfaces - ; -interface_type_list ::= - interface_type - | interface_type_list COMMA interface_type - ; -class_body ::= LBRACE class_body_declarations_opt RBRACE - ; -class_body_declarations_opt ::= - | class_body_declarations ; -class_body_declarations ::= - class_body_declaration - | class_body_declarations class_body_declaration - ; -class_body_declaration ::= - class_member_declaration - | static_initializer - | constructor_declaration - | block - ; -class_member_declaration ::= - field_declaration - | method_declaration - /* repeat the prod for 'class_declaration' here: */ - | modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body - | interface_declaration - | SEMICOLON - ; - -// 19.8.2) Field Declarations -field_declaration ::= - modifiers_opt type variable_declarators SEMICOLON - ; -variable_declarators ::= - variable_declarator - | variable_declarators COMMA variable_declarator - ; -variable_declarator ::= - variable_declarator_id - | variable_declarator_id EQ variable_initializer - ; -variable_declarator_id ::= - IDENTIFIER - | variable_declarator_id LBRACK RBRACK - ; -variable_initializer ::= - expression - | array_initializer - ; - -// 19.8.3) Method Declarations -method_declaration ::= - method_header method_body - ; -method_header ::= - modifiers_opt type method_declarator throws_opt - | modifiers_opt VOID method_declarator throws_opt - ; -method_declarator ::= - IDENTIFIER LPAREN formal_parameter_list_opt RPAREN - | method_declarator LBRACK RBRACK // deprecated - // be careful; the above production also allows 'void foo() []' - ; -formal_parameter_list_opt ::= - | formal_parameter_list - ; -formal_parameter_list ::= - formal_parameter - | formal_parameter_list COMMA formal_parameter - ; -formal_parameter ::= - type variable_declarator_id - | FINAL type variable_declarator_id - ; -throws_opt ::= - | throws - ; -throws ::= THROWS class_type_list - ; -class_type_list ::= - class_type - | class_type_list COMMA class_type - ; -method_body ::= block - | SEMICOLON - ; - -// 19.8.4) Static Initializers -static_initializer ::= - STATIC block - ; - -// 19.8.5) Constructor Declarations -constructor_declaration ::= - modifiers_opt constructor_declarator throws_opt - constructor_body - ; -constructor_declarator ::= - simple_name LPAREN formal_parameter_list_opt RPAREN - ; -constructor_body ::= - LBRACE explicit_constructor_invocation - block_statements RBRACE - | LBRACE explicit_constructor_invocation RBRACE - | LBRACE block_statements RBRACE - | LBRACE RBRACE - ; -explicit_constructor_invocation ::= - THIS LPAREN argument_list_opt RPAREN SEMICOLON - | SUPER LPAREN argument_list_opt RPAREN SEMICOLON - | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON - | primary DOT SUPER LPAREN argument_list_opt RPAREN SEMICOLON - ; - -// 19.9) Interfaces - -// 19.9.1) Interface Declarations -interface_declaration ::= - modifiers_opt INTERFACE IDENTIFIER extends_interfaces_opt - interface_body - ; -extends_interfaces_opt ::= - | extends_interfaces - ; -extends_interfaces ::= - EXTENDS interface_type - | extends_interfaces COMMA interface_type - ; -interface_body ::= - LBRACE interface_member_declarations_opt RBRACE - ; -interface_member_declarations_opt ::= - | interface_member_declarations - ; -interface_member_declarations ::= - interface_member_declaration - | interface_member_declarations interface_member_declaration - ; -interface_member_declaration ::= - constant_declaration - | abstract_method_declaration - | class_declaration - | interface_declaration - | SEMICOLON - ; -constant_declaration ::= - field_declaration - ; -abstract_method_declaration ::= - method_header SEMICOLON - ; - -// 19.10) Arrays -array_initializer ::= - LBRACE variable_initializers COMMA RBRACE - | LBRACE variable_initializers RBRACE - | LBRACE COMMA RBRACE - | LBRACE RBRACE - ; -variable_initializers ::= - variable_initializer - | variable_initializers COMMA variable_initializer - ; - -// 19.11) Blocks and Statements -block ::= LBRACE block_statements_opt RBRACE - ; -block_statements_opt ::= - | block_statements - ; -block_statements ::= - block_statement - | block_statements block_statement - ; -block_statement ::= - local_variable_declaration_statement - | statement - | class_declaration - | interface_declaration - ; -local_variable_declaration_statement ::= - local_variable_declaration SEMICOLON - ; -local_variable_declaration ::= - type variable_declarators - | FINAL type variable_declarators - ; -statement ::= statement_without_trailing_substatement - | labeled_statement - | if_then_statement - | if_then_else_statement - | while_statement - | for_statement - ; -statement_no_short_if ::= - statement_without_trailing_substatement - | labeled_statement_no_short_if - | if_then_else_statement_no_short_if - | while_statement_no_short_if - | for_statement_no_short_if - ; -statement_without_trailing_substatement ::= - block - | empty_statement - | expression_statement - | switch_statement - | do_statement - | break_statement - | continue_statement - | return_statement - | synchronized_statement - | throw_statement - | try_statement - ; -empty_statement ::= - SEMICOLON - ; -labeled_statement ::= - IDENTIFIER COLON statement - ; -labeled_statement_no_short_if ::= - IDENTIFIER COLON statement_no_short_if - ; -expression_statement ::= - statement_expression SEMICOLON - ; -statement_expression ::= - assignment - | preincrement_expression - | predecrement_expression - | postincrement_expression - | postdecrement_expression - | method_invocation - | class_instance_creation_expression - ; -if_then_statement ::= - IF LPAREN expression RPAREN statement - ; -if_then_else_statement ::= - IF LPAREN expression RPAREN statement_no_short_if - ELSE statement - ; -if_then_else_statement_no_short_if ::= - IF LPAREN expression RPAREN statement_no_short_if - ELSE statement_no_short_if - ; -switch_statement ::= - SWITCH LPAREN expression RPAREN switch_block - ; -switch_block ::= - LBRACE switch_block_statement_groups switch_labels RBRACE - | LBRACE switch_block_statement_groups RBRACE - | LBRACE switch_labels RBRACE - | LBRACE RBRACE - ; -switch_block_statement_groups ::= - switch_block_statement_group - | switch_block_statement_groups switch_block_statement_group - ; -switch_block_statement_group ::= - switch_labels block_statements - ; -switch_labels ::= - switch_label - | switch_labels switch_label - ; -switch_label ::= - CASE constant_expression COLON - | DEFAULT COLON - ; - -while_statement ::= - WHILE LPAREN expression RPAREN statement - ; -while_statement_no_short_if ::= - WHILE LPAREN expression RPAREN statement_no_short_if - ; -do_statement ::= - DO statement WHILE LPAREN expression RPAREN SEMICOLON - ; -for_statement ::= - FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON - for_update_opt RPAREN statement - ; -for_statement_no_short_if ::= - FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON - for_update_opt RPAREN statement_no_short_if - ; -for_init_opt ::= - | for_init - ; -for_init ::= statement_expression_list - | local_variable_declaration - ; -for_update_opt ::= - | for_update - ; -for_update ::= statement_expression_list - ; -statement_expression_list ::= - statement_expression - | statement_expression_list COMMA statement_expression - ; - -identifier_opt ::= - | IDENTIFIER - ; - -break_statement ::= - BREAK identifier_opt SEMICOLON - ; - -continue_statement ::= - CONTINUE identifier_opt SEMICOLON - ; -return_statement ::= - RETURN expression_opt SEMICOLON - ; -throw_statement ::= - THROW expression SEMICOLON - ; -synchronized_statement ::= - SYNCHRONIZED LPAREN expression RPAREN block - ; -try_statement ::= - TRY block catches - | TRY block catches_opt finally - ; -catches_opt ::= - | catches - ; -catches ::= catch_clause - | catches catch_clause - ; -catch_clause ::= - CATCH LPAREN formal_parameter RPAREN block - ; -finally ::= FINALLY block - ; - -// 19.12) Expressions -primary ::= primary_no_new_array - | array_creation_expression - ; -primary_no_new_array ::= - literal - | THIS - | LPAREN expression RPAREN - | class_instance_creation_expression - | field_access - | method_invocation - | array_access - | primitive_type DOT CLASS - | VOID DOT CLASS - | array_type DOT CLASS - | name DOT CLASS - | name DOT THIS - ; -class_instance_creation_expression ::= - NEW class_type LPAREN argument_list_opt RPAREN - | NEW class_type LPAREN argument_list_opt RPAREN class_body - | primary DOT NEW IDENTIFIER - LPAREN argument_list_opt RPAREN - | primary DOT NEW IDENTIFIER - LPAREN argument_list_opt RPAREN class_body - ; -argument_list_opt ::= - | argument_list - ; -argument_list ::= - expression - | argument_list COMMA expression - ; -array_creation_expression ::= - NEW primitive_type dim_exprs dims_opt - | NEW class_or_interface_type dim_exprs dims_opt - | NEW primitive_type dims array_initializer - | NEW class_or_interface_type dims array_initializer - ; -dim_exprs ::= dim_expr - | dim_exprs dim_expr - ; -dim_expr ::= LBRACK expression RBRACK - ; -dims_opt ::= - | dims - ; -dims ::= LBRACK RBRACK - | dims LBRACK RBRACK - ; -field_access ::= - primary DOT IDENTIFIER - | SUPER DOT IDENTIFIER - | name DOT SUPER DOT IDENTIFIER - ; -method_invocation ::= - name LPAREN argument_list_opt RPAREN - | primary DOT IDENTIFIER LPAREN argument_list_opt RPAREN - | SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN - | name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN - ; -array_access ::= - name LBRACK expression RBRACK - | primary_no_new_array LBRACK expression RBRACK - ; -postfix_expression ::= - primary - | name - | postincrement_expression - | postdecrement_expression - ; -postincrement_expression ::= - postfix_expression PLUSPLUS - ; -postdecrement_expression ::= - postfix_expression MINUSMINUS - ; -unary_expression ::= - preincrement_expression - | predecrement_expression - | PLUS unary_expression - | MINUS unary_expression - | unary_expression_not_plus_minus - ; -preincrement_expression ::= - PLUSPLUS unary_expression - ; -predecrement_expression ::= - MINUSMINUS unary_expression - ; -unary_expression_not_plus_minus ::= - postfix_expression - | COMP unary_expression - | NOT unary_expression - | cast_expression - ; -cast_expression ::= - LPAREN primitive_type dims_opt RPAREN unary_expression - | LPAREN expression RPAREN unary_expression_not_plus_minus - | LPAREN name dims RPAREN unary_expression_not_plus_minus - ; -multiplicative_expression ::= - unary_expression - | multiplicative_expression MULT unary_expression - | multiplicative_expression DIV unary_expression - | multiplicative_expression MOD unary_expression - ; -additive_expression ::= - multiplicative_expression - | additive_expression PLUS multiplicative_expression - | additive_expression MINUS multiplicative_expression - ; -shift_expression ::= - additive_expression - | shift_expression LSHIFT additive_expression - | shift_expression RSHIFT additive_expression - | shift_expression URSHIFT additive_expression - ; -relational_expression ::= - shift_expression - | relational_expression LT shift_expression - | relational_expression GT shift_expression - | relational_expression LTEQ shift_expression - | relational_expression GTEQ shift_expression - | relational_expression INSTANCEOF reference_type - ; -equality_expression ::= - relational_expression - | equality_expression EQEQ relational_expression - | equality_expression NOTEQ relational_expression - ; -and_expression ::= - equality_expression - | and_expression AND equality_expression - ; -exclusive_or_expression ::= - and_expression - | exclusive_or_expression XOR and_expression - ; -inclusive_or_expression ::= - exclusive_or_expression - | inclusive_or_expression OR exclusive_or_expression - ; -conditional_and_expression ::= - inclusive_or_expression - | conditional_and_expression ANDAND inclusive_or_expression - ; -conditional_or_expression ::= - conditional_and_expression - | conditional_or_expression OROR conditional_and_expression - ; -conditional_expression ::= - conditional_or_expression - | conditional_or_expression QUESTION expression - COLON conditional_expression - ; -assignment_expression ::= - conditional_expression - | assignment - ; -assignment ::= left_hand_side assignment_operator assignment_expression - ; -left_hand_side ::= - name - | field_access - | array_access - ; -assignment_operator ::= - EQ - | MULTEQ - | DIVEQ - | MODEQ - | PLUSEQ - | MINUSEQ - | LSHIFTEQ - | RSHIFTEQ - | URSHIFTEQ - | ANDEQ - | XOREQ - | OREQ - ; -expression_opt ::= - | expression - ; -expression ::= assignment_expression - ; -constant_expression ::= - expression - ; diff --git a/tools/lexer/jflex-1.4/examples/java/lexer-output.good b/tools/lexer/jflex-1.4/examples/java/lexer-output.good deleted file mode 100644 index d6d9af33c3d4..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/lexer-output.good +++ /dev/null @@ -1,376 +0,0 @@ -Lexing [TestLexer.java] -line:20 col:1 --import--IMPORT-- -token: line 20, column 1, sym: 23 -line:20 col:8 --java--IDENTIFIER-- -token: line 20, column 8, sym: 98, value: 'java' -line:20 col:12 --.--DOT-- -token: line 20, column 12, sym: 12 -line:20 col:13 --io--IDENTIFIER-- -token: line 20, column 13, sym: 98, value: 'io' -line:20 col:15 --.--DOT-- -token: line 20, column 15, sym: 12 -line:20 col:16 --*--MULT-- -token: line 20, column 16, sym: 14 -line:20 col:17 --;--SEMICOLON-- -token: line 20, column 17, sym: 13 -line:21 col:1 --import--IMPORT-- -token: line 21, column 1, sym: 23 -line:21 col:8 --java_cup--IDENTIFIER-- -token: line 21, column 8, sym: 98, value: 'java_cup' -line:21 col:16 --.--DOT-- -token: line 21, column 16, sym: 12 -line:21 col:17 --runtime--IDENTIFIER-- -token: line 21, column 17, sym: 98, value: 'runtime' -line:21 col:24 --.--DOT-- -token: line 21, column 24, sym: 12 -line:21 col:25 --Symbol--IDENTIFIER-- -token: line 21, column 25, sym: 98, value: 'Symbol' -line:21 col:31 --;--SEMICOLON-- -token: line 21, column 31, sym: 13 -line:29 col:1 --public--PUBLIC-- -token: line 29, column 1, sym: 24 -line:29 col:8 --class--CLASS-- -token: line 29, column 8, sym: 34 -line:29 col:14 --TestLexer--IDENTIFIER-- -token: line 29, column 14, sym: 98, value: 'TestLexer' -line:29 col:24 --{--LBRACE-- -token: line 29, column 24, sym: 16 -line:32 col:3 --int--INT-- -token: line 32, column 3, sym: 5 -line:32 col:7 --intDec--IDENTIFIER-- -token: line 32, column 7, sym: 98, value: 'intDec' -line:32 col:14 --=--EQ-- -token: line 32, column 14, sym: 18 -line:32 col:16 --37--INTEGER_LITERAL-- -token: line 32, column 16, sym: 93, value: '37' -line:32 col:18 --;--SEMICOLON-- -token: line 32, column 18, sym: 13 -line:33 col:3 --long--LONG-- -token: line 33, column 3, sym: 6 -line:33 col:8 --longDec--IDENTIFIER-- -token: line 33, column 8, sym: 98, value: 'longDec' -line:33 col:16 --=--EQ-- -token: line 33, column 16, sym: 18 -line:33 col:18 --37l--INTEGER_LITERAL-- -token: line 33, column 18, sym: 93, value: '37' -line:33 col:21 --;--SEMICOLON-- -token: line 33, column 21, sym: 13 -line:34 col:3 --int--INT-- -token: line 34, column 3, sym: 5 -line:34 col:7 --intHex--IDENTIFIER-- -token: line 34, column 7, sym: 98, value: 'intHex' -line:34 col:14 --=--EQ-- -token: line 34, column 14, sym: 18 -line:34 col:16 --0x0001--INTEGER_LITERAL-- -token: line 34, column 16, sym: 93, value: '1' -line:34 col:22 --;--SEMICOLON-- -token: line 34, column 22, sym: 13 -line:35 col:3 --long--LONG-- -token: line 35, column 3, sym: 6 -line:35 col:8 --longHex--IDENTIFIER-- -token: line 35, column 8, sym: 98, value: 'longHex' -line:35 col:16 --=--EQ-- -token: line 35, column 16, sym: 18 -line:35 col:18 --0xFFFFl--INTEGER_LITERAL-- -token: line 35, column 18, sym: 93, value: '65535' -line:35 col:25 --;--SEMICOLON-- -token: line 35, column 25, sym: 13 -line:36 col:3 --int--INT-- -token: line 36, column 3, sym: 5 -line:36 col:7 --intOct--IDENTIFIER-- -token: line 36, column 7, sym: 98, value: 'intOct' -line:36 col:14 --=--EQ-- -token: line 36, column 14, sym: 18 -line:36 col:16 --0377--INTEGER_LITERAL-- -token: line 36, column 16, sym: 93, value: '255' -line:36 col:20 --;--SEMICOLON-- -token: line 36, column 20, sym: 13 -line:37 col:3 --long--LONG-- -token: line 37, column 3, sym: 6 -line:37 col:8 --longOc--IDENTIFIER-- -token: line 37, column 8, sym: 98, value: 'longOc' -line:37 col:15 --=--EQ-- -token: line 37, column 15, sym: 18 -line:37 col:17 --007l--INTEGER_LITERAL-- -token: line 37, column 17, sym: 93, value: '7' -line:37 col:21 --;--SEMICOLON-- -token: line 37, column 21, sym: 13 -line:40 col:3 --public--PUBLIC-- -token: line 40, column 3, sym: 24 -line:40 col:10 --static--STATIC-- -token: line 40, column 10, sym: 27 -line:40 col:17 --void--VOID-- -token: line 40, column 17, sym: 37 -line:40 col:22 --main--IDENTIFIER-- -token: line 40, column 22, sym: 98, value: 'main' -line:40 col:26 --(--LPAREN-- -token: line 40, column 26, sym: 19 -line:40 col:27 --String--IDENTIFIER-- -token: line 40, column 27, sym: 98, value: 'String' -line:40 col:34 --argv--IDENTIFIER-- -token: line 40, column 34, sym: 98, value: 'argv' -line:40 col:38 --[--LBRACK-- -token: line 40, column 38, sym: 10 -line:40 col:39 --]--RBRACK-- -token: line 40, column 39, sym: 11 -line:40 col:40 --)--RPAREN-- -token: line 40, column 40, sym: 20 -line:40 col:42 --{--LBRACE-- -token: line 40, column 42, sym: 16 -line:42 col:5 --for--FOR-- -token: line 42, column 5, sym: 49 -line:42 col:9 --(--LPAREN-- -token: line 42, column 9, sym: 19 -line:42 col:10 --int--INT-- -token: line 42, column 10, sym: 5 -line:42 col:14 --i--IDENTIFIER-- -token: line 42, column 14, sym: 98, value: 'i' -line:42 col:16 --=--EQ-- -token: line 42, column 16, sym: 18 -line:42 col:18 --0--INTEGER_LITERAL-- -token: line 42, column 18, sym: 93, value: '0' -line:42 col:19 --;--SEMICOLON-- -token: line 42, column 19, sym: 13 -line:42 col:21 --i--IDENTIFIER-- -token: line 42, column 21, sym: 98, value: 'i' -line:42 col:23 --<--LT-- -token: line 42, column 23, sym: 69 -line:42 col:25 --argv--IDENTIFIER-- -token: line 42, column 25, sym: 98, value: 'argv' -line:42 col:29 --.--DOT-- -token: line 42, column 29, sym: 12 -line:42 col:30 --length--IDENTIFIER-- -token: line 42, column 30, sym: 98, value: 'length' -line:42 col:36 --;--SEMICOLON-- -token: line 42, column 36, sym: 13 -line:42 col:38 --i--IDENTIFIER-- -token: line 42, column 38, sym: 98, value: 'i' -line:42 col:39 --++--PLUSPLUS-- -token: line 42, column 39, sym: 58 -line:42 col:41 --)--RPAREN-- -token: line 42, column 41, sym: 20 -line:42 col:43 --{--LBRACE-- -token: line 42, column 43, sym: 16 -line:43 col:7 --try--TRY-- -token: line 43, column 7, sym: 54 -line:43 col:11 --{--LBRACE-- -token: line 43, column 11, sym: 16 -line:44 col:9 --System--IDENTIFIER-- -token: line 44, column 9, sym: 98, value: 'System' -line:44 col:15 --.--DOT-- -token: line 44, column 15, sym: 12 -line:44 col:16 --out--IDENTIFIER-- -token: line 44, column 16, sym: 98, value: 'out' -line:44 col:19 --.--DOT-- -token: line 44, column 19, sym: 12 -line:44 col:20 --println--IDENTIFIER-- -token: line 44, column 20, sym: 98, value: 'println' -line:44 col:27 --(--LPAREN-- -token: line 44, column 27, sym: 19 -line:44 col:37 --"--STRING_LITERAL-- -token: line 44, column 37, sym: 97, value: 'Lexing [' -line:44 col:38 --+--PLUS-- -token: line 44, column 38, sym: 60 -line:44 col:39 --argv--IDENTIFIER-- -token: line 44, column 39, sym: 98, value: 'argv' -line:44 col:43 --[--LBRACK-- -token: line 44, column 43, sym: 10 -line:44 col:44 --i--IDENTIFIER-- -token: line 44, column 44, sym: 98, value: 'i' -line:44 col:45 --]--RBRACK-- -token: line 44, column 45, sym: 11 -line:44 col:46 --+--PLUS-- -token: line 44, column 46, sym: 60 -line:44 col:49 --"--STRING_LITERAL-- -token: line 44, column 49, sym: 97, value: ']' -line:44 col:50 --)--RPAREN-- -token: line 44, column 50, sym: 20 -line:44 col:51 --;--SEMICOLON-- -token: line 44, column 51, sym: 13 -line:45 col:9 --Scanner--IDENTIFIER-- -token: line 45, column 9, sym: 98, value: 'Scanner' -line:45 col:17 --scanner--IDENTIFIER-- -token: line 45, column 17, sym: 98, value: 'scanner' -line:45 col:25 --=--EQ-- -token: line 45, column 25, sym: 18 -line:45 col:27 --new--NEW-- -token: line 45, column 27, sym: 57 -line:45 col:31 --Scanner--IDENTIFIER-- -token: line 45, column 31, sym: 98, value: 'Scanner' -line:45 col:38 --(--LPAREN-- -token: line 45, column 38, sym: 19 -line:45 col:39 --new--NEW-- -token: line 45, column 39, sym: 57 -line:45 col:43 --UnicodeEscapes--IDENTIFIER-- -token: line 45, column 43, sym: 98, value: 'UnicodeEscapes' -line:45 col:57 --(--LPAREN-- -token: line 45, column 57, sym: 19 -line:45 col:58 --new--NEW-- -token: line 45, column 58, sym: 57 -line:45 col:62 --FileReader--IDENTIFIER-- -token: line 45, column 62, sym: 98, value: 'FileReader' -line:45 col:72 --(--LPAREN-- -token: line 45, column 72, sym: 19 -line:45 col:73 --argv--IDENTIFIER-- -token: line 45, column 73, sym: 98, value: 'argv' -line:45 col:77 --[--LBRACK-- -token: line 45, column 77, sym: 10 -line:45 col:78 --i--IDENTIFIER-- -token: line 45, column 78, sym: 98, value: 'i' -line:45 col:79 --]--RBRACK-- -token: line 45, column 79, sym: 11 -line:45 col:80 --)--RPAREN-- -token: line 45, column 80, sym: 20 -line:45 col:81 --)--RPAREN-- -token: line 45, column 81, sym: 20 -line:45 col:82 --)--RPAREN-- -token: line 45, column 82, sym: 20 -line:45 col:83 --;--SEMICOLON-- -token: line 45, column 83, sym: 13 -line:47 col:9 --Symbol--IDENTIFIER-- -token: line 47, column 9, sym: 98, value: 'Symbol' -line:47 col:16 --s--IDENTIFIER-- -token: line 47, column 16, sym: 98, value: 's' -line:47 col:17 --;--SEMICOLON-- -token: line 47, column 17, sym: 13 -line:48 col:9 --do--DO-- -token: line 48, column 9, sym: 47 -line:48 col:12 --{--LBRACE-- -token: line 48, column 12, sym: 16 -line:49 col:11 --s--IDENTIFIER-- -token: line 49, column 11, sym: 98, value: 's' -line:49 col:13 --=--EQ-- -token: line 49, column 13, sym: 18 -line:49 col:15 --scanner--IDENTIFIER-- -token: line 49, column 15, sym: 98, value: 'scanner' -line:49 col:22 --.--DOT-- -token: line 49, column 22, sym: 12 -line:49 col:23 --debug_next_token--IDENTIFIER-- -token: line 49, column 23, sym: 98, value: 'debug_next_token' -line:49 col:39 --(--LPAREN-- -token: line 49, column 39, sym: 19 -line:49 col:40 --)--RPAREN-- -token: line 49, column 40, sym: 20 -line:49 col:41 --;--SEMICOLON-- -token: line 49, column 41, sym: 13 -line:50 col:11 --System--IDENTIFIER-- -token: line 50, column 11, sym: 98, value: 'System' -line:50 col:17 --.--DOT-- -token: line 50, column 17, sym: 12 -line:50 col:18 --out--IDENTIFIER-- -token: line 50, column 18, sym: 98, value: 'out' -line:50 col:21 --.--DOT-- -token: line 50, column 21, sym: 12 -line:50 col:22 --println--IDENTIFIER-- -token: line 50, column 22, sym: 98, value: 'println' -line:50 col:29 --(--LPAREN-- -token: line 50, column 29, sym: 19 -line:50 col:38 --"--STRING_LITERAL-- -token: line 50, column 38, sym: 97, value: 'token: ' -line:50 col:39 --+--PLUS-- -token: line 50, column 39, sym: 60 -line:50 col:40 --s--IDENTIFIER-- -token: line 50, column 40, sym: 98, value: 's' -line:50 col:41 --)--RPAREN-- -token: line 50, column 41, sym: 20 -line:50 col:42 --;--SEMICOLON-- -token: line 50, column 42, sym: 13 -line:51 col:9 --}--RBRACE-- -token: line 51, column 9, sym: 17 -line:51 col:11 --while--WHILE-- -token: line 51, column 11, sym: 48 -line:51 col:17 --(--LPAREN-- -token: line 51, column 17, sym: 19 -line:51 col:18 --s--IDENTIFIER-- -token: line 51, column 18, sym: 98, value: 's' -line:51 col:19 --.--DOT-- -token: line 51, column 19, sym: 12 -line:51 col:20 --sym--IDENTIFIER-- -token: line 51, column 20, sym: 98, value: 'sym' -line:51 col:24 --!=--NOTEQ-- -token: line 51, column 24, sym: 75 -line:51 col:27 --sym--IDENTIFIER-- -token: line 51, column 27, sym: 98, value: 'sym' -line:51 col:30 --.--DOT-- -token: line 51, column 30, sym: 12 -line:51 col:31 --EOF--IDENTIFIER-- -token: line 51, column 31, sym: 98, value: 'EOF' -line:51 col:34 --)--RPAREN-- -token: line 51, column 34, sym: 20 -line:51 col:35 --;--SEMICOLON-- -token: line 51, column 35, sym: 13 -line:53 col:9 --System--IDENTIFIER-- -token: line 53, column 9, sym: 98, value: 'System' -line:53 col:15 --.--DOT-- -token: line 53, column 15, sym: 12 -line:53 col:16 --out--IDENTIFIER-- -token: line 53, column 16, sym: 98, value: 'out' -line:53 col:19 --.--DOT-- -token: line 53, column 19, sym: 12 -line:53 col:20 --println--IDENTIFIER-- -token: line 53, column 20, sym: 98, value: 'println' -line:53 col:27 --(--LPAREN-- -token: line 53, column 27, sym: 19 -line:53 col:39 --"--STRING_LITERAL-- -token: line 53, column 39, sym: 97, value: 'No errors.' -line:53 col:40 --)--RPAREN-- -token: line 53, column 40, sym: 20 -line:53 col:41 --;--SEMICOLON-- -token: line 53, column 41, sym: 13 -line:54 col:7 --}--RBRACE-- -token: line 54, column 7, sym: 17 -line:55 col:7 --catch--CATCH-- -token: line 55, column 7, sym: 55 -line:55 col:13 --(--LPAREN-- -token: line 55, column 13, sym: 19 -line:55 col:14 --Exception--IDENTIFIER-- -token: line 55, column 14, sym: 98, value: 'Exception' -line:55 col:24 --e--IDENTIFIER-- -token: line 55, column 24, sym: 98, value: 'e' -line:55 col:25 --)--RPAREN-- -token: line 55, column 25, sym: 20 -line:55 col:27 --{--LBRACE-- -token: line 55, column 27, sym: 16 -line:56 col:9 --e--IDENTIFIER-- -token: line 56, column 9, sym: 98, value: 'e' -line:56 col:10 --.--DOT-- -token: line 56, column 10, sym: 12 -line:56 col:11 --printStackTrace--IDENTIFIER-- -token: line 56, column 11, sym: 98, value: 'printStackTrace' -line:56 col:26 --(--LPAREN-- -token: line 56, column 26, sym: 19 -line:56 col:27 --System--IDENTIFIER-- -token: line 56, column 27, sym: 98, value: 'System' -line:56 col:33 --.--DOT-- -token: line 56, column 33, sym: 12 -line:56 col:34 --out--IDENTIFIER-- -token: line 56, column 34, sym: 98, value: 'out' -line:56 col:37 --)--RPAREN-- -token: line 56, column 37, sym: 20 -line:56 col:38 --;--SEMICOLON-- -token: line 56, column 38, sym: 13 -line:57 col:9 --System--IDENTIFIER-- -token: line 57, column 9, sym: 98, value: 'System' -line:57 col:15 --.--DOT-- -token: line 57, column 15, sym: 12 -line:57 col:16 --exit--IDENTIFIER-- -token: line 57, column 16, sym: 98, value: 'exit' -line:57 col:20 --(--LPAREN-- -token: line 57, column 20, sym: 19 -line:57 col:21 --1--INTEGER_LITERAL-- -token: line 57, column 21, sym: 93, value: '1' -line:57 col:22 --)--RPAREN-- -token: line 57, column 22, sym: 20 -line:57 col:23 --;--SEMICOLON-- -token: line 57, column 23, sym: 13 -line:58 col:7 --}--RBRACE-- -token: line 58, column 7, sym: 17 -line:59 col:5 --}--RBRACE-- -token: line 59, column 5, sym: 17 -line:60 col:3 --}--RBRACE-- -token: line 60, column 3, sym: 17 -line:61 col:1 --}--RBRACE-- -token: line 61, column 1, sym: 17 -line:62 col:1 ----EOF-- -token: line 62, column 1, sym: 0 -No errors. diff --git a/tools/lexer/jflex-1.4/examples/java/unicode.flex b/tools/lexer/jflex-1.4/examples/java/unicode.flex deleted file mode 100644 index 31af811a72e7..000000000000 --- a/tools/lexer/jflex-1.4/examples/java/unicode.flex +++ /dev/null @@ -1,149 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 1998-2004 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/* §3.3 of the Java Language Specification : - -UnicodeInputCharacter: - - UnicodeEscape - - RawInputCharacter - - UnicodeEscape: - - \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit - - UnicodeMarker: - - u - - UnicodeMarker u - - RawInputCharacter: - - any Unicode character - - HexDigit: one of - - 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F - -only an even number of '\' is eligible to start a Unicode escape sequence - -*/ - -import java.io.*; - -%% - -%public -%final -%class UnicodeEscapes -%extends FilterReader - -%int -%function read - -%switch -%16bit - -UnicodeEscape = {UnicodeMarker} {HexDigit} {4} -UnicodeMarker = "u"+ -HexDigit = [0-9a-fA-F] - -%state DIGITS - -%init{ - super(in); -%init} - -%{ - private boolean even; - - private int value() { - int r = 0; - - for (int k = zzMarkedPos-4; k < zzMarkedPos; k++) { - int c = zzBuffer[k]; - - if (c >= 'a') - c-= 'a'-10; - else if (c >= 'A') - c-= 'A'-10; - else - c-= '0'; - - r <<= 4; - r += c; - } - - return r; - } - - public int read(char cbuf[], int off, int len) throws IOException { - if ( !ready() ) return -1; - - len+= off; - - for (int i=off; i { - \\ { even = false; return '\\'; } - \\ / \\ { even = !even; return '\\'; } - \\ / "u" { - if (even) { - even = false; - return '\\'; - } - else - yybegin(DIGITS); - } - .|\n { return zzBuffer[zzStartRead]; } - - <> { return -1; } -} - - { - {UnicodeEscape} { yybegin(YYINITIAL); return value(); } - .|\n { throw new Error("incorrect Unicode escape"); } - - <> { throw new Error("EOF in Unicode escape"); } -} diff --git a/tools/lexer/jflex-1.4/examples/simple/Makefile b/tools/lexer/jflex-1.4/examples/simple/Makefile deleted file mode 100644 index d46a13e02feb..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -JAVA=java -JAVAC=javac -JFLEX=jflex -CUP=$(JAVA) java_cup.Main < - -all: test - -test: output.txt - @(diff output.txt output.good && echo "Test OK!") || echo "Test failed!" - -output.txt: Yylex.class test.txt - $(JAVA) Yylex test.txt > output.txt - -Yylex.class: Yylex.java Yytoken.java Utility.java - -%.class: %.java - $(JAVAC) $^ - -Yylex.java: simple.flex - $(JFLEX) simple.flex - -clean: - rm -f Yylex.java output.txt *.class *~ diff --git a/tools/lexer/jflex-1.4/examples/simple/README b/tools/lexer/jflex-1.4/examples/simple/README deleted file mode 100644 index b050b3e242b1..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/README +++ /dev/null @@ -1,29 +0,0 @@ -This directory contains a scanner for a toy programming language. - -It is the example from the JLex website with some small modifications, -to make it a bit more readable. - -It does nothing really useful, because there is no parser for the -toy programming language. It's just a demonstatration how a small simple -scanner looks like. - -files: - -YYtoken.java: - the tokens returned by the scanner - -Utility.java: - small class collecting some utility functions - -simple.flex: - the example specification - -test.txt: - sample input - -output.good: - output matching the sample input from test.txt - -Makefile: (for Unix only) - make to generate scanner and run test - make clean to remove generated files diff --git a/tools/lexer/jflex-1.4/examples/simple/Utility.java b/tools/lexer/jflex-1.4/examples/simple/Utility.java deleted file mode 100644 index 889b030531d0..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/Utility.java +++ /dev/null @@ -1,19 +0,0 @@ -class Utility { - - private static final String errorMsg[] = { - "Error: Unmatched end-of-comment punctuation.", - "Error: Unmatched start-of-comment punctuation.", - "Error: Unclosed string.", - "Error: Illegal character." - }; - - public static final int E_ENDCOMMENT = 0; - public static final int E_STARTCOMMENT = 1; - public static final int E_UNCLOSEDSTR = 2; - public static final int E_UNMATCHED = 3; - - public static void error(int code) { - System.out.println(errorMsg[code]); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/simple/Yytoken.java b/tools/lexer/jflex-1.4/examples/simple/Yytoken.java deleted file mode 100644 index ed60fb8f10c5..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/Yytoken.java +++ /dev/null @@ -1,24 +0,0 @@ -class Yytoken { - public int m_index; - public String m_text; - public int m_line; - public int m_charBegin; - public int m_charEnd; - - Yytoken (int index, String text, int line, int charBegin, int charEnd) { - m_index = index; - m_text = text; - m_line = line; - m_charBegin = charBegin; - m_charEnd = charEnd; - } - - public String toString() { - return "Text : "+m_text+ - "\nindex : "+m_index+ - "\nline : "+m_line+ - "\ncBeg. : "+m_charBegin+ - "\ncEnd. : "+m_charEnd; - } -} - diff --git a/tools/lexer/jflex-1.4/examples/simple/output.good b/tools/lexer/jflex-1.4/examples/simple/output.good deleted file mode 100644 index 04599b114d0e..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/output.good +++ /dev/null @@ -1,660 +0,0 @@ -line: 1 match: --class-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : class -index : 43 -line : 0 -cBeg. : 0 -cEnd. : 5 -line: 1 match: -- -- -action [76] { } -line: 1 match: --Utility-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : Utility -index : 43 -line : 0 -cBeg. : 6 -cEnd. : 13 -line: 1 match: -- -- -action [76] { } -line: 1 match: --{-- -action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } -Text : { -index : 7 -line : 0 -cBeg. : 14 -cEnd. : 15 -line: 1 match: -- - - -- -action [76] { } -line: 3 match: --private-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : private -index : 43 -line : 2 -cBeg. : 21 -cEnd. : 28 -line: 3 match: -- -- -action [76] { } -line: 3 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 2 -cBeg. : 29 -cEnd. : 35 -line: 3 match: -- -- -action [76] { } -line: 3 match: --final-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : final -index : 43 -line : 2 -cBeg. : 36 -cEnd. : 41 -line: 3 match: -- -- -action [76] { } -line: 3 match: --String-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : String -index : 43 -line : 2 -cBeg. : 42 -cEnd. : 48 -line: 3 match: -- -- -action [76] { } -line: 3 match: --errorMsg-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : errorMsg -index : 43 -line : 2 -cBeg. : 49 -cEnd. : 57 -line: 3 match: --[-- -action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } -Text : [ -index : 5 -line : 2 -cBeg. : 57 -cEnd. : 58 -line: 3 match: --]-- -action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } -Text : ] -index : 6 -line : 2 -cBeg. : 58 -cEnd. : 59 -line: 3 match: -- -- -action [76] { } -line: 3 match: --=-- -action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } -Text : = -index : 14 -line : 2 -cBeg. : 60 -cEnd. : 61 -line: 3 match: -- -- -action [76] { } -line: 3 match: --{-- -action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } -Text : { -index : 7 -line : 2 -cBeg. : 62 -cEnd. : 63 -line: 3 match: -- - -- -action [76] { } -line: 4 match: --"Error: Unmatched end-of-comment punctuation."-- -action [57] { String str = yytext().substring(1,yylength()-1); - return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } -Text : Error: Unmatched end-of-comment punctuation. -index : 40 -line : 3 -cBeg. : 68 -cEnd. : 114 -line: 4 match: --,-- -action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } -Text : , -index : 0 -line : 3 -cBeg. : 114 -cEnd. : 115 -line: 4 match: -- - -- -action [76] { } -line: 5 match: --"Error: Unmatched start-of-comment punctuation."-- -action [57] { String str = yytext().substring(1,yylength()-1); - return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } -Text : Error: Unmatched start-of-comment punctuation. -index : 40 -line : 4 -cBeg. : 120 -cEnd. : 168 -line: 5 match: --,-- -action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } -Text : , -index : 0 -line : 4 -cBeg. : 168 -cEnd. : 169 -line: 5 match: -- - -- -action [76] { } -line: 6 match: --"Error: Unclosed string."-- -action [57] { String str = yytext().substring(1,yylength()-1); - return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } -Text : Error: Unclosed string. -index : 40 -line : 5 -cBeg. : 174 -cEnd. : 199 -line: 6 match: --,-- -action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } -Text : , -index : 0 -line : 5 -cBeg. : 199 -cEnd. : 200 -line: 6 match: -- - -- -action [76] { } -line: 7 match: --"Error: Illegal character."-- -action [57] { String str = yytext().substring(1,yylength()-1); - return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } -Text : Error: Illegal character. -index : 40 -line : 6 -cBeg. : 205 -cEnd. : 232 -line: 7 match: -- - -- -action [76] { } -line: 8 match: --}-- -action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } -Text : } -index : 8 -line : 7 -cBeg. : 237 -cEnd. : 238 -line: 8 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 7 -cBeg. : 238 -cEnd. : 239 -line: 8 match: -- - - -- -action [76] { } -line: 10 match: --public-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : public -index : 43 -line : 9 -cBeg. : 245 -cEnd. : 251 -line: 10 match: -- -- -action [76] { } -line: 10 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 9 -cBeg. : 252 -cEnd. : 258 -line: 10 match: -- -- -action [76] { } -line: 10 match: --final-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : final -index : 43 -line : 9 -cBeg. : 259 -cEnd. : 264 -line: 10 match: -- -- -action [76] { } -line: 10 match: --int-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : int -index : 43 -line : 9 -cBeg. : 265 -cEnd. : 268 -line: 10 match: -- -- -action [76] { } -line: 10 match: --E_ENDCOMMENT-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : E_ENDCOMMENT -index : 43 -line : 9 -cBeg. : 269 -cEnd. : 281 -line: 10 match: -- -- -action [76] { } -line: 10 match: --=-- -action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } -Text : = -index : 14 -line : 9 -cBeg. : 282 -cEnd. : 283 -line: 10 match: -- -- -action [76] { } -line: 10 match: --0-- -action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } -Text : 0 -index : 42 -line : 9 -cBeg. : 284 -cEnd. : 285 -line: 10 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 9 -cBeg. : 285 -cEnd. : 286 -line: 10 match: -- - -- -action [76] { } -line: 11 match: --public-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : public -index : 43 -line : 10 -cBeg. : 290 -cEnd. : 296 -line: 11 match: -- -- -action [76] { } -line: 11 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 10 -cBeg. : 297 -cEnd. : 303 -line: 11 match: -- -- -action [76] { } -line: 11 match: --final-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : final -index : 43 -line : 10 -cBeg. : 304 -cEnd. : 309 -line: 11 match: -- -- -action [76] { } -line: 11 match: --int-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : int -index : 43 -line : 10 -cBeg. : 310 -cEnd. : 313 -line: 11 match: -- -- -action [76] { } -line: 11 match: --E_STARTCOMMENT-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : E_STARTCOMMENT -index : 43 -line : 10 -cBeg. : 314 -cEnd. : 328 -line: 11 match: -- -- -action [76] { } -line: 11 match: --=-- -action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } -Text : = -index : 14 -line : 10 -cBeg. : 329 -cEnd. : 330 -line: 11 match: -- -- -action [76] { } -line: 11 match: --1-- -action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } -Text : 1 -index : 42 -line : 10 -cBeg. : 331 -cEnd. : 332 -line: 11 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 10 -cBeg. : 332 -cEnd. : 333 -line: 11 match: -- - -- -action [76] { } -line: 12 match: --public-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : public -index : 43 -line : 11 -cBeg. : 337 -cEnd. : 343 -line: 12 match: -- -- -action [76] { } -line: 12 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 11 -cBeg. : 344 -cEnd. : 350 -line: 12 match: -- -- -action [76] { } -line: 12 match: --final-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : final -index : 43 -line : 11 -cBeg. : 351 -cEnd. : 356 -line: 12 match: -- -- -action [76] { } -line: 12 match: --int-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : int -index : 43 -line : 11 -cBeg. : 357 -cEnd. : 360 -line: 12 match: -- -- -action [76] { } -line: 12 match: --E_UNCLOSEDSTR-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : E_UNCLOSEDSTR -index : 43 -line : 11 -cBeg. : 361 -cEnd. : 374 -line: 12 match: -- -- -action [76] { } -line: 12 match: --=-- -action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } -Text : = -index : 14 -line : 11 -cBeg. : 375 -cEnd. : 376 -line: 12 match: -- -- -action [76] { } -line: 12 match: --2-- -action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } -Text : 2 -index : 42 -line : 11 -cBeg. : 377 -cEnd. : 378 -line: 12 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 11 -cBeg. : 378 -cEnd. : 379 -line: 12 match: -- - -- -action [76] { } -line: 13 match: --public-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : public -index : 43 -line : 12 -cBeg. : 383 -cEnd. : 389 -line: 13 match: -- -- -action [76] { } -line: 13 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 12 -cBeg. : 390 -cEnd. : 396 -line: 13 match: -- -- -action [76] { } -line: 13 match: --final-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : final -index : 43 -line : 12 -cBeg. : 397 -cEnd. : 402 -line: 13 match: -- -- -action [76] { } -line: 13 match: --int-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : int -index : 43 -line : 12 -cBeg. : 403 -cEnd. : 406 -line: 13 match: -- -- -action [76] { } -line: 13 match: --E_UNMATCHED-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : E_UNMATCHED -index : 43 -line : 12 -cBeg. : 407 -cEnd. : 418 -line: 13 match: -- -- -action [76] { } -line: 13 match: --=-- -action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } -Text : = -index : 14 -line : 12 -cBeg. : 419 -cEnd. : 420 -line: 13 match: -- -- -action [76] { } -line: 13 match: --3-- -action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } -Text : 3 -index : 42 -line : 12 -cBeg. : 421 -cEnd. : 422 -line: 13 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 12 -cBeg. : 422 -cEnd. : 423 -line: 13 match: -- - - -- -action [76] { } -line: 15 match: --public-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : public -index : 43 -line : 14 -cBeg. : 428 -cEnd. : 434 -line: 15 match: -- -- -action [76] { } -line: 15 match: --static-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : static -index : 43 -line : 14 -cBeg. : 435 -cEnd. : 441 -line: 15 match: -- -- -action [76] { } -line: 15 match: --void-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : void -index : 43 -line : 14 -cBeg. : 442 -cEnd. : 446 -line: 15 match: -- -- -action [76] { } -line: 15 match: --error-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : error -index : 43 -line : 14 -cBeg. : 447 -cEnd. : 452 -line: 15 match: --(-- -action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } -Text : ( -index : 3 -line : 14 -cBeg. : 452 -cEnd. : 453 -line: 15 match: --int-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : int -index : 43 -line : 14 -cBeg. : 453 -cEnd. : 456 -line: 15 match: -- -- -action [76] { } -line: 15 match: --code-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : code -index : 43 -line : 14 -cBeg. : 457 -cEnd. : 461 -line: 15 match: --)-- -action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } -Text : ) -index : 4 -line : 14 -cBeg. : 461 -cEnd. : 462 -line: 15 match: -- -- -action [76] { } -line: 15 match: --{-- -action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } -Text : { -index : 7 -line : 14 -cBeg. : 463 -cEnd. : 464 -line: 15 match: -- - -- -action [76] { } -line: 16 match: --System-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : System -index : 43 -line : 15 -cBeg. : 468 -cEnd. : 474 -line: 16 match: --.-- -action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } -Text : . -index : 9 -line : 15 -cBeg. : 474 -cEnd. : 475 -line: 16 match: --out-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : out -index : 43 -line : 15 -cBeg. : 475 -cEnd. : 478 -line: 16 match: --.-- -action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } -Text : . -index : 9 -line : 15 -cBeg. : 478 -cEnd. : 479 -line: 16 match: --println-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : println -index : 43 -line : 15 -cBeg. : 479 -cEnd. : 486 -line: 16 match: --(-- -action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } -Text : ( -index : 3 -line : 15 -cBeg. : 486 -cEnd. : 487 -line: 16 match: --errorMsg-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : errorMsg -index : 43 -line : 15 -cBeg. : 487 -cEnd. : 495 -line: 16 match: --[-- -action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } -Text : [ -index : 5 -line : 15 -cBeg. : 495 -cEnd. : 496 -line: 16 match: --code-- -action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -Text : code -index : 43 -line : 15 -cBeg. : 496 -cEnd. : 500 -line: 16 match: --]-- -action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } -Text : ] -index : 6 -line : 15 -cBeg. : 500 -cEnd. : 501 -line: 16 match: --)-- -action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } -Text : ) -index : 4 -line : 15 -cBeg. : 501 -cEnd. : 502 -line: 16 match: --;-- -action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } -Text : ; -index : 2 -line : 15 -cBeg. : 502 -cEnd. : 503 -line: 16 match: -- - -- -action [76] { } -line: 17 match: --}-- -action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } -Text : } -index : 8 -line : 16 -cBeg. : 506 -cEnd. : 507 -line: 17 match: -- --- -action [76] { } -line: 18 match: --}-- -action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } -Text : } -index : 8 -line : 17 -cBeg. : 508 -cEnd. : 509 -line: 18 match: -- - --- -action [76] { } -null diff --git a/tools/lexer/jflex-1.4/examples/simple/simple.flex b/tools/lexer/jflex-1.4/examples/simple/simple.flex deleted file mode 100644 index 790133952271..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/simple.flex +++ /dev/null @@ -1,86 +0,0 @@ -/* this is the scanner example from the JLex website - (with small modifications to make it more readable) */ - -%% - -%{ - private int comment_count = 0; -%} - -%line -%char -%state COMMENT -%full - -%debug - -ALPHA=[A-Za-z] -DIGIT=[0-9] -NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] -NEWLINE=\r|\n|\r\n -WHITE_SPACE_CHAR=[\n\r\ \t\b\012] -STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)* -COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* -Ident = {ALPHA}({ALPHA}|{DIGIT}|_)* - -%% - - { - "," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } - ":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); } - ";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } - "(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } - ")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } - "[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } - "]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } - "{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } - "}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } - "." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } - "+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); } - "-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); } - "*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); } - "/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); } - "=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } - "<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); } - "<" { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); } - "<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); } - ">" { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); } - ">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); } - "&" { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); } - "|" { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); } - ":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); } - - {NONNEWLINE_WHITE_SPACE_CHAR}+ { } - - "/*" { yybegin(COMMENT); comment_count++; } - - \"{STRING_TEXT}\" { - String str = yytext().substring(1,yylength()-1); - return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); - } - - \"{STRING_TEXT} { - String str = yytext().substring(1,yytext().length()); - Utility.error(Utility.E_UNCLOSEDSTR); - return (new Yytoken(41,str,yyline,yychar,yychar + str.length())); - } - - {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } - - {Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } -} - - { - "/*" { comment_count++; } - "*/" { if (--comment_count == 0) yybegin(YYINITIAL); } - {COMMENT_TEXT} { } -} - - -{NEWLINE} { } - -. { - System.out.println("Illegal character: <" + yytext() + ">"); - Utility.error(Utility.E_UNMATCHED); -} - diff --git a/tools/lexer/jflex-1.4/examples/simple/test.txt b/tools/lexer/jflex-1.4/examples/simple/test.txt deleted file mode 100644 index 889b030531d0..000000000000 --- a/tools/lexer/jflex-1.4/examples/simple/test.txt +++ /dev/null @@ -1,19 +0,0 @@ -class Utility { - - private static final String errorMsg[] = { - "Error: Unmatched end-of-comment punctuation.", - "Error: Unmatched start-of-comment punctuation.", - "Error: Unclosed string.", - "Error: Illegal character." - }; - - public static final int E_ENDCOMMENT = 0; - public static final int E_STARTCOMMENT = 1; - public static final int E_UNCLOSEDSTR = 2; - public static final int E_UNMATCHED = 3; - - public static void error(int code) { - System.out.println(errorMsg[code]); - } -} - diff --git a/tools/lexer/jflex-1.4/examples/standalone/Makefile b/tools/lexer/jflex-1.4/examples/standalone/Makefile deleted file mode 100644 index c9a9ab6951f7..000000000000 --- a/tools/lexer/jflex-1.4/examples/standalone/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: run - -run: Subst.class - java Subst sample.inp - -Subst.class: Subst.java - javac Subst.java - -Subst.java: standalone.flex - jflex standalone.flex - -clean: - rm -rf *.class *~ *.java diff --git a/tools/lexer/jflex-1.4/examples/standalone/README b/tools/lexer/jflex-1.4/examples/standalone/README deleted file mode 100644 index 1be85a86998f..000000000000 --- a/tools/lexer/jflex-1.4/examples/standalone/README +++ /dev/null @@ -1,20 +0,0 @@ -This is a small example of a standalone text substitution scanner. - -It reads a name after the keyword name and replaces all occurences -of "hello" by "hello !". - -sample.inp - contains a sample input for the scanner - -standalone.flex - the lexical specification for the scanner - -build.xml - ant build file - -to run the example use ant or type: - -jflex standalone.flex -javac Subst.java -java Subst sample.inp - diff --git a/tools/lexer/jflex-1.4/examples/standalone/build.xml b/tools/lexer/jflex-1.4/examples/standalone/build.xml deleted file mode 100644 index 3d8bae7ca2a5..000000000000 --- a/tools/lexer/jflex-1.4/examples/standalone/build.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/lexer/jflex-1.4/examples/standalone/sample.inp b/tools/lexer/jflex-1.4/examples/standalone/sample.inp deleted file mode 100644 index 550ac7373812..000000000000 --- a/tools/lexer/jflex-1.4/examples/standalone/sample.inp +++ /dev/null @@ -1,8 +0,0 @@ -name someone - -Hello -This is a sample input file for the -standalone example scanner. - -Have a nice day! - diff --git a/tools/lexer/jflex-1.4/examples/standalone/standalone.flex b/tools/lexer/jflex-1.4/examples/standalone/standalone.flex deleted file mode 100644 index 0c7e12f94d8f..000000000000 --- a/tools/lexer/jflex-1.4/examples/standalone/standalone.flex +++ /dev/null @@ -1,44 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 1998-2004 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/** - This is a small example of a standalone text substitution scanner - It reads a name after the keyword name and substitutes all occurences - of "hello" with "hello !". There is a sample input file - "sample.inp" provided in this directory -*/ - -%% - -%public -%class Subst -%standalone - -%unicode - -%{ - String name; -%} - -%% - -"name " [a-zA-Z]+ { name = yytext().substring(5); } -[Hh] "ello" { System.out.print(yytext()+" "+name+"!"); } - diff --git a/tools/lexer/jflex-1.4/jflex-1.4.3-unicode-character-category.patch b/tools/lexer/jflex-1.4/jflex-1.4.3-unicode-character-category.patch deleted file mode 100644 index 0e2101560c66..000000000000 --- a/tools/lexer/jflex-1.4/jflex-1.4.3-unicode-character-category.patch +++ /dev/null @@ -1,7211 +0,0 @@ -Index: jflex/src/JFlex/LexParse.java -=================================================================== ---- jflex/src/JFlex/LexParse.java (revision 370) -+++ jflex/src/JFlex/LexParse.java Tue Dec 01 08:13:39 EST 2009 -@@ -1,15 +1,15 @@ - - //---------------------------------------------------- --// The following code was generated by CUP v0.10k --// Tue May 27 20:22:19 EST 2008 -+// The following code was generated by CUP v0.11a beta 20060608 -+// Tue Dec 01 08:13:38 EST 2009 - //---------------------------------------------------- - - package JFlex; - - import java.util.*; - --/** CUP v0.10k generated parser. -- * @version Tue May 27 20:22:19 EST 2008 -+/** CUP v0.11a beta 20060608 generated parser. -+ * @version Tue Dec 01 08:13:38 EST 2009 - */ - public class LexParse extends java_cup.runtime.lr_parser { - -@@ -19,33 +19,45 @@ - /** Constructor which sets the default scanner. */ - public LexParse(java_cup.runtime.Scanner s) {super(s);} - -+ /** Constructor which sets the default scanner. */ -+ public LexParse(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);} -+ - /** Production table. */ - protected static final short _production_table[][] = - unpackFromStrings(new String[] { -- "\000\113\000\002\002\004\000\002\006\006\000\002\006" + -- "\002\000\002\003\002\000\002\003\004\000\002\003\003" + -- "\000\002\004\003\000\002\004\003\000\002\004\003\000" + -- "\002\004\006\000\002\004\004\000\002\022\004\000\002" + -- "\022\011\000\002\022\010\000\002\022\003\000\002\005" + -- "\006\000\002\005\007\000\002\005\007\000\002\005\005" + -- "\000\002\005\003\000\002\014\003\000\002\014\004\000" + -- "\002\014\005\000\002\024\004\000\002\025\003\000\002" + -- "\025\003\000\002\017\005\000\002\017\002\000\002\016" + -- "\005\000\002\016\003\000\002\016\004\000\002\023\003" + -- "\000\002\023\002\000\002\007\005\000\002\007\003\000" + -- "\002\007\003\000\002\010\004\000\002\010\003\000\002" + -- "\011\003\000\002\011\004\000\002\011\004\000\002\012" + -- "\004\000\002\012\004\000\002\012\004\000\002\012\005" + -- "\000\002\012\006\000\002\012\005\000\002\012\003\000" + -- "\002\012\003\000\002\012\003\000\002\012\003\000\002" + -- "\012\003\000\002\012\003\000\002\013\004\000\002\013" + -- "\005\000\002\013\005\000\002\013\006\000\002\013\006" + -- "\000\002\013\007\000\002\020\004\000\002\020\003\000" + -- "\002\020\004\000\002\020\003\000\002\020\004\000\002" + -- "\020\003\000\002\020\004\000\002\020\003\000\002\015" + -- "\005\000\002\015\003\000\002\021\003\000\002\021\003" + -- "\000\002\021\003\000\002\021\003\000\002\021\003\000" + -- "\002\021\003" }); -+ "\000\151\000\002\002\004\000\002\005\006\000\002\005" + -+ "\002\000\002\002\002\000\002\002\004\000\002\002\003" + -+ "\000\002\003\003\000\002\003\003\000\002\003\003\000" + -+ "\002\003\006\000\002\003\004\000\002\021\004\000\002" + -+ "\021\011\000\002\021\010\000\002\021\003\000\002\004" + -+ "\006\000\002\004\007\000\002\004\007\000\002\004\005" + -+ "\000\002\004\003\000\002\013\003\000\002\013\004\000" + -+ "\002\013\005\000\002\023\004\000\002\024\003\000\002" + -+ "\024\003\000\002\016\005\000\002\016\002\000\002\015" + -+ "\005\000\002\015\003\000\002\015\004\000\002\022\003" + -+ "\000\002\022\002\000\002\006\005\000\002\006\003\000" + -+ "\002\006\003\000\002\007\004\000\002\007\003\000\002" + -+ "\010\003\000\002\010\004\000\002\010\004\000\002\011" + -+ "\004\000\002\011\004\000\002\011\004\000\002\011\005" + -+ "\000\002\011\006\000\002\011\005\000\002\011\003\000" + -+ "\002\011\003\000\002\011\003\000\002\011\003\000\002" + -+ "\011\003\000\002\011\003\000\002\012\004\000\002\012" + -+ "\005\000\002\012\005\000\002\012\006\000\002\012\006" + -+ "\000\002\012\007\000\002\017\004\000\002\017\003\000" + -+ "\002\017\004\000\002\017\003\000\002\017\004\000\002" + -+ "\017\003\000\002\017\004\000\002\017\003\000\002\014" + -+ "\005\000\002\014\003\000\002\020\003\000\002\020\003" + -+ "\000\002\020\003\000\002\020\003\000\002\020\003\000" + -+ "\002\020\003\000\002\020\003\000\002\020\003\000\002" + -+ "\020\003\000\002\020\003\000\002\020\003\000\002\020" + -+ "\003\000\002\020\003\000\002\020\003\000\002\020\003" + -+ "\000\002\020\003\000\002\020\003\000\002\020\003\000" + -+ "\002\020\003\000\002\020\003\000\002\020\003\000\002" + -+ "\020\003\000\002\020\003\000\002\020\003\000\002\020" + -+ "\003\000\002\020\003\000\002\020\003\000\002\020\003" + -+ "\000\002\020\003\000\002\020\003\000\002\020\003\000" + -+ "\002\020\003\000\002\020\003\000\002\020\003\000\002" + -+ "\020\003\000\002\020\003" }); - - /** Access to production table. */ - public short[][] production_table() {return _production_table;} -@@ -53,277 +65,900 @@ - /** Parse-action table. */ - protected static final short[][] _action_table = - unpackFromStrings(new String[] { -- "\000\156\000\006\002\uffff\041\004\001\002\000\016\003" + -- "\007\013\ufffe\022\ufffe\023\ufffe\024\ufffe\040\ufffe\001\002" + -+ "\000\214\000\006\002\uffff\077\004\001\002\000\016\003" + -+ "\007\013\ufffe\022\ufffe\023\ufffe\024\ufffe\076\ufffe\001\002" + - "\000\004\002\006\001\002\000\004\002\001\001\002\000" + -- "\014\013\ufffc\022\ufffc\023\ufffc\024\ufffc\040\ufffc\001\002" + -- "\000\014\013\012\022\011\023\016\024\015\040\014\001" + -- "\002\000\014\013\ufffb\022\ufffb\023\ufffb\024\ufffb\040\ufffb" + -- "\001\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016" + -- "\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + -- "\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053" + -- "\uffe6\054\uffe6\001\002\000\014\013\ufffd\022\ufffd\023\ufffd" + -- "\024\ufffd\040\ufffd\001\002\000\004\014\017\001\002\000" + -- "\014\013\ufff9\022\ufff9\023\ufff9\024\ufff9\040\ufff9\001\002" + -- "\000\014\013\ufffa\022\ufffa\023\ufffa\024\ufffa\040\ufffa\001" + -- "\002\000\052\004\034\010\044\013\ufff7\022\ufff7\023\ufff7" + -- "\024\ufff7\026\023\027\031\030\020\031\042\032\035\033" + -- "\032\040\ufff7\045\041\047\022\050\037\051\024\052\021" + -- "\053\030\054\025\001\002\000\064\004\uffba\005\uffba\007" + -- "\uffba\010\uffba\011\uffba\025\uffba\026\uffba\027\uffba\030\uffba" + -- "\031\uffba\032\uffba\033\uffba\035\uffba\036\uffba\042\uffba\043" + -- "\uffba\044\uffba\045\uffba\046\uffba\047\uffba\050\uffba\051\uffba" + -- "\052\uffba\053\uffba\054\uffba\001\002\000\062\004\uffcd\005" + -- "\uffcd\007\uffcd\010\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd" + -- "\031\uffcd\032\uffcd\033\uffcd\035\uffcd\036\uffcd\042\uffcd\043" + -- "\uffcd\044\uffcd\045\uffcd\046\uffcd\047\uffcd\050\uffcd\051\uffcd" + -- "\052\uffcd\053\uffcd\054\uffcd\001\002\000\062\004\uffce\005" + -- "\uffce\007\uffce\010\uffce\025\uffce\026\uffce\027\uffce\030\uffce" + -- "\031\uffce\032\uffce\033\uffce\035\uffce\036\uffce\042\uffce\043" + -- "\uffce\044\uffce\045\uffce\046\uffce\047\uffce\050\uffce\051\uffce" + -- "\052\uffce\053\uffce\054\uffce\001\002\000\064\004\uffbc\005" + -- "\uffbc\007\uffbc\010\uffbc\011\uffbc\025\uffbc\026\uffbc\027\uffbc" + -- "\030\uffbc\031\uffbc\032\uffbc\033\uffbc\035\uffbc\036\uffbc\042" + -- "\uffbc\043\uffbc\044\uffbc\045\uffbc\046\uffbc\047\uffbc\050\uffbc" + -- "\051\uffbc\052\uffbc\053\uffbc\054\uffbc\001\002\000\036\004" + -- "\034\010\044\026\023\027\031\030\020\031\042\032\035" + -- "\033\032\047\022\050\037\051\024\052\021\053\030\054" + -- "\025\001\002\000\062\004\uffd2\005\uffd2\007\uffd2\010\uffd2" + -- "\025\uffd2\026\uffd2\027\uffd2\030\uffd2\031\uffd2\032\uffd2\033" + -- "\uffd2\035\uffd2\036\uffd2\042\uffd2\043\uffd2\044\uffd2\045\uffd2" + -- "\046\uffd2\047\uffd2\050\uffd2\051\uffd2\052\uffd2\053\uffd2\054" + -- "\uffd2\001\002\000\006\025\112\045\106\001\002\000\062" + -- "\004\uffd0\005\uffd0\007\uffd0\010\uffd0\025\uffd0\026\uffd0\027" + -- "\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\035\uffd0\036\uffd0" + -- "\042\uffd0\043\uffd0\044\uffd0\045\uffd0\046\uffd0\047\uffd0\050" + -- "\uffd0\051\uffd0\052\uffd0\053\uffd0\054\uffd0\001\002\000\062" + -- "\004\uffcf\005\uffcf\007\uffcf\010\uffcf\025\uffcf\026\uffcf\027" + -- "\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\035\uffcf\036\uffcf" + -- "\042\uffcf\043\uffcf\044\uffcf\045\uffcf\046\uffcf\047\uffcf\050" + -- "\uffcf\051\uffcf\052\uffcf\053\uffcf\054\uffcf\001\002\000\064" + -- "\004\uffbb\005\uffbb\007\uffbb\010\uffbb\011\uffbb\025\uffbb\026" + -- "\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb\033\uffbb\035\uffbb" + -- "\036\uffbb\042\uffbb\043\uffbb\044\uffbb\045\uffbb\046\uffbb\047" + -- "\uffbb\050\uffbb\051\uffbb\052\uffbb\053\uffbb\054\uffbb\001\002" + -- "\000\064\004\uffb7\005\uffb7\007\uffb7\010\uffb7\011\uffb7\025" + -- "\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7" + -- "\035\uffb7\036\uffb7\042\uffb7\043\uffb7\044\uffb7\045\uffb7\046" + -- "\uffb7\047\uffb7\050\uffb7\051\uffb7\052\uffb7\053\uffb7\054\uffb7" + -- "\001\002\000\052\004\034\005\uffdf\007\uffdf\010\044\025" + -- "\uffdf\026\023\027\031\030\020\031\042\032\035\033\032" + -- "\035\uffdf\036\uffdf\045\uffdf\047\022\050\037\051\024\052" + -- "\021\053\030\054\025\001\002\000\040\004\034\010\044" + -- "\026\023\027\031\030\020\031\042\032\035\033\032\045" + -- "\041\047\022\050\037\051\024\052\021\053\030\054\025" + -- "\001\002\000\064\004\uffb8\005\uffb8\007\uffb8\010\uffb8\011" + -- "\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8" + -- "\033\uffb8\035\uffb8\036\uffb8\042\uffb8\043\uffb8\044\uffb8\045" + -- "\uffb8\046\uffb8\047\uffb8\050\uffb8\051\uffb8\052\uffb8\053\uffb8" + -- "\054\uffb8\001\002\000\062\004\uffd1\005\uffd1\007\uffd1\010" + -- "\uffd1\025\uffd1\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1" + -- "\033\uffd1\035\uffd1\036\uffd1\042\uffd1\043\uffd1\044\uffd1\045" + -- "\uffd1\046\uffd1\047\uffd1\050\uffd1\051\uffd1\052\uffd1\053\uffd1" + -- "\054\uffd1\001\002\000\036\004\034\010\044\026\023\027" + -- "\031\030\020\031\042\032\035\033\032\047\022\050\037" + -- "\051\024\052\021\053\030\054\025\001\002\000\052\004" + -- "\uffdc\005\uffdc\007\uffdc\010\uffdc\025\uffdc\026\uffdc\027\uffdc" + -- "\030\uffdc\031\uffdc\032\uffdc\033\uffdc\035\uffdc\036\uffdc\045" + -- "\uffdc\047\uffdc\050\uffdc\051\uffdc\052\uffdc\053\uffdc\054\uffdc" + -- "\001\002\000\016\005\uffde\007\uffde\025\uffde\035\uffde\036" + -- "\uffde\045\uffde\001\002\000\064\004\uffb9\005\uffb9\007\uffb9" + -- "\010\uffb9\011\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031" + -- "\uffb9\032\uffb9\033\uffb9\035\uffb9\036\uffb9\042\uffb9\043\uffb9" + -- "\044\uffb9\045\uffb9\046\uffb9\047\uffb9\050\uffb9\051\uffb9\052" + -- "\uffb9\053\uffb9\054\uffb9\001\002\000\062\004\uffdb\005\uffdb" + -- "\007\uffdb\010\uffdb\025\uffdb\026\uffdb\027\uffdb\030\uffdb\031" + -- "\uffdb\032\uffdb\033\uffdb\035\uffdb\036\uffdb\042\077\043\075" + -- "\044\076\045\uffdb\046\100\047\uffdb\050\uffdb\051\uffdb\052" + -- "\uffdb\053\uffdb\054\uffdb\001\002\000\032\006\047\011\051" + -- "\012\050\026\023\027\031\030\020\031\042\032\035\033" + -- "\032\052\055\053\052\054\053\001\002\000\026\011\uffc3" + -- "\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3\033\uffc3\052" + -- "\uffc3\053\uffc3\054\uffc3\001\002\000\026\011\uffc5\026\uffc5" + -- "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\052\uffc5\053" + -- "\uffc5\054\uffc5\001\002\000\030\011\070\012\067\026\023" + -- "\027\031\030\020\031\042\032\035\033\032\052\055\053" + -- "\052\054\053\001\002\000\024\026\023\027\031\030\020" + -- "\031\042\032\035\033\032\052\055\053\052\054\053\001" + -- "\002\000\062\004\uffcc\005\uffcc\007\uffcc\010\uffcc\025\uffcc" + -- "\026\uffcc\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033\uffcc\035" + -- "\uffcc\036\uffcc\042\uffcc\043\uffcc\044\uffcc\045\uffcc\046\uffcc" + -- "\047\uffcc\050\uffcc\051\uffcc\052\uffcc\053\uffcc\054\uffcc\001" + -- "\002\000\026\011\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1" + -- "\032\uffc1\033\uffc1\052\uffc1\053\uffc1\054\uffc1\001\002\000" + -- "\026\011\uffbf\026\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf" + -- "\033\uffbf\052\uffbf\053\uffbf\054\uffbf\001\002\000\026\011" + -- "\062\026\023\027\031\030\020\031\042\032\035\033\032" + -- "\052\055\053\063\054\064\001\002\000\030\011\uffbd\012" + -- "\056\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" + -- "\052\uffbd\053\uffbd\054\uffbd\001\002\000\004\052\057\001" + -- "\002\000\026\011\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe" + -- "\032\uffbe\033\uffbe\052\uffbe\053\uffbe\054\uffbe\001\002\000" + -- "\026\011\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4" + -- "\033\uffc4\052\uffc4\053\uffc4\054\uffc4\001\002\000\026\011" + -- "\uffc6\026\uffc6\027\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6" + -- "\052\uffc6\053\uffc6\054\uffc6\001\002\000\062\004\uffcb\005" + -- "\uffcb\007\uffcb\010\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb" + -- "\031\uffcb\032\uffcb\033\uffcb\035\uffcb\036\uffcb\042\uffcb\043" + -- "\uffcb\044\uffcb\045\uffcb\046\uffcb\047\uffcb\050\uffcb\051\uffcb" + -- "\052\uffcb\053\uffcb\054\uffcb\001\002\000\026\011\uffc2\026" + -- "\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033\uffc2\052\uffc2" + -- "\053\uffc2\054\uffc2\001\002\000\026\011\uffc0\026\uffc0\027" + -- "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\052\uffc0\053\uffc0" + -- "\054\uffc0\001\002\000\026\011\066\026\023\027\031\030" + -- "\020\031\042\032\035\033\032\052\055\053\063\054\064" + -- "\001\002\000\062\004\uffc8\005\uffc8\007\uffc8\010\uffc8\025" + -- "\uffc8\026\uffc8\027\uffc8\030\uffc8\031\uffc8\032\uffc8\033\uffc8" + -- "\035\uffc8\036\uffc8\042\uffc8\043\uffc8\044\uffc8\045\uffc8\046" + -- "\uffc8\047\uffc8\050\uffc8\051\uffc8\052\uffc8\053\uffc8\054\uffc8" + -- "\001\002\000\024\026\023\027\031\030\020\031\042\032" + -- "\035\033\032\052\055\053\052\054\053\001\002\000\062" + -- "\004\uffca\005\uffca\007\uffca\010\uffca\025\uffca\026\uffca\027" + -- "\uffca\030\uffca\031\uffca\032\uffca\033\uffca\035\uffca\036\uffca" + -- "\042\uffca\043\uffca\044\uffca\045\uffca\046\uffca\047\uffca\050" + -- "\uffca\051\uffca\052\uffca\053\uffca\054\uffca\001\002\000\026" + -- "\011\072\026\023\027\031\030\020\031\042\032\035\033" + -- "\032\052\055\053\063\054\064\001\002\000\062\004\uffc9" + -- "\005\uffc9\007\uffc9\010\uffc9\025\uffc9\026\uffc9\027\uffc9\030" + -- "\uffc9\031\uffc9\032\uffc9\033\uffc9\035\uffc9\036\uffc9\042\uffc9" + -- "\043\uffc9\044\uffc9\045\uffc9\046\uffc9\047\uffc9\050\uffc9\051" + -- "\uffc9\052\uffc9\053\uffc9\054\uffc9\001\002\000\026\011\074" + -- "\026\023\027\031\030\020\031\042\032\035\033\032\052" + -- "\055\053\063\054\064\001\002\000\062\004\uffc7\005\uffc7" + -- "\007\uffc7\010\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031" + -- "\uffc7\032\uffc7\033\uffc7\035\uffc7\036\uffc7\042\uffc7\043\uffc7" + -- "\044\uffc7\045\uffc7\046\uffc7\047\uffc7\050\uffc7\051\uffc7\052" + -- "\uffc7\053\uffc7\054\uffc7\001\002\000\062\004\uffd8\005\uffd8" + -- "\007\uffd8\010\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031" + -- "\uffd8\032\uffd8\033\uffd8\035\uffd8\036\uffd8\042\uffd8\043\uffd8" + -- "\044\uffd8\045\uffd8\046\uffd8\047\uffd8\050\uffd8\051\uffd8\052" + -- "\uffd8\053\uffd8\054\uffd8\001\002\000\062\004\uffd7\005\uffd7" + -- "\007\uffd7\010\uffd7\025\uffd7\026\uffd7\027\uffd7\030\uffd7\031" + -- "\uffd7\032\uffd7\033\uffd7\035\uffd7\036\uffd7\042\uffd7\043\uffd7" + -- "\044\uffd7\045\uffd7\046\uffd7\047\uffd7\050\uffd7\051\uffd7\052" + -- "\uffd7\053\uffd7\054\uffd7\001\002\000\006\021\101\042\102" + -- "\001\002\000\062\004\uffd6\005\uffd6\007\uffd6\010\uffd6\025" + -- "\uffd6\026\uffd6\027\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6" + -- "\035\uffd6\036\uffd6\042\uffd6\043\uffd6\044\uffd6\045\uffd6\046" + -- "\uffd6\047\uffd6\050\uffd6\051\uffd6\052\uffd6\053\uffd6\054\uffd6" + -- "\001\002\000\062\004\uffd5\005\uffd5\007\uffd5\010\uffd5\025" + -- "\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5\032\uffd5\033\uffd5" + -- "\035\uffd5\036\uffd5\042\uffd5\043\uffd5\044\uffd5\045\uffd5\046" + -- "\uffd5\047\uffd5\050\uffd5\051\uffd5\052\uffd5\053\uffd5\054\uffd5" + -- "\001\002\000\004\021\103\001\002\000\062\004\uffd4\005" + -- "\uffd4\007\uffd4\010\uffd4\025\uffd4\026\uffd4\027\uffd4\030\uffd4" + -- "\031\uffd4\032\uffd4\033\uffd4\035\uffd4\036\uffd4\042\uffd4\043" + -- "\uffd4\044\uffd4\045\uffd4\046\uffd4\047\uffd4\050\uffd4\051\uffd4" + -- "\052\uffd4\053\uffd4\054\uffd4\001\002\000\052\004\uffda\005" + -- "\uffda\007\uffda\010\uffda\025\uffda\026\uffda\027\uffda\030\uffda" + -- "\031\uffda\032\uffda\033\uffda\035\uffda\036\uffda\045\uffda\047" + -- "\uffda\050\uffda\051\uffda\052\uffda\053\uffda\054\uffda\001\002" + -- "\000\006\005\107\045\106\001\002\000\036\004\034\010" + -- "\044\026\023\027\031\030\020\031\042\032\035\033\032" + -- "\047\022\050\037\051\024\052\021\053\030\054\025\001" + -- "\002\000\062\004\uffd3\005\uffd3\007\uffd3\010\uffd3\025\uffd3" + -- "\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\035" + -- "\uffd3\036\uffd3\042\uffd3\043\uffd3\044\uffd3\045\uffd3\046\uffd3" + -- "\047\uffd3\050\uffd3\051\uffd3\052\uffd3\053\uffd3\054\uffd3\001" + -- "\002\000\052\004\034\005\uffe0\007\uffe0\010\044\025\uffe0" + -- "\026\023\027\031\030\020\031\042\032\035\033\032\035" + -- "\uffe0\036\uffe0\045\uffe0\047\022\050\037\051\024\052\021" + -- "\053\030\054\025\001\002\000\052\004\uffdd\005\uffdd\007" + -- "\uffdd\010\uffdd\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd" + -- "\032\uffdd\033\uffdd\035\uffdd\036\uffdd\045\uffdd\047\uffdd\050" + -- "\uffdd\051\uffdd\052\uffdd\053\uffdd\054\uffdd\001\002\000\014" + -- "\013\ufff8\022\ufff8\023\ufff8\024\ufff8\040\ufff8\001\002\000" + -- "\052\004\uffd9\005\uffd9\007\uffd9\010\uffd9\025\uffd9\026\uffd9" + -- "\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9\035\uffd9\036" + -- "\uffd9\045\uffd9\047\uffd9\050\uffd9\051\uffd9\052\uffd9\053\uffd9" + -- "\054\uffd9\001\002\000\054\002\uffee\003\uffee\004\uffee\006" + -- "\uffee\010\uffee\016\uffee\021\uffee\026\uffee\027\uffee\030\uffee" + -- "\031\uffee\032\uffee\033\uffee\034\uffee\045\uffee\047\uffee\050" + -- "\uffee\051\uffee\052\uffee\053\uffee\054\uffee\001\002\000\044" + -- "\004\uffe1\006\142\010\uffe1\026\uffe1\027\uffe1\030\uffe1\031" + -- "\uffe1\032\uffe1\033\uffe1\034\140\045\uffe1\047\uffe1\050\uffe1" + -- "\051\uffe1\052\uffe1\053\uffe1\054\uffe1\001\002\000\004\040" + -- "\124\001\002\000\054\002\ufff3\003\ufff3\004\ufff3\006\ufff3" + -- "\010\ufff3\016\ufff3\021\ufff3\026\ufff3\027\ufff3\030\ufff3\031" + -- "\ufff3\032\ufff3\033\ufff3\034\ufff3\045\ufff3\047\ufff3\050\ufff3" + -- "\051\ufff3\052\ufff3\053\ufff3\054\ufff3\001\002\000\052\002" + -- "\000\003\114\004\uffe6\006\uffe6\010\uffe6\016\121\026\uffe6" + -- "\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045" + -- "\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6" + -- "\001\002\000\004\040\124\001\002\000\054\002\ufff6\003" + -- "\ufff6\004\ufff6\006\ufff6\010\ufff6\016\ufff6\021\ufff6\026\ufff6" + -- "\027\ufff6\030\ufff6\031\ufff6\032\ufff6\033\ufff6\034\ufff6\045" + -- "\ufff6\047\ufff6\050\ufff6\051\ufff6\052\ufff6\053\ufff6\054\ufff6" + -- "\001\002\000\004\017\127\001\002\000\006\015\125\017" + -- "\uffe4\001\002\000\006\017\uffe3\040\124\001\002\000\004" + -- "\017\uffe5\001\002\000\046\004\uffe7\006\uffe7\010\uffe7\020" + -- "\130\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7" + -- "\034\uffe7\045\uffe7\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053" + -- "\uffe7\054\uffe7\001\002\000\050\003\114\004\uffe6\006\uffe6" + -- "\010\uffe6\016\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032" + -- "\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6" + -- "\052\uffe6\053\uffe6\054\uffe6\001\002\000\052\003\114\004" + -- "\uffe6\006\uffe6\010\uffe6\016\121\021\132\026\uffe6\027\uffe6" + -- "\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047" + -- "\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002" + -- "\000\054\002\ufff5\003\ufff5\004\ufff5\006\ufff5\010\ufff5\016" + -- "\ufff5\021\ufff5\026\ufff5\027\ufff5\030\ufff5\031\ufff5\032\ufff5" + -- "\033\ufff5\034\ufff5\045\ufff5\047\ufff5\050\ufff5\051\ufff5\052" + -- "\ufff5\053\ufff5\054\ufff5\001\002\000\004\017\134\001\002" + -- "\000\046\004\uffe7\006\uffe7\010\uffe7\020\135\026\uffe7\027" + -- "\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7\034\uffe7\045\uffe7" + -- "\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053\uffe7\054\uffe7\001" + -- "\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016\116" + -- "\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034" + -- "\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + -- "\054\uffe6\001\002\000\052\003\114\004\uffe6\006\uffe6\010" + -- "\uffe6\016\121\021\137\026\uffe6\027\uffe6\030\uffe6\031\uffe6" + -- "\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051" + -- "\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002\000\054\002\ufff4" + -- "\003\ufff4\004\ufff4\006\ufff4\010\ufff4\016\ufff4\021\ufff4\026" + -- "\ufff4\027\ufff4\030\ufff4\031\ufff4\032\ufff4\033\ufff4\034\ufff4" + -- "\045\ufff4\047\ufff4\050\ufff4\051\ufff4\052\ufff4\053\ufff4\054" + -- "\ufff4\001\002\000\004\037\160\001\002\000\040\004\034" + -- "\010\044\026\023\027\031\030\020\031\042\032\035\033" + -- "\032\045\041\047\022\050\037\051\024\052\021\053\030" + -- "\054\025\001\002\000\040\004\uffe2\010\uffe2\026\uffe2\027" + -- "\uffe2\030\uffe2\031\uffe2\032\uffe2\033\uffe2\045\uffe2\047\uffe2" + -- "\050\uffe2\051\uffe2\052\uffe2\053\uffe2\054\uffe2\001\002\000" + -- "\014\007\152\025\147\035\144\036\146\045\106\001\002" + -- "\000\054\002\uffe8\003\uffe8\004\uffe8\006\uffe8\010\uffe8\016" + -- "\uffe8\021\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8\032\uffe8" + -- "\033\uffe8\034\uffe8\045\uffe8\047\uffe8\050\uffe8\051\uffe8\052" + -- "\uffe8\053\uffe8\054\uffe8\001\002\000\054\002\uffe9\003\uffe9" + -- "\004\uffe9\006\uffe9\010\uffe9\016\uffe9\021\uffe9\026\uffe9\027" + -- "\uffe9\030\uffe9\031\uffe9\032\uffe9\033\uffe9\034\uffe9\045\uffe9" + -- "\047\uffe9\050\uffe9\051\uffe9\052\uffe9\053\uffe9\054\uffe9\001" + -- "\002\000\040\004\034\010\044\026\023\027\031\030\020" + -- "\031\042\032\035\033\032\045\041\047\022\050\037\051" + -- "\024\052\021\053\030\054\025\001\002\000\004\037\155" + -- "\001\002\000\006\025\147\035\153\001\002\000\054\002" + -+ "\014\013\ufffc\022\ufffc\023\ufffc\024\ufffc\076\ufffc\001\002" + -+ "\000\014\013\012\022\011\023\016\024\015\076\014\001" + -+ "\002\000\014\013\ufffb\022\ufffb\023\ufffb\024\ufffb\076\ufffb" + -+ "\001\002\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016" + -+ "\154\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + -+ "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + -+ "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + -+ "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + -+ "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + -+ "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + -+ "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + -+ "\000\014\013\ufffd\022\ufffd\023\ufffd\024\ufffd\076\ufffd\001" + -+ "\002\000\004\014\017\001\002\000\014\013\ufff9\022\ufff9" + -+ "\023\ufff9\024\ufff9\076\ufff9\001\002\000\014\013\ufffa\022" + -+ "\ufffa\023\ufffa\024\ufffa\076\ufffa\001\002\000\146\004\066" + -+ "\010\064\013\ufff7\022\ufff7\023\ufff7\024\ufff7\026\056\027" + -+ "\043\030\072\031\060\032\076\033\023\037\061\040\033" + -+ "\041\021\042\074\043\063\044\062\045\073\046\071\047" + -+ "\036\050\050\051\101\052\053\053\052\054\047\055\055" + -+ "\056\054\057\044\060\042\061\067\062\040\063\102\064" + -+ "\032\065\051\066\031\067\034\070\020\071\075\072\100" + -+ "\073\025\074\026\076\ufff7\103\037\105\070\106\041\107" + -+ "\035\110\022\111\077\112\024\001\002\000\160\004\uff9d" + -+ "\005\uff9d\007\uff9d\010\uff9d\011\uff9d\025\uff9d\026\uff9d\027" + -+ "\uff9d\030\uff9d\031\uff9d\032\uff9d\033\uff9d\035\uff9d\036\uff9d" + -+ "\037\uff9d\040\uff9d\041\uff9d\042\uff9d\043\uff9d\044\uff9d\045" + -+ "\uff9d\046\uff9d\047\uff9d\050\uff9d\051\uff9d\052\uff9d\053\uff9d" + -+ "\054\uff9d\055\uff9d\056\uff9d\057\uff9d\060\uff9d\061\uff9d\062" + -+ "\uff9d\063\uff9d\064\uff9d\065\uff9d\066\uff9d\067\uff9d\070\uff9d" + -+ "\071\uff9d\072\uff9d\073\uff9d\074\uff9d\100\uff9d\101\uff9d\102" + -+ "\uff9d\103\uff9d\104\uff9d\105\uff9d\106\uff9d\107\uff9d\110\uff9d" + -+ "\111\uff9d\112\uff9d\001\002\000\160\004\uffb4\005\uffb4\007" + -+ "\uffb4\010\uffb4\011\uffb4\025\uffb4\026\uffb4\027\uffb4\030\uffb4" + -+ "\031\uffb4\032\uffb4\033\uffb4\035\uffb4\036\uffb4\037\uffb4\040" + -+ "\uffb4\041\uffb4\042\uffb4\043\uffb4\044\uffb4\045\uffb4\046\uffb4" + -+ "\047\uffb4\050\uffb4\051\uffb4\052\uffb4\053\uffb4\054\uffb4\055" + -+ "\uffb4\056\uffb4\057\uffb4\060\uffb4\061\uffb4\062\uffb4\063\uffb4" + -+ "\064\uffb4\065\uffb4\066\uffb4\067\uffb4\070\uffb4\071\uffb4\072" + -+ "\uffb4\073\uffb4\074\uffb4\100\uffb4\101\uffb4\102\uffb4\103\uffb4" + -+ "\104\uffb4\105\uffb4\106\uffb4\107\uffb4\110\uffb4\111\uffb4\112" + -+ "\uffb4\001\002\000\156\004\uffcd\005\uffcd\007\uffcd\010\uffcd" + -+ "\025\uffcd\026\uffcd\027\uffcd\030\uffcd\031\uffcd\032\uffcd\033" + -+ "\uffcd\035\uffcd\036\uffcd\037\uffcd\040\uffcd\041\uffcd\042\uffcd" + -+ "\043\uffcd\044\uffcd\045\uffcd\046\uffcd\047\uffcd\050\uffcd\051" + -+ "\uffcd\052\uffcd\053\uffcd\054\uffcd\055\uffcd\056\uffcd\057\uffcd" + -+ "\060\uffcd\061\uffcd\062\uffcd\063\uffcd\064\uffcd\065\uffcd\066" + -+ "\uffcd\067\uffcd\070\uffcd\071\uffcd\072\uffcd\073\uffcd\074\uffcd" + -+ "\100\uffcd\101\uffcd\102\uffcd\103\uffcd\104\uffcd\105\uffcd\106" + -+ "\uffcd\107\uffcd\110\uffcd\111\uffcd\112\uffcd\001\002\000\160" + -+ "\004\uffb7\005\uffb7\007\uffb7\010\uffb7\011\uffb7\025\uffb7\026" + -+ "\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7\035\uffb7" + -+ "\036\uffb7\037\uffb7\040\uffb7\041\uffb7\042\uffb7\043\uffb7\044" + -+ "\uffb7\045\uffb7\046\uffb7\047\uffb7\050\uffb7\051\uffb7\052\uffb7" + -+ "\053\uffb7\054\uffb7\055\uffb7\056\uffb7\057\uffb7\060\uffb7\061" + -+ "\uffb7\062\uffb7\063\uffb7\064\uffb7\065\uffb7\066\uffb7\067\uffb7" + -+ "\070\uffb7\071\uffb7\072\uffb7\073\uffb7\074\uffb7\100\uffb7\101" + -+ "\uffb7\102\uffb7\103\uffb7\104\uffb7\105\uffb7\106\uffb7\107\uffb7" + -+ "\110\uffb7\111\uffb7\112\uffb7\001\002\000\156\004\uffd2\005" + -+ "\uffd2\007\uffd2\010\uffd2\025\uffd2\026\uffd2\027\uffd2\030\uffd2" + -+ "\031\uffd2\032\uffd2\033\uffd2\035\uffd2\036\uffd2\037\uffd2\040" + -+ "\uffd2\041\uffd2\042\uffd2\043\uffd2\044\uffd2\045\uffd2\046\uffd2" + -+ "\047\uffd2\050\uffd2\051\uffd2\052\uffd2\053\uffd2\054\uffd2\055" + -+ "\uffd2\056\uffd2\057\uffd2\060\uffd2\061\uffd2\062\uffd2\063\uffd2" + -+ "\064\uffd2\065\uffd2\066\uffd2\067\uffd2\070\uffd2\071\uffd2\072" + -+ "\uffd2\073\uffd2\074\uffd2\100\uffd2\101\uffd2\102\uffd2\103\uffd2" + -+ "\104\uffd2\105\uffd2\106\uffd2\107\uffd2\110\uffd2\111\uffd2\112" + -+ "\uffd2\001\002\000\160\004\uff9a\005\uff9a\007\uff9a\010\uff9a" + -+ "\011\uff9a\025\uff9a\026\uff9a\027\uff9a\030\uff9a\031\uff9a\032" + -+ "\uff9a\033\uff9a\035\uff9a\036\uff9a\037\uff9a\040\uff9a\041\uff9a" + -+ "\042\uff9a\043\uff9a\044\uff9a\045\uff9a\046\uff9a\047\uff9a\050" + -+ "\uff9a\051\uff9a\052\uff9a\053\uff9a\054\uff9a\055\uff9a\056\uff9a" + -+ "\057\uff9a\060\uff9a\061\uff9a\062\uff9a\063\uff9a\064\uff9a\065" + -+ "\uff9a\066\uff9a\067\uff9a\070\uff9a\071\uff9a\072\uff9a\073\uff9a" + -+ "\074\uff9a\100\uff9a\101\uff9a\102\uff9a\103\uff9a\104\uff9a\105" + -+ "\uff9a\106\uff9a\107\uff9a\110\uff9a\111\uff9a\112\uff9a\001\002" + -+ "\000\160\004\uff99\005\uff99\007\uff99\010\uff99\011\uff99\025" + -+ "\uff99\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99\033\uff99" + -+ "\035\uff99\036\uff99\037\uff99\040\uff99\041\uff99\042\uff99\043" + -+ "\uff99\044\uff99\045\uff99\046\uff99\047\uff99\050\uff99\051\uff99" + -+ "\052\uff99\053\uff99\054\uff99\055\uff99\056\uff99\057\uff99\060" + -+ "\uff99\061\uff99\062\uff99\063\uff99\064\uff99\065\uff99\066\uff99" + -+ "\067\uff99\070\uff99\071\uff99\072\uff99\073\uff99\074\uff99\100" + -+ "\uff99\101\uff99\102\uff99\103\uff99\104\uff99\105\uff99\106\uff99" + -+ "\107\uff99\110\uff99\111\uff99\112\uff99\001\002\000\006\025" + -+ "\151\103\104\001\002\000\146\004\066\005\uffdf\007\uffdf" + -+ "\010\064\025\uffdf\026\056\027\043\030\072\031\060\032" + -+ "\076\033\023\035\uffdf\036\uffdf\037\061\040\033\041\021" + -+ "\042\074\043\063\044\062\045\073\046\071\047\036\050" + -+ "\050\051\101\052\053\053\052\054\047\055\055\056\054" + -+ "\057\044\060\042\061\067\062\040\063\102\064\032\065" + -+ "\051\066\031\067\034\070\020\071\075\072\100\073\025" + -+ "\074\026\103\uffdf\105\070\106\041\107\035\110\022\111" + -+ "\077\112\024\001\002\000\160\004\uff9f\005\uff9f\007\uff9f" + -+ "\010\uff9f\011\uff9f\025\uff9f\026\uff9f\027\uff9f\030\uff9f\031" + -+ "\uff9f\032\uff9f\033\uff9f\035\uff9f\036\uff9f\037\uff9f\040\uff9f" + -+ "\041\uff9f\042\uff9f\043\uff9f\044\uff9f\045\uff9f\046\uff9f\047" + -+ "\uff9f\050\uff9f\051\uff9f\052\uff9f\053\uff9f\054\uff9f\055\uff9f" + -+ "\056\uff9f\057\uff9f\060\uff9f\061\uff9f\062\uff9f\063\uff9f\064" + -+ "\uff9f\065\uff9f\066\uff9f\067\uff9f\070\uff9f\071\uff9f\072\uff9f" + -+ "\073\uff9f\074\uff9f\100\uff9f\101\uff9f\102\uff9f\103\uff9f\104" + -+ "\uff9f\105\uff9f\106\uff9f\107\uff9f\110\uff9f\111\uff9f\112\uff9f" + -+ "\001\002\000\160\004\uffa1\005\uffa1\007\uffa1\010\uffa1\011" + -+ "\uffa1\025\uffa1\026\uffa1\027\uffa1\030\uffa1\031\uffa1\032\uffa1" + -+ "\033\uffa1\035\uffa1\036\uffa1\037\uffa1\040\uffa1\041\uffa1\042" + -+ "\uffa1\043\uffa1\044\uffa1\045\uffa1\046\uffa1\047\uffa1\050\uffa1" + -+ "\051\uffa1\052\uffa1\053\uffa1\054\uffa1\055\uffa1\056\uffa1\057" + -+ "\uffa1\060\uffa1\061\uffa1\062\uffa1\063\uffa1\064\uffa1\065\uffa1" + -+ "\066\uffa1\067\uffa1\070\uffa1\071\uffa1\072\uffa1\073\uffa1\074" + -+ "\uffa1\100\uffa1\101\uffa1\102\uffa1\103\uffa1\104\uffa1\105\uffa1" + -+ "\106\uffa1\107\uffa1\110\uffa1\111\uffa1\112\uffa1\001\002\000" + -+ "\160\004\uffb5\005\uffb5\007\uffb5\010\uffb5\011\uffb5\025\uffb5" + -+ "\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5\035" + -+ "\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042\uffb5\043\uffb5" + -+ "\044\uffb5\045\uffb5\046\uffb5\047\uffb5\050\uffb5\051\uffb5\052" + -+ "\uffb5\053\uffb5\054\uffb5\055\uffb5\056\uffb5\057\uffb5\060\uffb5" + -+ "\061\uffb5\062\uffb5\063\uffb5\064\uffb5\065\uffb5\066\uffb5\067" + -+ "\uffb5\070\uffb5\071\uffb5\072\uffb5\073\uffb5\074\uffb5\100\uffb5" + -+ "\101\uffb5\102\uffb5\103\uffb5\104\uffb5\105\uffb5\106\uffb5\107" + -+ "\uffb5\110\uffb5\111\uffb5\112\uffb5\001\002\000\160\004\uff9e" + -+ "\005\uff9e\007\uff9e\010\uff9e\011\uff9e\025\uff9e\026\uff9e\027" + -+ "\uff9e\030\uff9e\031\uff9e\032\uff9e\033\uff9e\035\uff9e\036\uff9e" + -+ "\037\uff9e\040\uff9e\041\uff9e\042\uff9e\043\uff9e\044\uff9e\045" + -+ "\uff9e\046\uff9e\047\uff9e\050\uff9e\051\uff9e\052\uff9e\053\uff9e" + -+ "\054\uff9e\055\uff9e\056\uff9e\057\uff9e\060\uff9e\061\uff9e\062" + -+ "\uff9e\063\uff9e\064\uff9e\065\uff9e\066\uff9e\067\uff9e\070\uff9e" + -+ "\071\uff9e\072\uff9e\073\uff9e\074\uff9e\100\uff9e\101\uff9e\102" + -+ "\uff9e\103\uff9e\104\uff9e\105\uff9e\106\uff9e\107\uff9e\110\uff9e" + -+ "\111\uff9e\112\uff9e\001\002\000\132\004\066\010\064\026" + -+ "\056\027\043\030\072\031\060\032\076\033\023\037\061" + -+ "\040\033\041\021\042\074\043\063\044\062\045\073\046" + -+ "\071\047\036\050\050\051\101\052\053\053\052\054\047" + -+ "\055\055\056\054\057\044\060\042\061\067\062\040\063" + -+ "\102\064\032\065\051\066\031\067\034\070\020\071\075" + -+ "\072\100\073\025\074\026\105\070\106\041\107\035\110" + -+ "\022\111\077\112\024\001\002\000\160\004\uffae\005\uffae" + -+ "\007\uffae\010\uffae\011\uffae\025\uffae\026\uffae\027\uffae\030" + -+ "\uffae\031\uffae\032\uffae\033\uffae\035\uffae\036\uffae\037\uffae" + -+ "\040\uffae\041\uffae\042\uffae\043\uffae\044\uffae\045\uffae\046" + -+ "\uffae\047\uffae\050\uffae\051\uffae\052\uffae\053\uffae\054\uffae" + -+ "\055\uffae\056\uffae\057\uffae\060\uffae\061\uffae\062\uffae\063" + -+ "\uffae\064\uffae\065\uffae\066\uffae\067\uffae\070\uffae\071\uffae" + -+ "\072\uffae\073\uffae\074\uffae\100\uffae\101\uffae\102\uffae\103" + -+ "\uffae\104\uffae\105\uffae\106\uffae\107\uffae\110\uffae\111\uffae" + -+ "\112\uffae\001\002\000\016\005\uffde\007\uffde\025\uffde\035" + -+ "\uffde\036\uffde\103\uffde\001\002\000\160\004\uffa3\005\uffa3" + -+ "\007\uffa3\010\uffa3\011\uffa3\025\uffa3\026\uffa3\027\uffa3\030" + -+ "\uffa3\031\uffa3\032\uffa3\033\uffa3\035\uffa3\036\uffa3\037\uffa3" + -+ "\040\uffa3\041\uffa3\042\uffa3\043\uffa3\044\uffa3\045\uffa3\046" + -+ "\uffa3\047\uffa3\050\uffa3\051\uffa3\052\uffa3\053\uffa3\054\uffa3" + -+ "\055\uffa3\056\uffa3\057\uffa3\060\uffa3\061\uffa3\062\uffa3\063" + -+ "\uffa3\064\uffa3\065\uffa3\066\uffa3\067\uffa3\070\uffa3\071\uffa3" + -+ "\072\uffa3\073\uffa3\074\uffa3\100\uffa3\101\uffa3\102\uffa3\103" + -+ "\uffa3\104\uffa3\105\uffa3\106\uffa3\107\uffa3\110\uffa3\111\uffa3" + -+ "\112\uffa3\001\002\000\132\004\066\010\064\026\056\027" + -+ "\043\030\072\031\060\032\076\033\023\037\061\040\033" + -+ "\041\021\042\074\043\063\044\062\045\073\046\071\047" + -+ "\036\050\050\051\101\052\053\053\052\054\047\055\055" + -+ "\056\054\057\044\060\042\061\067\062\040\063\102\064" + -+ "\032\065\051\066\031\067\034\070\020\071\075\072\100" + -+ "\073\025\074\026\105\070\106\041\107\035\110\022\111" + -+ "\077\112\024\001\002\000\160\004\uffa5\005\uffa5\007\uffa5" + -+ "\010\uffa5\011\uffa5\025\uffa5\026\uffa5\027\uffa5\030\uffa5\031" + -+ "\uffa5\032\uffa5\033\uffa5\035\uffa5\036\uffa5\037\uffa5\040\uffa5" + -+ "\041\uffa5\042\uffa5\043\uffa5\044\uffa5\045\uffa5\046\uffa5\047" + -+ "\uffa5\050\uffa5\051\uffa5\052\uffa5\053\uffa5\054\uffa5\055\uffa5" + -+ "\056\uffa5\057\uffa5\060\uffa5\061\uffa5\062\uffa5\063\uffa5\064" + -+ "\uffa5\065\uffa5\066\uffa5\067\uffa5\070\uffa5\071\uffa5\072\uffa5" + -+ "\073\uffa5\074\uffa5\100\uffa5\101\uffa5\102\uffa5\103\uffa5\104" + -+ "\uffa5\105\uffa5\106\uffa5\107\uffa5\110\uffa5\111\uffa5\112\uffa5" + -+ "\001\002\000\160\004\uffbb\005\uffbb\007\uffbb\010\uffbb\011" + -+ "\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb" + -+ "\033\uffbb\035\uffbb\036\uffbb\037\uffbb\040\uffbb\041\uffbb\042" + -+ "\uffbb\043\uffbb\044\uffbb\045\uffbb\046\uffbb\047\uffbb\050\uffbb" + -+ "\051\uffbb\052\uffbb\053\uffbb\054\uffbb\055\uffbb\056\uffbb\057" + -+ "\uffbb\060\uffbb\061\uffbb\062\uffbb\063\uffbb\064\uffbb\065\uffbb" + -+ "\066\uffbb\067\uffbb\070\uffbb\071\uffbb\072\uffbb\073\uffbb\074" + -+ "\uffbb\100\uffbb\101\uffbb\102\uffbb\103\uffbb\104\uffbb\105\uffbb" + -+ "\106\uffbb\107\uffbb\110\uffbb\111\uffbb\112\uffbb\001\002\000" + -+ "\160\004\uffa6\005\uffa6\007\uffa6\010\uffa6\011\uffa6\025\uffa6" + -+ "\026\uffa6\027\uffa6\030\uffa6\031\uffa6\032\uffa6\033\uffa6\035" + -+ "\uffa6\036\uffa6\037\uffa6\040\uffa6\041\uffa6\042\uffa6\043\uffa6" + -+ "\044\uffa6\045\uffa6\046\uffa6\047\uffa6\050\uffa6\051\uffa6\052" + -+ "\uffa6\053\uffa6\054\uffa6\055\uffa6\056\uffa6\057\uffa6\060\uffa6" + -+ "\061\uffa6\062\uffa6\063\uffa6\064\uffa6\065\uffa6\066\uffa6\067" + -+ "\uffa6\070\uffa6\071\uffa6\072\uffa6\073\uffa6\074\uffa6\100\uffa6" + -+ "\101\uffa6\102\uffa6\103\uffa6\104\uffa6\105\uffa6\106\uffa6\107" + -+ "\uffa6\110\uffa6\111\uffa6\112\uffa6\001\002\000\156\004\uffdb" + -+ "\005\uffdb\007\uffdb\010\uffdb\025\uffdb\026\uffdb\027\uffdb\030" + -+ "\uffdb\031\uffdb\032\uffdb\033\uffdb\035\uffdb\036\uffdb\037\uffdb" + -+ "\040\uffdb\041\uffdb\042\uffdb\043\uffdb\044\uffdb\045\uffdb\046" + -+ "\uffdb\047\uffdb\050\uffdb\051\uffdb\052\uffdb\053\uffdb\054\uffdb" + -+ "\055\uffdb\056\uffdb\057\uffdb\060\uffdb\061\uffdb\062\uffdb\063" + -+ "\uffdb\064\uffdb\065\uffdb\066\uffdb\067\uffdb\070\uffdb\071\uffdb" + -+ "\072\uffdb\073\uffdb\074\uffdb\100\142\101\140\102\141\103" + -+ "\uffdb\104\143\105\uffdb\106\uffdb\107\uffdb\110\uffdb\111\uffdb" + -+ "\112\uffdb\001\002\000\156\004\uffd0\005\uffd0\007\uffd0\010" + -+ "\uffd0\025\uffd0\026\uffd0\027\uffd0\030\uffd0\031\uffd0\032\uffd0" + -+ "\033\uffd0\035\uffd0\036\uffd0\037\uffd0\040\uffd0\041\uffd0\042" + -+ "\uffd0\043\uffd0\044\uffd0\045\uffd0\046\uffd0\047\uffd0\050\uffd0" + -+ "\051\uffd0\052\uffd0\053\uffd0\054\uffd0\055\uffd0\056\uffd0\057" + -+ "\uffd0\060\uffd0\061\uffd0\062\uffd0\063\uffd0\064\uffd0\065\uffd0" + -+ "\066\uffd0\067\uffd0\070\uffd0\071\uffd0\072\uffd0\073\uffd0\074" + -+ "\uffd0\100\uffd0\101\uffd0\102\uffd0\103\uffd0\104\uffd0\105\uffd0" + -+ "\106\uffd0\107\uffd0\110\uffd0\111\uffd0\112\uffd0\001\002\000" + -+ "\160\004\uffa9\005\uffa9\007\uffa9\010\uffa9\011\uffa9\025\uffa9" + -+ "\026\uffa9\027\uffa9\030\uffa9\031\uffa9\032\uffa9\033\uffa9\035" + -+ "\uffa9\036\uffa9\037\uffa9\040\uffa9\041\uffa9\042\uffa9\043\uffa9" + -+ "\044\uffa9\045\uffa9\046\uffa9\047\uffa9\050\uffa9\051\uffa9\052" + -+ "\uffa9\053\uffa9\054\uffa9\055\uffa9\056\uffa9\057\uffa9\060\uffa9" + -+ "\061\uffa9\062\uffa9\063\uffa9\064\uffa9\065\uffa9\066\uffa9\067" + -+ "\uffa9\070\uffa9\071\uffa9\072\uffa9\073\uffa9\074\uffa9\100\uffa9" + -+ "\101\uffa9\102\uffa9\103\uffa9\104\uffa9\105\uffa9\106\uffa9\107" + -+ "\uffa9\110\uffa9\111\uffa9\112\uffa9\001\002\000\160\004\uffad" + -+ "\005\uffad\007\uffad\010\uffad\011\uffad\025\uffad\026\uffad\027" + -+ "\uffad\030\uffad\031\uffad\032\uffad\033\uffad\035\uffad\036\uffad" + -+ "\037\uffad\040\uffad\041\uffad\042\uffad\043\uffad\044\uffad\045" + -+ "\uffad\046\uffad\047\uffad\050\uffad\051\uffad\052\uffad\053\uffad" + -+ "\054\uffad\055\uffad\056\uffad\057\uffad\060\uffad\061\uffad\062" + -+ "\uffad\063\uffad\064\uffad\065\uffad\066\uffad\067\uffad\070\uffad" + -+ "\071\uffad\072\uffad\073\uffad\074\uffad\100\uffad\101\uffad\102" + -+ "\uffad\103\uffad\104\uffad\105\uffad\106\uffad\107\uffad\110\uffad" + -+ "\111\uffad\112\uffad\001\002\000\160\004\uffa0\005\uffa0\007" + -+ "\uffa0\010\uffa0\011\uffa0\025\uffa0\026\uffa0\027\uffa0\030\uffa0" + -+ "\031\uffa0\032\uffa0\033\uffa0\035\uffa0\036\uffa0\037\uffa0\040" + -+ "\uffa0\041\uffa0\042\uffa0\043\uffa0\044\uffa0\045\uffa0\046\uffa0" + -+ "\047\uffa0\050\uffa0\051\uffa0\052\uffa0\053\uffa0\054\uffa0\055" + -+ "\uffa0\056\uffa0\057\uffa0\060\uffa0\061\uffa0\062\uffa0\063\uffa0" + -+ "\064\uffa0\065\uffa0\066\uffa0\067\uffa0\070\uffa0\071\uffa0\072" + -+ "\uffa0\073\uffa0\074\uffa0\100\uffa0\101\uffa0\102\uffa0\103\uffa0" + -+ "\104\uffa0\105\uffa0\106\uffa0\107\uffa0\110\uffa0\111\uffa0\112" + -+ "\uffa0\001\002\000\160\004\uffaa\005\uffaa\007\uffaa\010\uffaa" + -+ "\011\uffaa\025\uffaa\026\uffaa\027\uffaa\030\uffaa\031\uffaa\032" + -+ "\uffaa\033\uffaa\035\uffaa\036\uffaa\037\uffaa\040\uffaa\041\uffaa" + -+ "\042\uffaa\043\uffaa\044\uffaa\045\uffaa\046\uffaa\047\uffaa\050" + -+ "\uffaa\051\uffaa\052\uffaa\053\uffaa\054\uffaa\055\uffaa\056\uffaa" + -+ "\057\uffaa\060\uffaa\061\uffaa\062\uffaa\063\uffaa\064\uffaa\065" + -+ "\uffaa\066\uffaa\067\uffaa\070\uffaa\071\uffaa\072\uffaa\073\uffaa" + -+ "\074\uffaa\100\uffaa\101\uffaa\102\uffaa\103\uffaa\104\uffaa\105" + -+ "\uffaa\106\uffaa\107\uffaa\110\uffaa\111\uffaa\112\uffaa\001\002" + -+ "\000\160\004\uffab\005\uffab\007\uffab\010\uffab\011\uffab\025" + -+ "\uffab\026\uffab\027\uffab\030\uffab\031\uffab\032\uffab\033\uffab" + -+ "\035\uffab\036\uffab\037\uffab\040\uffab\041\uffab\042\uffab\043" + -+ "\uffab\044\uffab\045\uffab\046\uffab\047\uffab\050\uffab\051\uffab" + -+ "\052\uffab\053\uffab\054\uffab\055\uffab\056\uffab\057\uffab\060" + -+ "\uffab\061\uffab\062\uffab\063\uffab\064\uffab\065\uffab\066\uffab" + -+ "\067\uffab\070\uffab\071\uffab\072\uffab\073\uffab\074\uffab\100" + -+ "\uffab\101\uffab\102\uffab\103\uffab\104\uffab\105\uffab\106\uffab" + -+ "\107\uffab\110\uffab\111\uffab\112\uffab\001\002\000\160\004" + -+ "\uffa7\005\uffa7\007\uffa7\010\uffa7\011\uffa7\025\uffa7\026\uffa7" + -+ "\027\uffa7\030\uffa7\031\uffa7\032\uffa7\033\uffa7\035\uffa7\036" + -+ "\uffa7\037\uffa7\040\uffa7\041\uffa7\042\uffa7\043\uffa7\044\uffa7" + -+ "\045\uffa7\046\uffa7\047\uffa7\050\uffa7\051\uffa7\052\uffa7\053" + -+ "\uffa7\054\uffa7\055\uffa7\056\uffa7\057\uffa7\060\uffa7\061\uffa7" + -+ "\062\uffa7\063\uffa7\064\uffa7\065\uffa7\066\uffa7\067\uffa7\070" + -+ "\uffa7\071\uffa7\072\uffa7\073\uffa7\074\uffa7\100\uffa7\101\uffa7" + -+ "\102\uffa7\103\uffa7\104\uffa7\105\uffa7\106\uffa7\107\uffa7\110" + -+ "\uffa7\111\uffa7\112\uffa7\001\002\000\160\004\uffa8\005\uffa8" + -+ "\007\uffa8\010\uffa8\011\uffa8\025\uffa8\026\uffa8\027\uffa8\030" + -+ "\uffa8\031\uffa8\032\uffa8\033\uffa8\035\uffa8\036\uffa8\037\uffa8" + -+ "\040\uffa8\041\uffa8\042\uffa8\043\uffa8\044\uffa8\045\uffa8\046" + -+ "\uffa8\047\uffa8\050\uffa8\051\uffa8\052\uffa8\053\uffa8\054\uffa8" + -+ "\055\uffa8\056\uffa8\057\uffa8\060\uffa8\061\uffa8\062\uffa8\063" + -+ "\uffa8\064\uffa8\065\uffa8\066\uffa8\067\uffa8\070\uffa8\071\uffa8" + -+ "\072\uffa8\073\uffa8\074\uffa8\100\uffa8\101\uffa8\102\uffa8\103" + -+ "\uffa8\104\uffa8\105\uffa8\106\uffa8\107\uffa8\110\uffa8\111\uffa8" + -+ "\112\uffa8\001\002\000\160\004\uffbc\005\uffbc\007\uffbc\010" + -+ "\uffbc\011\uffbc\025\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc" + -+ "\032\uffbc\033\uffbc\035\uffbc\036\uffbc\037\uffbc\040\uffbc\041" + -+ "\uffbc\042\uffbc\043\uffbc\044\uffbc\045\uffbc\046\uffbc\047\uffbc" + -+ "\050\uffbc\051\uffbc\052\uffbc\053\uffbc\054\uffbc\055\uffbc\056" + -+ "\uffbc\057\uffbc\060\uffbc\061\uffbc\062\uffbc\063\uffbc\064\uffbc" + -+ "\065\uffbc\066\uffbc\067\uffbc\070\uffbc\071\uffbc\072\uffbc\073" + -+ "\uffbc\074\uffbc\100\uffbc\101\uffbc\102\uffbc\103\uffbc\104\uffbc" + -+ "\105\uffbc\106\uffbc\107\uffbc\110\uffbc\111\uffbc\112\uffbc\001" + -+ "\002\000\156\004\uffd1\005\uffd1\007\uffd1\010\uffd1\025\uffd1" + -+ "\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1\035" + -+ "\uffd1\036\uffd1\037\uffd1\040\uffd1\041\uffd1\042\uffd1\043\uffd1" + -+ "\044\uffd1\045\uffd1\046\uffd1\047\uffd1\050\uffd1\051\uffd1\052" + -+ "\uffd1\053\uffd1\054\uffd1\055\uffd1\056\uffd1\057\uffd1\060\uffd1" + -+ "\061\uffd1\062\uffd1\063\uffd1\064\uffd1\065\uffd1\066\uffd1\067" + -+ "\uffd1\070\uffd1\071\uffd1\072\uffd1\073\uffd1\074\uffd1\100\uffd1" + -+ "\101\uffd1\102\uffd1\103\uffd1\104\uffd1\105\uffd1\106\uffd1\107" + -+ "\uffd1\110\uffd1\111\uffd1\112\uffd1\001\002\000\160\004\uffb9" + -+ "\005\uffb9\007\uffb9\010\uffb9\011\uffb9\025\uffb9\026\uffb9\027" + -+ "\uffb9\030\uffb9\031\uffb9\032\uffb9\033\uffb9\035\uffb9\036\uffb9" + -+ "\037\uffb9\040\uffb9\041\uffb9\042\uffb9\043\uffb9\044\uffb9\045" + -+ "\uffb9\046\uffb9\047\uffb9\050\uffb9\051\uffb9\052\uffb9\053\uffb9" + -+ "\054\uffb9\055\uffb9\056\uffb9\057\uffb9\060\uffb9\061\uffb9\062" + -+ "\uffb9\063\uffb9\064\uffb9\065\uffb9\066\uffb9\067\uffb9\070\uffb9" + -+ "\071\uffb9\072\uffb9\073\uffb9\074\uffb9\100\uffb9\101\uffb9\102" + -+ "\uffb9\103\uffb9\104\uffb9\105\uffb9\106\uffb9\107\uffb9\110\uffb9" + -+ "\111\uffb9\112\uffb9\001\002\000\160\004\uffb6\005\uffb6\007" + -+ "\uffb6\010\uffb6\011\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6" + -+ "\031\uffb6\032\uffb6\033\uffb6\035\uffb6\036\uffb6\037\uffb6\040" + -+ "\uffb6\041\uffb6\042\uffb6\043\uffb6\044\uffb6\045\uffb6\046\uffb6" + -+ "\047\uffb6\050\uffb6\051\uffb6\052\uffb6\053\uffb6\054\uffb6\055" + -+ "\uffb6\056\uffb6\057\uffb6\060\uffb6\061\uffb6\062\uffb6\063\uffb6" + -+ "\064\uffb6\065\uffb6\066\uffb6\067\uffb6\070\uffb6\071\uffb6\072" + -+ "\uffb6\073\uffb6\074\uffb6\100\uffb6\101\uffb6\102\uffb6\103\uffb6" + -+ "\104\uffb6\105\uffb6\106\uffb6\107\uffb6\110\uffb6\111\uffb6\112" + -+ "\uffb6\001\002\000\160\004\uffb1\005\uffb1\007\uffb1\010\uffb1" + -+ "\011\uffb1\025\uffb1\026\uffb1\027\uffb1\030\uffb1\031\uffb1\032" + -+ "\uffb1\033\uffb1\035\uffb1\036\uffb1\037\uffb1\040\uffb1\041\uffb1" + -+ "\042\uffb1\043\uffb1\044\uffb1\045\uffb1\046\uffb1\047\uffb1\050" + -+ "\uffb1\051\uffb1\052\uffb1\053\uffb1\054\uffb1\055\uffb1\056\uffb1" + -+ "\057\uffb1\060\uffb1\061\uffb1\062\uffb1\063\uffb1\064\uffb1\065" + -+ "\uffb1\066\uffb1\067\uffb1\070\uffb1\071\uffb1\072\uffb1\073\uffb1" + -+ "\074\uffb1\100\uffb1\101\uffb1\102\uffb1\103\uffb1\104\uffb1\105" + -+ "\uffb1\106\uffb1\107\uffb1\110\uffb1\111\uffb1\112\uffb1\001\002" + -+ "\000\160\004\uffb2\005\uffb2\007\uffb2\010\uffb2\011\uffb2\025" + -+ "\uffb2\026\uffb2\027\uffb2\030\uffb2\031\uffb2\032\uffb2\033\uffb2" + -+ "\035\uffb2\036\uffb2\037\uffb2\040\uffb2\041\uffb2\042\uffb2\043" + -+ "\uffb2\044\uffb2\045\uffb2\046\uffb2\047\uffb2\050\uffb2\051\uffb2" + -+ "\052\uffb2\053\uffb2\054\uffb2\055\uffb2\056\uffb2\057\uffb2\060" + -+ "\uffb2\061\uffb2\062\uffb2\063\uffb2\064\uffb2\065\uffb2\066\uffb2" + -+ "\067\uffb2\070\uffb2\071\uffb2\072\uffb2\073\uffb2\074\uffb2\100" + -+ "\uffb2\101\uffb2\102\uffb2\103\uffb2\104\uffb2\105\uffb2\106\uffb2" + -+ "\107\uffb2\110\uffb2\111\uffb2\112\uffb2\001\002\000\126\006" + -+ "\114\011\115\012\113\026\056\027\043\030\072\031\060" + -+ "\032\076\033\023\037\061\040\033\041\021\042\074\043" + -+ "\063\044\062\045\073\046\071\047\036\050\050\051\101" + -+ "\052\053\053\052\054\047\055\055\056\054\057\044\060" + -+ "\042\061\067\062\040\063\102\064\032\065\051\066\031" + -+ "\067\034\070\020\071\075\072\100\073\025\074\026\110" + -+ "\110\111\116\112\111\001\002\000\146\004\uffdc\005\uffdc" + -+ "\007\uffdc\010\uffdc\025\uffdc\026\uffdc\027\uffdc\030\uffdc\031" + -+ "\uffdc\032\uffdc\033\uffdc\035\uffdc\036\uffdc\037\uffdc\040\uffdc" + -+ "\041\uffdc\042\uffdc\043\uffdc\044\uffdc\045\uffdc\046\uffdc\047" + -+ "\uffdc\050\uffdc\051\uffdc\052\uffdc\053\uffdc\054\uffdc\055\uffdc" + -+ "\056\uffdc\057\uffdc\060\uffdc\061\uffdc\062\uffdc\063\uffdc\064" + -+ "\uffdc\065\uffdc\066\uffdc\067\uffdc\070\uffdc\071\uffdc\072\uffdc" + -+ "\073\uffdc\074\uffdc\103\uffdc\105\uffdc\106\uffdc\107\uffdc\110" + -+ "\uffdc\111\uffdc\112\uffdc\001\002\000\134\004\066\010\064" + -+ "\026\056\027\043\030\072\031\060\032\076\033\023\037" + -+ "\061\040\033\041\021\042\074\043\063\044\062\045\073" + -+ "\046\071\047\036\050\050\051\101\052\053\053\052\054" + -+ "\047\055\055\056\054\057\044\060\042\061\067\062\040" + -+ "\063\102\064\032\065\051\066\031\067\034\070\020\071" + -+ "\075\072\100\073\025\074\026\103\037\105\070\106\041" + -+ "\107\035\110\022\111\077\112\024\001\002\000\160\004" + -+ "\uffa4\005\uffa4\007\uffa4\010\uffa4\011\uffa4\025\uffa4\026\uffa4" + -+ "\027\uffa4\030\uffa4\031\uffa4\032\uffa4\033\uffa4\035\uffa4\036" + -+ "\uffa4\037\uffa4\040\uffa4\041\uffa4\042\uffa4\043\uffa4\044\uffa4" + -+ "\045\uffa4\046\uffa4\047\uffa4\050\uffa4\051\uffa4\052\uffa4\053" + -+ "\uffa4\054\uffa4\055\uffa4\056\uffa4\057\uffa4\060\uffa4\061\uffa4" + -+ "\062\uffa4\063\uffa4\064\uffa4\065\uffa4\066\uffa4\067\uffa4\070" + -+ "\uffa4\071\uffa4\072\uffa4\073\uffa4\074\uffa4\100\uffa4\101\uffa4" + -+ "\102\uffa4\103\uffa4\104\uffa4\105\uffa4\106\uffa4\107\uffa4\110" + -+ "\uffa4\111\uffa4\112\uffa4\001\002\000\156\004\uffce\005\uffce" + -+ "\007\uffce\010\uffce\025\uffce\026\uffce\027\uffce\030\uffce\031" + -+ "\uffce\032\uffce\033\uffce\035\uffce\036\uffce\037\uffce\040\uffce" + -+ "\041\uffce\042\uffce\043\uffce\044\uffce\045\uffce\046\uffce\047" + -+ "\uffce\050\uffce\051\uffce\052\uffce\053\uffce\054\uffce\055\uffce" + -+ "\056\uffce\057\uffce\060\uffce\061\uffce\062\uffce\063\uffce\064" + -+ "\uffce\065\uffce\066\uffce\067\uffce\070\uffce\071\uffce\072\uffce" + -+ "\073\uffce\074\uffce\100\uffce\101\uffce\102\uffce\103\uffce\104" + -+ "\uffce\105\uffce\106\uffce\107\uffce\110\uffce\111\uffce\112\uffce" + -+ "\001\002\000\160\004\uffaf\005\uffaf\007\uffaf\010\uffaf\011" + -+ "\uffaf\025\uffaf\026\uffaf\027\uffaf\030\uffaf\031\uffaf\032\uffaf" + -+ "\033\uffaf\035\uffaf\036\uffaf\037\uffaf\040\uffaf\041\uffaf\042" + -+ "\uffaf\043\uffaf\044\uffaf\045\uffaf\046\uffaf\047\uffaf\050\uffaf" + -+ "\051\uffaf\052\uffaf\053\uffaf\054\uffaf\055\uffaf\056\uffaf\057" + -+ "\uffaf\060\uffaf\061\uffaf\062\uffaf\063\uffaf\064\uffaf\065\uffaf" + -+ "\066\uffaf\067\uffaf\070\uffaf\071\uffaf\072\uffaf\073\uffaf\074" + -+ "\uffaf\100\uffaf\101\uffaf\102\uffaf\103\uffaf\104\uffaf\105\uffaf" + -+ "\106\uffaf\107\uffaf\110\uffaf\111\uffaf\112\uffaf\001\002\000" + -+ "\160\004\uffba\005\uffba\007\uffba\010\uffba\011\uffba\025\uffba" + -+ "\026\uffba\027\uffba\030\uffba\031\uffba\032\uffba\033\uffba\035" + -+ "\uffba\036\uffba\037\uffba\040\uffba\041\uffba\042\uffba\043\uffba" + -+ "\044\uffba\045\uffba\046\uffba\047\uffba\050\uffba\051\uffba\052" + -+ "\uffba\053\uffba\054\uffba\055\uffba\056\uffba\057\uffba\060\uffba" + -+ "\061\uffba\062\uffba\063\uffba\064\uffba\065\uffba\066\uffba\067" + -+ "\uffba\070\uffba\071\uffba\072\uffba\073\uffba\074\uffba\100\uffba" + -+ "\101\uffba\102\uffba\103\uffba\104\uffba\105\uffba\106\uffba\107" + -+ "\uffba\110\uffba\111\uffba\112\uffba\001\002\000\160\004\uffb0" + -+ "\005\uffb0\007\uffb0\010\uffb0\011\uffb0\025\uffb0\026\uffb0\027" + -+ "\uffb0\030\uffb0\031\uffb0\032\uffb0\033\uffb0\035\uffb0\036\uffb0" + -+ "\037\uffb0\040\uffb0\041\uffb0\042\uffb0\043\uffb0\044\uffb0\045" + -+ "\uffb0\046\uffb0\047\uffb0\050\uffb0\051\uffb0\052\uffb0\053\uffb0" + -+ "\054\uffb0\055\uffb0\056\uffb0\057\uffb0\060\uffb0\061\uffb0\062" + -+ "\uffb0\063\uffb0\064\uffb0\065\uffb0\066\uffb0\067\uffb0\070\uffb0" + -+ "\071\uffb0\072\uffb0\073\uffb0\074\uffb0\100\uffb0\101\uffb0\102" + -+ "\uffb0\103\uffb0\104\uffb0\105\uffb0\106\uffb0\107\uffb0\110\uffb0" + -+ "\111\uffb0\112\uffb0\001\002\000\160\004\uffb3\005\uffb3\007" + -+ "\uffb3\010\uffb3\011\uffb3\025\uffb3\026\uffb3\027\uffb3\030\uffb3" + -+ "\031\uffb3\032\uffb3\033\uffb3\035\uffb3\036\uffb3\037\uffb3\040" + -+ "\uffb3\041\uffb3\042\uffb3\043\uffb3\044\uffb3\045\uffb3\046\uffb3" + -+ "\047\uffb3\050\uffb3\051\uffb3\052\uffb3\053\uffb3\054\uffb3\055" + -+ "\uffb3\056\uffb3\057\uffb3\060\uffb3\061\uffb3\062\uffb3\063\uffb3" + -+ "\064\uffb3\065\uffb3\066\uffb3\067\uffb3\070\uffb3\071\uffb3\072" + -+ "\uffb3\073\uffb3\074\uffb3\100\uffb3\101\uffb3\102\uffb3\103\uffb3" + -+ "\104\uffb3\105\uffb3\106\uffb3\107\uffb3\110\uffb3\111\uffb3\112" + -+ "\uffb3\001\002\000\160\004\uff9c\005\uff9c\007\uff9c\010\uff9c" + -+ "\011\uff9c\025\uff9c\026\uff9c\027\uff9c\030\uff9c\031\uff9c\032" + -+ "\uff9c\033\uff9c\035\uff9c\036\uff9c\037\uff9c\040\uff9c\041\uff9c" + -+ "\042\uff9c\043\uff9c\044\uff9c\045\uff9c\046\uff9c\047\uff9c\050" + -+ "\uff9c\051\uff9c\052\uff9c\053\uff9c\054\uff9c\055\uff9c\056\uff9c" + -+ "\057\uff9c\060\uff9c\061\uff9c\062\uff9c\063\uff9c\064\uff9c\065" + -+ "\uff9c\066\uff9c\067\uff9c\070\uff9c\071\uff9c\072\uff9c\073\uff9c" + -+ "\074\uff9c\100\uff9c\101\uff9c\102\uff9c\103\uff9c\104\uff9c\105" + -+ "\uff9c\106\uff9c\107\uff9c\110\uff9c\111\uff9c\112\uff9c\001\002" + -+ "\000\160\004\uffb8\005\uffb8\007\uffb8\010\uffb8\011\uffb8\025" + -+ "\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8\033\uffb8" + -+ "\035\uffb8\036\uffb8\037\uffb8\040\uffb8\041\uffb8\042\uffb8\043" + -+ "\uffb8\044\uffb8\045\uffb8\046\uffb8\047\uffb8\050\uffb8\051\uffb8" + -+ "\052\uffb8\053\uffb8\054\uffb8\055\uffb8\056\uffb8\057\uffb8\060" + -+ "\uffb8\061\uffb8\062\uffb8\063\uffb8\064\uffb8\065\uffb8\066\uffb8" + -+ "\067\uffb8\070\uffb8\071\uffb8\072\uffb8\073\uffb8\074\uffb8\100" + -+ "\uffb8\101\uffb8\102\uffb8\103\uffb8\104\uffb8\105\uffb8\106\uffb8" + -+ "\107\uffb8\110\uffb8\111\uffb8\112\uffb8\001\002\000\156\004" + -+ "\uffcf\005\uffcf\007\uffcf\010\uffcf\025\uffcf\026\uffcf\027\uffcf" + -+ "\030\uffcf\031\uffcf\032\uffcf\033\uffcf\035\uffcf\036\uffcf\037" + -+ "\uffcf\040\uffcf\041\uffcf\042\uffcf\043\uffcf\044\uffcf\045\uffcf" + -+ "\046\uffcf\047\uffcf\050\uffcf\051\uffcf\052\uffcf\053\uffcf\054" + -+ "\uffcf\055\uffcf\056\uffcf\057\uffcf\060\uffcf\061\uffcf\062\uffcf" + -+ "\063\uffcf\064\uffcf\065\uffcf\066\uffcf\067\uffcf\070\uffcf\071" + -+ "\uffcf\072\uffcf\073\uffcf\074\uffcf\100\uffcf\101\uffcf\102\uffcf" + -+ "\103\uffcf\104\uffcf\105\uffcf\106\uffcf\107\uffcf\110\uffcf\111" + -+ "\uffcf\112\uffcf\001\002\000\160\004\uff9b\005\uff9b\007\uff9b" + -+ "\010\uff9b\011\uff9b\025\uff9b\026\uff9b\027\uff9b\030\uff9b\031" + -+ "\uff9b\032\uff9b\033\uff9b\035\uff9b\036\uff9b\037\uff9b\040\uff9b" + -+ "\041\uff9b\042\uff9b\043\uff9b\044\uff9b\045\uff9b\046\uff9b\047" + -+ "\uff9b\050\uff9b\051\uff9b\052\uff9b\053\uff9b\054\uff9b\055\uff9b" + -+ "\056\uff9b\057\uff9b\060\uff9b\061\uff9b\062\uff9b\063\uff9b\064" + -+ "\uff9b\065\uff9b\066\uff9b\067\uff9b\070\uff9b\071\uff9b\072\uff9b" + -+ "\073\uff9b\074\uff9b\100\uff9b\101\uff9b\102\uff9b\103\uff9b\104" + -+ "\uff9b\105\uff9b\106\uff9b\107\uff9b\110\uff9b\111\uff9b\112\uff9b" + -+ "\001\002\000\160\004\uffac\005\uffac\007\uffac\010\uffac\011" + -+ "\uffac\025\uffac\026\uffac\027\uffac\030\uffac\031\uffac\032\uffac" + -+ "\033\uffac\035\uffac\036\uffac\037\uffac\040\uffac\041\uffac\042" + -+ "\uffac\043\uffac\044\uffac\045\uffac\046\uffac\047\uffac\050\uffac" + -+ "\051\uffac\052\uffac\053\uffac\054\uffac\055\uffac\056\uffac\057" + -+ "\uffac\060\uffac\061\uffac\062\uffac\063\uffac\064\uffac\065\uffac" + -+ "\066\uffac\067\uffac\070\uffac\071\uffac\072\uffac\073\uffac\074" + -+ "\uffac\100\uffac\101\uffac\102\uffac\103\uffac\104\uffac\105\uffac" + -+ "\106\uffac\107\uffac\110\uffac\111\uffac\112\uffac\001\002\000" + -+ "\160\004\uffa2\005\uffa2\007\uffa2\010\uffa2\011\uffa2\025\uffa2" + -+ "\026\uffa2\027\uffa2\030\uffa2\031\uffa2\032\uffa2\033\uffa2\035" + -+ "\uffa2\036\uffa2\037\uffa2\040\uffa2\041\uffa2\042\uffa2\043\uffa2" + -+ "\044\uffa2\045\uffa2\046\uffa2\047\uffa2\050\uffa2\051\uffa2\052" + -+ "\uffa2\053\uffa2\054\uffa2\055\uffa2\056\uffa2\057\uffa2\060\uffa2" + -+ "\061\uffa2\062\uffa2\063\uffa2\064\uffa2\065\uffa2\066\uffa2\067" + -+ "\uffa2\070\uffa2\071\uffa2\072\uffa2\073\uffa2\074\uffa2\100\uffa2" + -+ "\101\uffa2\102\uffa2\103\uffa2\104\uffa2\105\uffa2\106\uffa2\107" + -+ "\uffa2\110\uffa2\111\uffa2\112\uffa2\001\002\000\006\005\105" + -+ "\103\104\001\002\000\132\004\066\010\064\026\056\027" + -+ "\043\030\072\031\060\032\076\033\023\037\061\040\033" + -+ "\041\021\042\074\043\063\044\062\045\073\046\071\047" + -+ "\036\050\050\051\101\052\053\053\052\054\047\055\055" + -+ "\056\054\057\044\060\042\061\067\062\040\063\102\064" + -+ "\032\065\051\066\031\067\034\070\020\071\075\072\100" + -+ "\073\025\074\026\105\070\106\041\107\035\110\022\111" + -+ "\077\112\024\001\002\000\156\004\uffd3\005\uffd3\007\uffd3" + -+ "\010\uffd3\025\uffd3\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032" + -+ "\uffd3\033\uffd3\035\uffd3\036\uffd3\037\uffd3\040\uffd3\041\uffd3" + -+ "\042\uffd3\043\uffd3\044\uffd3\045\uffd3\046\uffd3\047\uffd3\050" + -+ "\uffd3\051\uffd3\052\uffd3\053\uffd3\054\uffd3\055\uffd3\056\uffd3" + -+ "\057\uffd3\060\uffd3\061\uffd3\062\uffd3\063\uffd3\064\uffd3\065" + -+ "\uffd3\066\uffd3\067\uffd3\070\uffd3\071\uffd3\072\uffd3\073\uffd3" + -+ "\074\uffd3\100\uffd3\101\uffd3\102\uffd3\103\uffd3\104\uffd3\105" + -+ "\uffd3\106\uffd3\107\uffd3\110\uffd3\111\uffd3\112\uffd3\001\002" + -+ "\000\146\004\066\005\uffe0\007\uffe0\010\064\025\uffe0\026" + -+ "\056\027\043\030\072\031\060\032\076\033\023\035\uffe0" + -+ "\036\uffe0\037\061\040\033\041\021\042\074\043\063\044" + -+ "\062\045\073\046\071\047\036\050\050\051\101\052\053" + -+ "\053\052\054\047\055\055\056\054\057\044\060\042\061" + -+ "\067\062\040\063\102\064\032\065\051\066\031\067\034" + -+ "\070\020\071\075\072\100\073\025\074\026\103\uffe0\105" + -+ "\070\106\041\107\035\110\022\111\077\112\024\001\002" + -+ "\000\146\004\uffdd\005\uffdd\007\uffdd\010\uffdd\025\uffdd\026" + -+ "\uffdd\027\uffdd\030\uffdd\031\uffdd\032\uffdd\033\uffdd\035\uffdd" + -+ "\036\uffdd\037\uffdd\040\uffdd\041\uffdd\042\uffdd\043\uffdd\044" + -+ "\uffdd\045\uffdd\046\uffdd\047\uffdd\050\uffdd\051\uffdd\052\uffdd" + -+ "\053\uffdd\054\uffdd\055\uffdd\056\uffdd\057\uffdd\060\uffdd\061" + -+ "\uffdd\062\uffdd\063\uffdd\064\uffdd\065\uffdd\066\uffdd\067\uffdd" + -+ "\070\uffdd\071\uffdd\072\uffdd\073\uffdd\074\uffdd\103\uffdd\105" + -+ "\uffdd\106\uffdd\107\uffdd\110\uffdd\111\uffdd\112\uffdd\001\002" + -+ "\000\124\011\uffbd\012\136\026\uffbd\027\uffbd\030\uffbd\031" + -+ "\uffbd\032\uffbd\033\uffbd\037\uffbd\040\uffbd\041\uffbd\042\uffbd" + -+ "\043\uffbd\044\uffbd\045\uffbd\046\uffbd\047\uffbd\050\uffbd\051" + -+ "\uffbd\052\uffbd\053\uffbd\054\uffbd\055\uffbd\056\uffbd\057\uffbd" + -+ "\060\uffbd\061\uffbd\062\uffbd\063\uffbd\064\uffbd\065\uffbd\066" + -+ "\uffbd\067\uffbd\070\uffbd\071\uffbd\072\uffbd\073\uffbd\074\uffbd" + -+ "\110\uffbd\111\uffbd\112\uffbd\001\002\000\122\011\uffbf\026" + -+ "\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\037\uffbf" + -+ "\040\uffbf\041\uffbf\042\uffbf\043\uffbf\044\uffbf\045\uffbf\046" + -+ "\uffbf\047\uffbf\050\uffbf\051\uffbf\052\uffbf\053\uffbf\054\uffbf" + -+ "\055\uffbf\056\uffbf\057\uffbf\060\uffbf\061\uffbf\062\uffbf\063" + -+ "\uffbf\064\uffbf\065\uffbf\066\uffbf\067\uffbf\070\uffbf\071\uffbf" + -+ "\072\uffbf\073\uffbf\074\uffbf\110\uffbf\111\uffbf\112\uffbf\001" + -+ "\002\000\122\011\uffc3\026\uffc3\027\uffc3\030\uffc3\031\uffc3" + -+ "\032\uffc3\033\uffc3\037\uffc3\040\uffc3\041\uffc3\042\uffc3\043" + -+ "\uffc3\044\uffc3\045\uffc3\046\uffc3\047\uffc3\050\uffc3\051\uffc3" + -+ "\052\uffc3\053\uffc3\054\uffc3\055\uffc3\056\uffc3\057\uffc3\060" + -+ "\uffc3\061\uffc3\062\uffc3\063\uffc3\064\uffc3\065\uffc3\066\uffc3" + -+ "\067\uffc3\070\uffc3\071\uffc3\072\uffc3\073\uffc3\074\uffc3\110" + -+ "\uffc3\111\uffc3\112\uffc3\001\002\000\120\026\056\027\043" + -+ "\030\072\031\060\032\076\033\023\037\061\040\033\041" + -+ "\021\042\074\043\063\044\062\045\073\046\071\047\036" + -+ "\050\050\051\101\052\053\053\052\054\047\055\055\056" + -+ "\054\057\044\060\042\061\067\062\040\063\102\064\032" + -+ "\065\051\066\031\067\034\070\020\071\075\072\100\073" + -+ "\025\074\026\110\110\111\116\112\111\001\002\000\124" + -+ "\011\127\012\126\026\056\027\043\030\072\031\060\032" + -+ "\076\033\023\037\061\040\033\041\021\042\074\043\063" + -+ "\044\062\045\073\046\071\047\036\050\050\051\101\052" + -+ "\053\053\052\054\047\055\055\056\054\057\044\060\042" + -+ "\061\067\062\040\063\102\064\032\065\051\066\031\067" + -+ "\034\070\020\071\075\072\100\073\025\074\026\110\110" + -+ "\111\116\112\111\001\002\000\156\004\uffcc\005\uffcc\007" + -+ "\uffcc\010\uffcc\025\uffcc\026\uffcc\027\uffcc\030\uffcc\031\uffcc" + -+ "\032\uffcc\033\uffcc\035\uffcc\036\uffcc\037\uffcc\040\uffcc\041" + -+ "\uffcc\042\uffcc\043\uffcc\044\uffcc\045\uffcc\046\uffcc\047\uffcc" + -+ "\050\uffcc\051\uffcc\052\uffcc\053\uffcc\054\uffcc\055\uffcc\056" + -+ "\uffcc\057\uffcc\060\uffcc\061\uffcc\062\uffcc\063\uffcc\064\uffcc" + -+ "\065\uffcc\066\uffcc\067\uffcc\070\uffcc\071\uffcc\072\uffcc\073" + -+ "\uffcc\074\uffcc\100\uffcc\101\uffcc\102\uffcc\103\uffcc\104\uffcc" + -+ "\105\uffcc\106\uffcc\107\uffcc\110\uffcc\111\uffcc\112\uffcc\001" + -+ "\002\000\122\011\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1" + -+ "\032\uffc1\033\uffc1\037\uffc1\040\uffc1\041\uffc1\042\uffc1\043" + -+ "\uffc1\044\uffc1\045\uffc1\046\uffc1\047\uffc1\050\uffc1\051\uffc1" + -+ "\052\uffc1\053\uffc1\054\uffc1\055\uffc1\056\uffc1\057\uffc1\060" + -+ "\uffc1\061\uffc1\062\uffc1\063\uffc1\064\uffc1\065\uffc1\066\uffc1" + -+ "\067\uffc1\070\uffc1\071\uffc1\072\uffc1\073\uffc1\074\uffc1\110" + -+ "\uffc1\111\uffc1\112\uffc1\001\002\000\122\011\uffc5\026\uffc5" + -+ "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\037\uffc5\040" + -+ "\uffc5\041\uffc5\042\uffc5\043\uffc5\044\uffc5\045\uffc5\046\uffc5" + -+ "\047\uffc5\050\uffc5\051\uffc5\052\uffc5\053\uffc5\054\uffc5\055" + -+ "\uffc5\056\uffc5\057\uffc5\060\uffc5\061\uffc5\062\uffc5\063\uffc5" + -+ "\064\uffc5\065\uffc5\066\uffc5\067\uffc5\070\uffc5\071\uffc5\072" + -+ "\uffc5\073\uffc5\074\uffc5\110\uffc5\111\uffc5\112\uffc5\001\002" + -+ "\000\122\011\123\026\056\027\043\030\072\031\060\032" + -+ "\076\033\023\037\061\040\033\041\021\042\074\043\063" + -+ "\044\062\045\073\046\071\047\036\050\050\051\101\052" + -+ "\053\053\052\054\047\055\055\056\054\057\044\060\042" + -+ "\061\067\062\040\063\102\064\032\065\051\066\031\067" + -+ "\034\070\020\071\075\072\100\073\025\074\026\110\110" + -+ "\111\124\112\121\001\002\000\122\011\uffc0\026\uffc0\027" + -+ "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\037\uffc0\040\uffc0" + -+ "\041\uffc0\042\uffc0\043\uffc0\044\uffc0\045\uffc0\046\uffc0\047" + -+ "\uffc0\050\uffc0\051\uffc0\052\uffc0\053\uffc0\054\uffc0\055\uffc0" + -+ "\056\uffc0\057\uffc0\060\uffc0\061\uffc0\062\uffc0\063\uffc0\064" + -+ "\uffc0\065\uffc0\066\uffc0\067\uffc0\070\uffc0\071\uffc0\072\uffc0" + -+ "\073\uffc0\074\uffc0\110\uffc0\111\uffc0\112\uffc0\001\002\000" + -+ "\122\011\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4" + -+ "\033\uffc4\037\uffc4\040\uffc4\041\uffc4\042\uffc4\043\uffc4\044" + -+ "\uffc4\045\uffc4\046\uffc4\047\uffc4\050\uffc4\051\uffc4\052\uffc4" + -+ "\053\uffc4\054\uffc4\055\uffc4\056\uffc4\057\uffc4\060\uffc4\061" + -+ "\uffc4\062\uffc4\063\uffc4\064\uffc4\065\uffc4\066\uffc4\067\uffc4" + -+ "\070\uffc4\071\uffc4\072\uffc4\073\uffc4\074\uffc4\110\uffc4\111" + -+ "\uffc4\112\uffc4\001\002\000\156\004\uffcb\005\uffcb\007\uffcb" + -+ "\010\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb\031\uffcb\032" + -+ "\uffcb\033\uffcb\035\uffcb\036\uffcb\037\uffcb\040\uffcb\041\uffcb" + -+ "\042\uffcb\043\uffcb\044\uffcb\045\uffcb\046\uffcb\047\uffcb\050" + -+ "\uffcb\051\uffcb\052\uffcb\053\uffcb\054\uffcb\055\uffcb\056\uffcb" + -+ "\057\uffcb\060\uffcb\061\uffcb\062\uffcb\063\uffcb\064\uffcb\065" + -+ "\uffcb\066\uffcb\067\uffcb\070\uffcb\071\uffcb\072\uffcb\073\uffcb" + -+ "\074\uffcb\100\uffcb\101\uffcb\102\uffcb\103\uffcb\104\uffcb\105" + -+ "\uffcb\106\uffcb\107\uffcb\110\uffcb\111\uffcb\112\uffcb\001\002" + -+ "\000\122\011\uffc2\026\uffc2\027\uffc2\030\uffc2\031\uffc2\032" + -+ "\uffc2\033\uffc2\037\uffc2\040\uffc2\041\uffc2\042\uffc2\043\uffc2" + -+ "\044\uffc2\045\uffc2\046\uffc2\047\uffc2\050\uffc2\051\uffc2\052" + -+ "\uffc2\053\uffc2\054\uffc2\055\uffc2\056\uffc2\057\uffc2\060\uffc2" + -+ "\061\uffc2\062\uffc2\063\uffc2\064\uffc2\065\uffc2\066\uffc2\067" + -+ "\uffc2\070\uffc2\071\uffc2\072\uffc2\073\uffc2\074\uffc2\110\uffc2" + -+ "\111\uffc2\112\uffc2\001\002\000\122\011\uffc6\026\uffc6\027" + -+ "\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6\037\uffc6\040\uffc6" + -+ "\041\uffc6\042\uffc6\043\uffc6\044\uffc6\045\uffc6\046\uffc6\047" + -+ "\uffc6\050\uffc6\051\uffc6\052\uffc6\053\uffc6\054\uffc6\055\uffc6" + -+ "\056\uffc6\057\uffc6\060\uffc6\061\uffc6\062\uffc6\063\uffc6\064" + -+ "\uffc6\065\uffc6\066\uffc6\067\uffc6\070\uffc6\071\uffc6\072\uffc6" + -+ "\073\uffc6\074\uffc6\110\uffc6\111\uffc6\112\uffc6\001\002\000" + -+ "\120\026\056\027\043\030\072\031\060\032\076\033\023" + -+ "\037\061\040\033\041\021\042\074\043\063\044\062\045" + -+ "\073\046\071\047\036\050\050\051\101\052\053\053\052" + -+ "\054\047\055\055\056\054\057\044\060\042\061\067\062" + -+ "\040\063\102\064\032\065\051\066\031\067\034\070\020" + -+ "\071\075\072\100\073\025\074\026\110\110\111\116\112" + -+ "\111\001\002\000\156\004\uffca\005\uffca\007\uffca\010\uffca" + -+ "\025\uffca\026\uffca\027\uffca\030\uffca\031\uffca\032\uffca\033" + -+ "\uffca\035\uffca\036\uffca\037\uffca\040\uffca\041\uffca\042\uffca" + -+ "\043\uffca\044\uffca\045\uffca\046\uffca\047\uffca\050\uffca\051" + -+ "\uffca\052\uffca\053\uffca\054\uffca\055\uffca\056\uffca\057\uffca" + -+ "\060\uffca\061\uffca\062\uffca\063\uffca\064\uffca\065\uffca\066" + -+ "\uffca\067\uffca\070\uffca\071\uffca\072\uffca\073\uffca\074\uffca" + -+ "\100\uffca\101\uffca\102\uffca\103\uffca\104\uffca\105\uffca\106" + -+ "\uffca\107\uffca\110\uffca\111\uffca\112\uffca\001\002\000\122" + -+ "\011\131\026\056\027\043\030\072\031\060\032\076\033" + -+ "\023\037\061\040\033\041\021\042\074\043\063\044\062" + -+ "\045\073\046\071\047\036\050\050\051\101\052\053\053" + -+ "\052\054\047\055\055\056\054\057\044\060\042\061\067" + -+ "\062\040\063\102\064\032\065\051\066\031\067\034\070" + -+ "\020\071\075\072\100\073\025\074\026\110\110\111\124" + -+ "\112\121\001\002\000\156\004\uffc9\005\uffc9\007\uffc9\010" + -+ "\uffc9\025\uffc9\026\uffc9\027\uffc9\030\uffc9\031\uffc9\032\uffc9" + -+ "\033\uffc9\035\uffc9\036\uffc9\037\uffc9\040\uffc9\041\uffc9\042" + -+ "\uffc9\043\uffc9\044\uffc9\045\uffc9\046\uffc9\047\uffc9\050\uffc9" + -+ "\051\uffc9\052\uffc9\053\uffc9\054\uffc9\055\uffc9\056\uffc9\057" + -+ "\uffc9\060\uffc9\061\uffc9\062\uffc9\063\uffc9\064\uffc9\065\uffc9" + -+ "\066\uffc9\067\uffc9\070\uffc9\071\uffc9\072\uffc9\073\uffc9\074" + -+ "\uffc9\100\uffc9\101\uffc9\102\uffc9\103\uffc9\104\uffc9\105\uffc9" + -+ "\106\uffc9\107\uffc9\110\uffc9\111\uffc9\112\uffc9\001\002\000" + -+ "\122\011\133\026\056\027\043\030\072\031\060\032\076" + -+ "\033\023\037\061\040\033\041\021\042\074\043\063\044" + -+ "\062\045\073\046\071\047\036\050\050\051\101\052\053" + -+ "\053\052\054\047\055\055\056\054\057\044\060\042\061" + -+ "\067\062\040\063\102\064\032\065\051\066\031\067\034" + -+ "\070\020\071\075\072\100\073\025\074\026\110\110\111" + -+ "\124\112\121\001\002\000\156\004\uffc7\005\uffc7\007\uffc7" + -+ "\010\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031\uffc7\032" + -+ "\uffc7\033\uffc7\035\uffc7\036\uffc7\037\uffc7\040\uffc7\041\uffc7" + -+ "\042\uffc7\043\uffc7\044\uffc7\045\uffc7\046\uffc7\047\uffc7\050" + -+ "\uffc7\051\uffc7\052\uffc7\053\uffc7\054\uffc7\055\uffc7\056\uffc7" + -+ "\057\uffc7\060\uffc7\061\uffc7\062\uffc7\063\uffc7\064\uffc7\065" + -+ "\uffc7\066\uffc7\067\uffc7\070\uffc7\071\uffc7\072\uffc7\073\uffc7" + -+ "\074\uffc7\100\uffc7\101\uffc7\102\uffc7\103\uffc7\104\uffc7\105" + -+ "\uffc7\106\uffc7\107\uffc7\110\uffc7\111\uffc7\112\uffc7\001\002" + -+ "\000\122\011\135\026\056\027\043\030\072\031\060\032" + -+ "\076\033\023\037\061\040\033\041\021\042\074\043\063" + -+ "\044\062\045\073\046\071\047\036\050\050\051\101\052" + -+ "\053\053\052\054\047\055\055\056\054\057\044\060\042" + -+ "\061\067\062\040\063\102\064\032\065\051\066\031\067" + -+ "\034\070\020\071\075\072\100\073\025\074\026\110\110" + -+ "\111\124\112\121\001\002\000\156\004\uffc8\005\uffc8\007" + -+ "\uffc8\010\uffc8\025\uffc8\026\uffc8\027\uffc8\030\uffc8\031\uffc8" + -+ "\032\uffc8\033\uffc8\035\uffc8\036\uffc8\037\uffc8\040\uffc8\041" + -+ "\uffc8\042\uffc8\043\uffc8\044\uffc8\045\uffc8\046\uffc8\047\uffc8" + -+ "\050\uffc8\051\uffc8\052\uffc8\053\uffc8\054\uffc8\055\uffc8\056" + -+ "\uffc8\057\uffc8\060\uffc8\061\uffc8\062\uffc8\063\uffc8\064\uffc8" + -+ "\065\uffc8\066\uffc8\067\uffc8\070\uffc8\071\uffc8\072\uffc8\073" + -+ "\uffc8\074\uffc8\100\uffc8\101\uffc8\102\uffc8\103\uffc8\104\uffc8" + -+ "\105\uffc8\106\uffc8\107\uffc8\110\uffc8\111\uffc8\112\uffc8\001" + -+ "\002\000\004\110\137\001\002\000\122\011\uffbe\026\uffbe" + -+ "\027\uffbe\030\uffbe\031\uffbe\032\uffbe\033\uffbe\037\uffbe\040" + -+ "\uffbe\041\uffbe\042\uffbe\043\uffbe\044\uffbe\045\uffbe\046\uffbe" + -+ "\047\uffbe\050\uffbe\051\uffbe\052\uffbe\053\uffbe\054\uffbe\055" + -+ "\uffbe\056\uffbe\057\uffbe\060\uffbe\061\uffbe\062\uffbe\063\uffbe" + -+ "\064\uffbe\065\uffbe\066\uffbe\067\uffbe\070\uffbe\071\uffbe\072" + -+ "\uffbe\073\uffbe\074\uffbe\110\uffbe\111\uffbe\112\uffbe\001\002" + -+ "\000\156\004\uffd8\005\uffd8\007\uffd8\010\uffd8\025\uffd8\026" + -+ "\uffd8\027\uffd8\030\uffd8\031\uffd8\032\uffd8\033\uffd8\035\uffd8" + -+ "\036\uffd8\037\uffd8\040\uffd8\041\uffd8\042\uffd8\043\uffd8\044" + -+ "\uffd8\045\uffd8\046\uffd8\047\uffd8\050\uffd8\051\uffd8\052\uffd8" + -+ "\053\uffd8\054\uffd8\055\uffd8\056\uffd8\057\uffd8\060\uffd8\061" + -+ "\uffd8\062\uffd8\063\uffd8\064\uffd8\065\uffd8\066\uffd8\067\uffd8" + -+ "\070\uffd8\071\uffd8\072\uffd8\073\uffd8\074\uffd8\100\uffd8\101" + -+ "\uffd8\102\uffd8\103\uffd8\104\uffd8\105\uffd8\106\uffd8\107\uffd8" + -+ "\110\uffd8\111\uffd8\112\uffd8\001\002\000\156\004\uffd7\005" + -+ "\uffd7\007\uffd7\010\uffd7\025\uffd7\026\uffd7\027\uffd7\030\uffd7" + -+ "\031\uffd7\032\uffd7\033\uffd7\035\uffd7\036\uffd7\037\uffd7\040" + -+ "\uffd7\041\uffd7\042\uffd7\043\uffd7\044\uffd7\045\uffd7\046\uffd7" + -+ "\047\uffd7\050\uffd7\051\uffd7\052\uffd7\053\uffd7\054\uffd7\055" + -+ "\uffd7\056\uffd7\057\uffd7\060\uffd7\061\uffd7\062\uffd7\063\uffd7" + -+ "\064\uffd7\065\uffd7\066\uffd7\067\uffd7\070\uffd7\071\uffd7\072" + -+ "\uffd7\073\uffd7\074\uffd7\100\uffd7\101\uffd7\102\uffd7\103\uffd7" + -+ "\104\uffd7\105\uffd7\106\uffd7\107\uffd7\110\uffd7\111\uffd7\112" + -+ "\uffd7\001\002\000\006\021\144\100\145\001\002\000\156" + -+ "\004\uffd6\005\uffd6\007\uffd6\010\uffd6\025\uffd6\026\uffd6\027" + -+ "\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6\035\uffd6\036\uffd6" + -+ "\037\uffd6\040\uffd6\041\uffd6\042\uffd6\043\uffd6\044\uffd6\045" + -+ "\uffd6\046\uffd6\047\uffd6\050\uffd6\051\uffd6\052\uffd6\053\uffd6" + -+ "\054\uffd6\055\uffd6\056\uffd6\057\uffd6\060\uffd6\061\uffd6\062" + -+ "\uffd6\063\uffd6\064\uffd6\065\uffd6\066\uffd6\067\uffd6\070\uffd6" + -+ "\071\uffd6\072\uffd6\073\uffd6\074\uffd6\100\uffd6\101\uffd6\102" + -+ "\uffd6\103\uffd6\104\uffd6\105\uffd6\106\uffd6\107\uffd6\110\uffd6" + -+ "\111\uffd6\112\uffd6\001\002\000\156\004\uffd5\005\uffd5\007" + -+ "\uffd5\010\uffd5\025\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5" + -+ "\032\uffd5\033\uffd5\035\uffd5\036\uffd5\037\uffd5\040\uffd5\041" + -+ "\uffd5\042\uffd5\043\uffd5\044\uffd5\045\uffd5\046\uffd5\047\uffd5" + -+ "\050\uffd5\051\uffd5\052\uffd5\053\uffd5\054\uffd5\055\uffd5\056" + -+ "\uffd5\057\uffd5\060\uffd5\061\uffd5\062\uffd5\063\uffd5\064\uffd5" + -+ "\065\uffd5\066\uffd5\067\uffd5\070\uffd5\071\uffd5\072\uffd5\073" + -+ "\uffd5\074\uffd5\100\uffd5\101\uffd5\102\uffd5\103\uffd5\104\uffd5" + -+ "\105\uffd5\106\uffd5\107\uffd5\110\uffd5\111\uffd5\112\uffd5\001" + -+ "\002\000\004\021\146\001\002\000\156\004\uffd4\005\uffd4" + -+ "\007\uffd4\010\uffd4\025\uffd4\026\uffd4\027\uffd4\030\uffd4\031" + -+ "\uffd4\032\uffd4\033\uffd4\035\uffd4\036\uffd4\037\uffd4\040\uffd4" + -+ "\041\uffd4\042\uffd4\043\uffd4\044\uffd4\045\uffd4\046\uffd4\047" + -+ "\uffd4\050\uffd4\051\uffd4\052\uffd4\053\uffd4\054\uffd4\055\uffd4" + -+ "\056\uffd4\057\uffd4\060\uffd4\061\uffd4\062\uffd4\063\uffd4\064" + -+ "\uffd4\065\uffd4\066\uffd4\067\uffd4\070\uffd4\071\uffd4\072\uffd4" + -+ "\073\uffd4\074\uffd4\100\uffd4\101\uffd4\102\uffd4\103\uffd4\104" + -+ "\uffd4\105\uffd4\106\uffd4\107\uffd4\110\uffd4\111\uffd4\112\uffd4" + -+ "\001\002\000\146\004\uffda\005\uffda\007\uffda\010\uffda\025" + -+ "\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda\033\uffda" + -+ "\035\uffda\036\uffda\037\uffda\040\uffda\041\uffda\042\uffda\043" + -+ "\uffda\044\uffda\045\uffda\046\uffda\047\uffda\050\uffda\051\uffda" + -+ "\052\uffda\053\uffda\054\uffda\055\uffda\056\uffda\057\uffda\060" + -+ "\uffda\061\uffda\062\uffda\063\uffda\064\uffda\065\uffda\066\uffda" + -+ "\067\uffda\070\uffda\071\uffda\072\uffda\073\uffda\074\uffda\103" + -+ "\uffda\105\uffda\106\uffda\107\uffda\110\uffda\111\uffda\112\uffda" + -+ "\001\002\000\146\004\uffd9\005\uffd9\007\uffd9\010\uffd9\025" + -+ "\uffd9\026\uffd9\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9" + -+ "\035\uffd9\036\uffd9\037\uffd9\040\uffd9\041\uffd9\042\uffd9\043" + -+ "\uffd9\044\uffd9\045\uffd9\046\uffd9\047\uffd9\050\uffd9\051\uffd9" + -+ "\052\uffd9\053\uffd9\054\uffd9\055\uffd9\056\uffd9\057\uffd9\060" + -+ "\uffd9\061\uffd9\062\uffd9\063\uffd9\064\uffd9\065\uffd9\066\uffd9" + -+ "\067\uffd9\070\uffd9\071\uffd9\072\uffd9\073\uffd9\074\uffd9\103" + -+ "\uffd9\105\uffd9\106\uffd9\107\uffd9\110\uffd9\111\uffd9\112\uffd9" + -+ "\001\002\000\014\013\ufff8\022\ufff8\023\ufff8\024\ufff8\076" + -+ "\ufff8\001\002\000\150\002\uffee\003\uffee\004\uffee\006\uffee" + -+ "\010\uffee\016\uffee\021\uffee\026\uffee\027\uffee\030\uffee\031" + -+ "\uffee\032\uffee\033\uffee\034\uffee\037\uffee\040\uffee\041\uffee" + -+ "\042\uffee\043\uffee\044\uffee\045\uffee\046\uffee\047\uffee\050" + -+ "\uffee\051\uffee\052\uffee\053\uffee\054\uffee\055\uffee\056\uffee" + -+ "\057\uffee\060\uffee\061\uffee\062\uffee\063\uffee\064\uffee\065" + -+ "\uffee\066\uffee\067\uffee\070\uffee\071\uffee\072\uffee\073\uffee" + -+ "\074\uffee\103\uffee\105\uffee\106\uffee\107\uffee\110\uffee\111" + -+ "\uffee\112\uffee\001\002\000\140\004\uffe1\006\200\010\uffe1" + -+ "\026\uffe1\027\uffe1\030\uffe1\031\uffe1\032\uffe1\033\uffe1\034" + -+ "\176\037\uffe1\040\uffe1\041\uffe1\042\uffe1\043\uffe1\044\uffe1" + -+ "\045\uffe1\046\uffe1\047\uffe1\050\uffe1\051\uffe1\052\uffe1\053" + -+ "\uffe1\054\uffe1\055\uffe1\056\uffe1\057\uffe1\060\uffe1\061\uffe1" + -+ "\062\uffe1\063\uffe1\064\uffe1\065\uffe1\066\uffe1\067\uffe1\070" + -+ "\uffe1\071\uffe1\072\uffe1\073\uffe1\074\uffe1\103\uffe1\105\uffe1" + -+ "\106\uffe1\107\uffe1\110\uffe1\111\uffe1\112\uffe1\001\002\000" + -+ "\004\076\162\001\002\000\150\002\ufff3\003\ufff3\004\ufff3" + -+ "\006\ufff3\010\ufff3\016\ufff3\021\ufff3\026\ufff3\027\ufff3\030" + -+ "\ufff3\031\ufff3\032\ufff3\033\ufff3\034\ufff3\037\ufff3\040\ufff3" + -+ "\041\ufff3\042\ufff3\043\ufff3\044\ufff3\045\ufff3\046\ufff3\047" + -+ "\ufff3\050\ufff3\051\ufff3\052\ufff3\053\ufff3\054\ufff3\055\ufff3" + -+ "\056\ufff3\057\ufff3\060\ufff3\061\ufff3\062\ufff3\063\ufff3\064" + -+ "\ufff3\065\ufff3\066\ufff3\067\ufff3\070\ufff3\071\ufff3\072\ufff3" + -+ "\073\ufff3\074\ufff3\103\ufff3\105\ufff3\106\ufff3\107\ufff3\110" + -+ "\ufff3\111\ufff3\112\ufff3\001\002\000\146\002\000\003\152" + -+ "\004\uffe6\006\uffe6\010\uffe6\016\157\026\uffe6\027\uffe6\030" + -+ "\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\037\uffe6\040\uffe6" + -+ "\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045\uffe6\046\uffe6\047" + -+ "\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6\055\uffe6" + -+ "\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062\uffe6\063\uffe6\064" + -+ "\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6\071\uffe6\072\uffe6" + -+ "\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106\uffe6\107\uffe6\110" + -+ "\uffe6\111\uffe6\112\uffe6\001\002\000\004\076\162\001\002" + -+ "\000\150\002\ufff6\003\ufff6\004\ufff6\006\ufff6\010\ufff6\016" + -+ "\ufff6\021\ufff6\026\ufff6\027\ufff6\030\ufff6\031\ufff6\032\ufff6" + -+ "\033\ufff6\034\ufff6\037\ufff6\040\ufff6\041\ufff6\042\ufff6\043" + -+ "\ufff6\044\ufff6\045\ufff6\046\ufff6\047\ufff6\050\ufff6\051\ufff6" + -+ "\052\ufff6\053\ufff6\054\ufff6\055\ufff6\056\ufff6\057\ufff6\060" + -+ "\ufff6\061\ufff6\062\ufff6\063\ufff6\064\ufff6\065\ufff6\066\ufff6" + -+ "\067\ufff6\070\ufff6\071\ufff6\072\ufff6\073\ufff6\074\ufff6\103" + -+ "\ufff6\105\ufff6\106\ufff6\107\ufff6\110\ufff6\111\ufff6\112\ufff6" + -+ "\001\002\000\004\017\165\001\002\000\006\015\163\017" + -+ "\uffe4\001\002\000\006\017\uffe3\076\162\001\002\000\004" + -+ "\017\uffe5\001\002\000\142\004\uffe7\006\uffe7\010\uffe7\020" + -+ "\166\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7" + -+ "\034\uffe7\037\uffe7\040\uffe7\041\uffe7\042\uffe7\043\uffe7\044" + -+ "\uffe7\045\uffe7\046\uffe7\047\uffe7\050\uffe7\051\uffe7\052\uffe7" + -+ "\053\uffe7\054\uffe7\055\uffe7\056\uffe7\057\uffe7\060\uffe7\061" + -+ "\uffe7\062\uffe7\063\uffe7\064\uffe7\065\uffe7\066\uffe7\067\uffe7" + -+ "\070\uffe7\071\uffe7\072\uffe7\073\uffe7\074\uffe7\103\uffe7\105" + -+ "\uffe7\106\uffe7\107\uffe7\110\uffe7\111\uffe7\112\uffe7\001\002" + -+ "\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016\154\026" + -+ "\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6" + -+ "\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045" + -+ "\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + -+ "\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062" + -+ "\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6" + -+ "\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106" + -+ "\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002\000\146" + -+ "\003\152\004\uffe6\006\uffe6\010\uffe6\016\157\021\170\026" + -+ "\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6" + -+ "\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045" + -+ "\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + -+ "\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062" + -+ "\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6" + -+ "\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106" + -+ "\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002\000\150" + -+ "\002\ufff5\003\ufff5\004\ufff5\006\ufff5\010\ufff5\016\ufff5\021" + -+ "\ufff5\026\ufff5\027\ufff5\030\ufff5\031\ufff5\032\ufff5\033\ufff5" + -+ "\034\ufff5\037\ufff5\040\ufff5\041\ufff5\042\ufff5\043\ufff5\044" + -+ "\ufff5\045\ufff5\046\ufff5\047\ufff5\050\ufff5\051\ufff5\052\ufff5" + -+ "\053\ufff5\054\ufff5\055\ufff5\056\ufff5\057\ufff5\060\ufff5\061" + -+ "\ufff5\062\ufff5\063\ufff5\064\ufff5\065\ufff5\066\ufff5\067\ufff5" + -+ "\070\ufff5\071\ufff5\072\ufff5\073\ufff5\074\ufff5\103\ufff5\105" + -+ "\ufff5\106\ufff5\107\ufff5\110\ufff5\111\ufff5\112\ufff5\001\002" + -+ "\000\004\017\172\001\002\000\142\004\uffe7\006\uffe7\010" + -+ "\uffe7\020\173\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7" + -+ "\033\uffe7\034\uffe7\037\uffe7\040\uffe7\041\uffe7\042\uffe7\043" + -+ "\uffe7\044\uffe7\045\uffe7\046\uffe7\047\uffe7\050\uffe7\051\uffe7" + -+ "\052\uffe7\053\uffe7\054\uffe7\055\uffe7\056\uffe7\057\uffe7\060" + -+ "\uffe7\061\uffe7\062\uffe7\063\uffe7\064\uffe7\065\uffe7\066\uffe7" + -+ "\067\uffe7\070\uffe7\071\uffe7\072\uffe7\073\uffe7\074\uffe7\103" + -+ "\uffe7\105\uffe7\106\uffe7\107\uffe7\110\uffe7\111\uffe7\112\uffe7" + -+ "\001\002\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016" + -+ "\154\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + -+ "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + -+ "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + -+ "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + -+ "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + -+ "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + -+ "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + -+ "\000\146\003\152\004\uffe6\006\uffe6\010\uffe6\016\157\021" + -+ "\175\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + -+ "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + -+ "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + -+ "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + -+ "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + -+ "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + -+ "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + -+ "\000\150\002\ufff4\003\ufff4\004\ufff4\006\ufff4\010\ufff4\016" + -+ "\ufff4\021\ufff4\026\ufff4\027\ufff4\030\ufff4\031\ufff4\032\ufff4" + -+ "\033\ufff4\034\ufff4\037\ufff4\040\ufff4\041\ufff4\042\ufff4\043" + -+ "\ufff4\044\ufff4\045\ufff4\046\ufff4\047\ufff4\050\ufff4\051\ufff4" + -+ "\052\ufff4\053\ufff4\054\ufff4\055\ufff4\056\ufff4\057\ufff4\060" + -+ "\ufff4\061\ufff4\062\ufff4\063\ufff4\064\ufff4\065\ufff4\066\ufff4" + -+ "\067\ufff4\070\ufff4\071\ufff4\072\ufff4\073\ufff4\074\ufff4\103" + -+ "\ufff4\105\ufff4\106\ufff4\107\ufff4\110\ufff4\111\ufff4\112\ufff4" + -+ "\001\002\000\004\075\216\001\002\000\134\004\066\010" + -+ "\064\026\056\027\043\030\072\031\060\032\076\033\023" + -+ "\037\061\040\033\041\021\042\074\043\063\044\062\045" + -+ "\073\046\071\047\036\050\050\051\101\052\053\053\052" + -+ "\054\047\055\055\056\054\057\044\060\042\061\067\062" + -+ "\040\063\102\064\032\065\051\066\031\067\034\070\020" + -+ "\071\075\072\100\073\025\074\026\103\037\105\070\106" + -+ "\041\107\035\110\022\111\077\112\024\001\002\000\134" + -+ "\004\uffe2\010\uffe2\026\uffe2\027\uffe2\030\uffe2\031\uffe2\032" + -+ "\uffe2\033\uffe2\037\uffe2\040\uffe2\041\uffe2\042\uffe2\043\uffe2" + -+ "\044\uffe2\045\uffe2\046\uffe2\047\uffe2\050\uffe2\051\uffe2\052" + -+ "\uffe2\053\uffe2\054\uffe2\055\uffe2\056\uffe2\057\uffe2\060\uffe2" + -+ "\061\uffe2\062\uffe2\063\uffe2\064\uffe2\065\uffe2\066\uffe2\067" + -+ "\uffe2\070\uffe2\071\uffe2\072\uffe2\073\uffe2\074\uffe2\103\uffe2" + -+ "\105\uffe2\106\uffe2\107\uffe2\110\uffe2\111\uffe2\112\uffe2\001" + -+ "\002\000\014\007\210\025\205\035\202\036\204\103\104" + -+ "\001\002\000\150\002\uffe8\003\uffe8\004\uffe8\006\uffe8\010" + -+ "\uffe8\016\uffe8\021\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8" + -+ "\032\uffe8\033\uffe8\034\uffe8\037\uffe8\040\uffe8\041\uffe8\042" + -+ "\uffe8\043\uffe8\044\uffe8\045\uffe8\046\uffe8\047\uffe8\050\uffe8" + -+ "\051\uffe8\052\uffe8\053\uffe8\054\uffe8\055\uffe8\056\uffe8\057" + -+ "\uffe8\060\uffe8\061\uffe8\062\uffe8\063\uffe8\064\uffe8\065\uffe8" + -+ "\066\uffe8\067\uffe8\070\uffe8\071\uffe8\072\uffe8\073\uffe8\074" + -+ "\uffe8\103\uffe8\105\uffe8\106\uffe8\107\uffe8\110\uffe8\111\uffe8" + -+ "\112\uffe8\001\002\000\150\002\uffe9\003\uffe9\004\uffe9\006" + -+ "\uffe9\010\uffe9\016\uffe9\021\uffe9\026\uffe9\027\uffe9\030\uffe9" + -+ "\031\uffe9\032\uffe9\033\uffe9\034\uffe9\037\uffe9\040\uffe9\041" + -+ "\uffe9\042\uffe9\043\uffe9\044\uffe9\045\uffe9\046\uffe9\047\uffe9" + -+ "\050\uffe9\051\uffe9\052\uffe9\053\uffe9\054\uffe9\055\uffe9\056" + -+ "\uffe9\057\uffe9\060\uffe9\061\uffe9\062\uffe9\063\uffe9\064\uffe9" + -+ "\065\uffe9\066\uffe9\067\uffe9\070\uffe9\071\uffe9\072\uffe9\073" + -+ "\uffe9\074\uffe9\103\uffe9\105\uffe9\106\uffe9\107\uffe9\110\uffe9" + -+ "\111\uffe9\112\uffe9\001\002\000\134\004\066\010\064\026" + -+ "\056\027\043\030\072\031\060\032\076\033\023\037\061" + -+ "\040\033\041\021\042\074\043\063\044\062\045\073\046" + -+ "\071\047\036\050\050\051\101\052\053\053\052\054\047" + -+ "\055\055\056\054\057\044\060\042\061\067\062\040\063" + -+ "\102\064\032\065\051\066\031\067\034\070\020\071\075" + -+ "\072\100\073\025\074\026\103\037\105\070\106\041\107" + -+ "\035\110\022\111\077\112\024\001\002\000\004\075\213" + -+ "\001\002\000\006\025\205\035\211\001\002\000\150\002" + - "\ufff2\003\ufff2\004\ufff2\006\ufff2\010\ufff2\016\ufff2\021\ufff2" + - "\026\ufff2\027\ufff2\030\ufff2\031\ufff2\032\ufff2\033\ufff2\034" + -- "\ufff2\045\ufff2\047\ufff2\050\ufff2\051\ufff2\052\ufff2\053\ufff2" + -- "\054\ufff2\001\002\000\006\025\uffed\035\uffed\001\002\000" + -- "\054\002\ufff0\003\ufff0\004\ufff0\006\ufff0\010\ufff0\016\ufff0" + -- "\021\ufff0\026\ufff0\027\ufff0\030\ufff0\031\ufff0\032\ufff0\033" + -- "\ufff0\034\ufff0\045\ufff0\047\ufff0\050\ufff0\051\ufff0\052\ufff0" + -- "\053\ufff0\054\ufff0\001\002\000\054\002\ufff1\003\ufff1\004" + -- "\ufff1\006\ufff1\010\ufff1\016\ufff1\021\ufff1\026\ufff1\027\ufff1" + -- "\030\ufff1\031\ufff1\032\ufff1\033\ufff1\034\ufff1\045\ufff1\047" + -- "\ufff1\050\ufff1\051\ufff1\052\ufff1\053\ufff1\054\ufff1\001\002" + -- "\000\054\002\uffea\003\uffea\004\uffea\006\uffea\010\uffea\016" + -- "\uffea\021\uffea\026\uffea\027\uffea\030\uffea\031\uffea\032\uffea" + -- "\033\uffea\034\uffea\045\uffea\047\uffea\050\uffea\051\uffea\052" + -- "\uffea\053\uffea\054\uffea\001\002\000\012\007\157\025\uffec" + -- "\035\uffec\045\106\001\002\000\006\025\uffeb\035\uffeb\001" + -- "\002\000\054\002\uffef\003\uffef\004\uffef\006\uffef\010\uffef" + -- "\016\uffef\021\uffef\026\uffef\027\uffef\030\uffef\031\uffef\032" + -- "\uffef\033\uffef\034\uffef\045\uffef\047\uffef\050\uffef\051\uffef" + -- "\052\uffef\053\uffef\054\uffef\001\002" }); -+ "\ufff2\037\ufff2\040\ufff2\041\ufff2\042\ufff2\043\ufff2\044\ufff2" + -+ "\045\ufff2\046\ufff2\047\ufff2\050\ufff2\051\ufff2\052\ufff2\053" + -+ "\ufff2\054\ufff2\055\ufff2\056\ufff2\057\ufff2\060\ufff2\061\ufff2" + -+ "\062\ufff2\063\ufff2\064\ufff2\065\ufff2\066\ufff2\067\ufff2\070" + -+ "\ufff2\071\ufff2\072\ufff2\073\ufff2\074\ufff2\103\ufff2\105\ufff2" + -+ "\106\ufff2\107\ufff2\110\ufff2\111\ufff2\112\ufff2\001\002\000" + -+ "\006\025\uffed\035\uffed\001\002\000\150\002\ufff0\003\ufff0" + -+ "\004\ufff0\006\ufff0\010\ufff0\016\ufff0\021\ufff0\026\ufff0\027" + -+ "\ufff0\030\ufff0\031\ufff0\032\ufff0\033\ufff0\034\ufff0\037\ufff0" + -+ "\040\ufff0\041\ufff0\042\ufff0\043\ufff0\044\ufff0\045\ufff0\046" + -+ "\ufff0\047\ufff0\050\ufff0\051\ufff0\052\ufff0\053\ufff0\054\ufff0" + -+ "\055\ufff0\056\ufff0\057\ufff0\060\ufff0\061\ufff0\062\ufff0\063" + -+ "\ufff0\064\ufff0\065\ufff0\066\ufff0\067\ufff0\070\ufff0\071\ufff0" + -+ "\072\ufff0\073\ufff0\074\ufff0\103\ufff0\105\ufff0\106\ufff0\107" + -+ "\ufff0\110\ufff0\111\ufff0\112\ufff0\001\002\000\150\002\ufff1" + -+ "\003\ufff1\004\ufff1\006\ufff1\010\ufff1\016\ufff1\021\ufff1\026" + -+ "\ufff1\027\ufff1\030\ufff1\031\ufff1\032\ufff1\033\ufff1\034\ufff1" + -+ "\037\ufff1\040\ufff1\041\ufff1\042\ufff1\043\ufff1\044\ufff1\045" + -+ "\ufff1\046\ufff1\047\ufff1\050\ufff1\051\ufff1\052\ufff1\053\ufff1" + -+ "\054\ufff1\055\ufff1\056\ufff1\057\ufff1\060\ufff1\061\ufff1\062" + -+ "\ufff1\063\ufff1\064\ufff1\065\ufff1\066\ufff1\067\ufff1\070\ufff1" + -+ "\071\ufff1\072\ufff1\073\ufff1\074\ufff1\103\ufff1\105\ufff1\106" + -+ "\ufff1\107\ufff1\110\ufff1\111\ufff1\112\ufff1\001\002\000\150" + -+ "\002\uffea\003\uffea\004\uffea\006\uffea\010\uffea\016\uffea\021" + -+ "\uffea\026\uffea\027\uffea\030\uffea\031\uffea\032\uffea\033\uffea" + -+ "\034\uffea\037\uffea\040\uffea\041\uffea\042\uffea\043\uffea\044" + -+ "\uffea\045\uffea\046\uffea\047\uffea\050\uffea\051\uffea\052\uffea" + -+ "\053\uffea\054\uffea\055\uffea\056\uffea\057\uffea\060\uffea\061" + -+ "\uffea\062\uffea\063\uffea\064\uffea\065\uffea\066\uffea\067\uffea" + -+ "\070\uffea\071\uffea\072\uffea\073\uffea\074\uffea\103\uffea\105" + -+ "\uffea\106\uffea\107\uffea\110\uffea\111\uffea\112\uffea\001\002" + -+ "\000\012\007\215\025\uffec\035\uffec\103\104\001\002\000" + -+ "\006\025\uffeb\035\uffeb\001\002\000\150\002\uffef\003\uffef" + -+ "\004\uffef\006\uffef\010\uffef\016\uffef\021\uffef\026\uffef\027" + -+ "\uffef\030\uffef\031\uffef\032\uffef\033\uffef\034\uffef\037\uffef" + -+ "\040\uffef\041\uffef\042\uffef\043\uffef\044\uffef\045\uffef\046" + -+ "\uffef\047\uffef\050\uffef\051\uffef\052\uffef\053\uffef\054\uffef" + -+ "\055\uffef\056\uffef\057\uffef\060\uffef\061\uffef\062\uffef\063" + -+ "\uffef\064\uffef\065\uffef\066\uffef\067\uffef\070\uffef\071\uffef" + -+ "\072\uffef\073\uffef\074\uffef\103\uffef\105\uffef\106\uffef\107" + -+ "\uffef\110\uffef\111\uffef\112\uffef\001\002" }); - - /** Access to parse-action table. */ - public short[][] action_table() {return _action_table;} -@@ -331,55 +966,64 @@ - /** reduce_goto table. */ - protected static final short[][] _reduce_table = - unpackFromStrings(new String[] { -- "\000\156\000\004\006\004\001\001\000\004\003\007\001" + -+ "\000\214\000\004\005\004\001\001\000\004\002\007\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + -- "\000\004\004\012\001\001\000\002\001\001\000\010\005" + -- "\116\017\114\022\117\001\001\000\002\001\001\000\002" + -- "\001\001\000\002\001\001\000\002\001\001\000\016\007" + -- "\025\010\032\011\037\012\042\013\035\021\026\001\001" + -+ "\000\004\003\012\001\001\000\002\001\001\000\010\004" + -+ "\154\016\152\021\155\001\001\000\002\001\001\000\002" + -+ "\001\001\000\002\001\001\000\002\001\001\000\016\006" + -+ "\026\007\027\010\064\011\044\012\056\020\045\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + -- "\002\001\001\000\012\011\112\012\042\013\035\021\026" + -+ "\002\001\001\000\002\001\001\000\002\001\001\000\002" + -+ "\001\001\000\002\001\001\000\012\010\106\011\044\012" + -+ "\056\020\045\001\001\000\002\001\001\000\002\001\001" + -+ "\000\002\001\001\000\002\001\001\000\012\010\147\011" + -+ "\044\012\056\020\045\001\001\000\002\001\001\000\002" + -+ "\001\001\000\002\001\001\000\012\010\146\011\044\012" + -+ "\056\020\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\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\012\011\110\012\042\013\035\021\026\001\001\000" + -- "\016\007\104\010\032\011\037\012\042\013\035\021\026" + -- "\001\001\000\002\001\001\000\002\001\001\000\012\011" + -- "\103\012\042\013\035\021\026\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + -- "\010\015\045\020\053\021\044\001\001\000\002\001\001" + -- "\000\002\001\001\000\010\015\045\020\070\021\044\001" + -- "\001\000\010\015\045\020\064\021\044\001\001\000\002" + -- "\001\001\000\002\001\001\000\002\001\001\000\006\015" + -- "\060\021\057\001\001\000\002\001\001\000\002\001\001" + -+ "\010\014\116\017\117\020\111\001\001\000\002\001\001" + -+ "\000\016\006\102\007\027\010\064\011\044\012\056\020" + -+ "\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\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\006" + -- "\015\060\021\057\001\001\000\002\001\001\000\010\015" + -- "\045\020\072\021\044\001\001\000\002\001\001\000\006" + -- "\015\060\021\057\001\001\000\002\001\001\000\006\015" + -- "\060\021\057\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\014\007\105\010\064\011\044\012\056" + -+ "\020\045\001\001\000\002\001\001\000\012\010\106\011" + -+ "\044\012\056\020\045\001\001\000\002\001\001\000\002" + -+ "\001\001\000\002\001\001\000\002\001\001\000\010\014" + -+ "\116\017\133\020\111\001\001\000\010\014\116\017\127" + -+ "\020\111\001\001\000\002\001\001\000\002\001\001\000" + -+ "\002\001\001\000\006\014\124\020\121\001\001\000\002" + -+ "\001\001\000\002\001\001\000\002\001\001\000\002\001" + -+ "\001\000\002\001\001\000\010\014\116\017\131\020\111" + -+ "\001\001\000\002\001\001\000\006\014\124\020\121\001" + -+ "\001\000\002\001\001\000\006\014\124\020\121\001\001" + -+ "\000\002\001\001\000\006\014\124\020\121\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\002" + -- "\001\001\000\002\001\001\000\014\010\107\011\037\012" + -- "\042\013\035\021\026\001\001\000\002\001\001\000\012" + -- "\011\110\012\042\013\035\021\026\001\001\000\002\001" + -- "\001\000\002\001\001\000\002\001\001\000\002\001\001" + -- "\000\004\023\140\001\001\000\004\016\132\001\001\000" + -- "\002\001\001\000\006\005\121\017\114\001\001\000\004" + -- "\016\122\001\001\000\002\001\001\000\002\001\001\000" + -- "\002\001\001\000\004\016\125\001\001\000\002\001\001" + -- "\000\002\001\001\000\010\005\116\017\114\022\130\001" + -- "\001\000\006\005\121\017\114\001\001\000\002\001\001" + -- "\000\002\001\001\000\002\001\001\000\010\005\116\017" + -- "\114\022\135\001\001\000\006\005\121\017\114\001\001" + -- "\000\002\001\001\000\002\001\001\000\016\007\142\010" + -- "\032\011\037\012\042\013\035\021\026\001\001\000\002" + -- "\001\001\000\010\014\147\024\144\025\150\001\001\000" + -- "\002\001\001\000\002\001\001\000\016\007\155\010\032" + -- "\011\037\012\042\013\035\021\026\001\001\000\002\001" + -- "\001\000\004\024\153\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\022\176\001\001\000\004\015\170" + -+ "\001\001\000\002\001\001\000\006\004\157\016\152\001" + -+ "\001\000\004\015\160\001\001\000\002\001\001\000\002" + -+ "\001\001\000\002\001\001\000\004\015\163\001\001\000" + -+ "\002\001\001\000\002\001\001\000\010\004\154\016\152" + -+ "\021\166\001\001\000\006\004\157\016\152\001\001\000" + -+ "\002\001\001\000\002\001\001\000\002\001\001\000\010" + -+ "\004\154\016\152\021\173\001\001\000\006\004\157\016" + -+ "\152\001\001\000\002\001\001\000\002\001\001\000\016" + -+ "\006\200\007\027\010\064\011\044\012\056\020\045\001" + -+ "\001\000\002\001\001\000\010\013\205\023\202\024\206" + -+ "\001\001\000\002\001\001\000\002\001\001\000\016\006" + -+ "\213\007\027\010\064\011\044\012\056\020\045\001\001" + -+ "\000\002\001\001\000\004\023\211\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 reduce_goto table. */ - public short[][] reduce_table() {return _reduce_table;} -@@ -468,7 +1112,7 @@ - - - LexScan scanner; -- CharClasses charClasses = new CharClasses(0xFFFF); -+ CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF); - RegExps regExps = new RegExps(); - Macros macros = new Macros(); - Integer stateNumber; -@@ -518,6 +1162,96 @@ - case sym.LOWERCLASS: - return Character.isLowerCase(c); - -+ case sym.UNICODE_UNASSIGNED: -+ return Character.getType(c) == Character.UNASSIGNED; -+ -+ case sym.UNICODE_UPPERCASE_LETTER: -+ return Character.getType(c) == Character.UPPERCASE_LETTER; -+ -+ case sym.UNICODE_LOWERCASE_LETTER: -+ return Character.getType(c) == Character.LOWERCASE_LETTER; -+ -+ case sym.UNICODE_TITLECASE_LETTER: -+ return Character.getType(c) == Character.TITLECASE_LETTER; -+ -+ case sym.UNICODE_MODIFIER_LETTER: -+ return Character.getType(c) == Character.MODIFIER_LETTER; -+ -+ case sym.UNICODE_OTHER_LETTER: -+ return Character.getType(c) == Character.OTHER_LETTER; -+ -+ case sym.UNICODE_NON_SPACING_MARK: -+ return Character.getType(c) == Character.NON_SPACING_MARK; -+ -+ case sym.UNICODE_ENCLOSING_MARK: -+ return Character.getType(c) == Character.ENCLOSING_MARK; -+ -+ case sym.UNICODE_COMBINING_SPACING_MARK: -+ return Character.getType(c) == Character.COMBINING_SPACING_MARK; -+ -+ case sym.UNICODE_DECIMAL_DIGIT_NUMBER: -+ return Character.getType(c) == Character.DECIMAL_DIGIT_NUMBER; -+ -+ case sym.UNICODE_LETTER_NUMBER: -+ return Character.getType(c) == Character.LETTER_NUMBER; -+ -+ case sym.UNICODE_OTHER_NUMBER: -+ return Character.getType(c) == Character.OTHER_NUMBER; -+ -+ case sym.UNICODE_SPACE_SEPARATOR: -+ return Character.getType(c) == Character.SPACE_SEPARATOR; -+ -+ case sym.UNICODE_LINE_SEPARATOR: -+ return Character.getType(c) == Character.LINE_SEPARATOR; -+ -+ case sym.UNICODE_PARAGRAPH_SEPARATOR: -+ return Character.getType(c) == Character.PARAGRAPH_SEPARATOR; -+ -+ case sym.UNICODE_CONTROL: -+ return Character.getType(c) == Character.CONTROL; -+ -+ case sym.UNICODE_FORMAT: -+ return Character.getType(c) == Character.FORMAT; -+ -+ case sym.UNICODE_PRIVATE_USE: -+ return Character.getType(c) == Character.PRIVATE_USE; -+ -+ case sym.UNICODE_SURROGATE: -+ return Character.getType(c) == Character.SURROGATE; -+ -+ case sym.UNICODE_DASH_PUNCTUATION: -+ return Character.getType(c) == Character.DASH_PUNCTUATION; -+ -+ case sym.UNICODE_START_PUNCTUATION: -+ return Character.getType(c) == Character.START_PUNCTUATION; -+ -+ case sym.UNICODE_END_PUNCTUATION: -+ return Character.getType(c) == Character.END_PUNCTUATION; -+ -+ case sym.UNICODE_CONNECTOR_PUNCTUATION: -+ return Character.getType(c) == Character.CONNECTOR_PUNCTUATION; -+ -+ case sym.UNICODE_OTHER_PUNCTUATION: -+ return Character.getType(c) == Character.OTHER_PUNCTUATION; -+ -+ case sym.UNICODE_MATH_SYMBOL: -+ return Character.getType(c) == Character.MATH_SYMBOL; -+ -+ case sym.UNICODE_CURRENCY_SYMBOL: -+ return Character.getType(c) == Character.CURRENCY_SYMBOL; -+ -+ case sym.UNICODE_MODIFIER_SYMBOL: -+ return Character.getType(c) == Character.MODIFIER_SYMBOL; -+ -+ case sym.UNICODE_OTHER_SYMBOL: -+ return Character.getType(c) == Character.OTHER_SYMBOL; -+ -+ case sym.UNICODE_INITIAL_QUOTE_PUNCTUATION: -+ return Character.getType(c) == Character.INITIAL_QUOTE_PUNCTUATION; -+ -+ case sym.UNICODE_FINAL_QUOTE_PUNCTUATION: -+ return Character.getType(c) == Character.FINAL_QUOTE_PUNCTUATION; -+ - default: return false; - } - } -@@ -637,227 +1371,497 @@ - switch (CUP$LexParse$act_num) - { - /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 104: // preclass ::= UNICODE_FINAL_QUOTE_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_FINAL_QUOTE_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 103: // preclass ::= UNICODE_INITIAL_QUOTE_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_INITIAL_QUOTE_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 102: // preclass ::= UNICODE_OTHER_SYMBOL -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_OTHER_SYMBOL); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 101: // preclass ::= UNICODE_MODIFIER_SYMBOL -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_MODIFIER_SYMBOL); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 100: // preclass ::= UNICODE_CURRENCY_SYMBOL -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_CURRENCY_SYMBOL); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 99: // preclass ::= UNICODE_MATH_SYMBOL -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_MATH_SYMBOL); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 98: // preclass ::= UNICODE_OTHER_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_OTHER_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 97: // preclass ::= UNICODE_CONNECTOR_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_CONNECTOR_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 96: // preclass ::= UNICODE_END_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_END_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 95: // preclass ::= UNICODE_START_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_START_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 94: // preclass ::= UNICODE_DASH_PUNCTUATION -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_DASH_PUNCTUATION); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 93: // preclass ::= UNICODE_SURROGATE -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_SURROGATE); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 92: // preclass ::= UNICODE_PRIVATE_USE -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_PRIVATE_USE); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 91: // preclass ::= UNICODE_FORMAT -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_FORMAT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 90: // preclass ::= UNICODE_CONTROL -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_CONTROL); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 89: // preclass ::= UNICODE_PARAGRAPH_SEPARATOR -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_PARAGRAPH_SEPARATOR); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 88: // preclass ::= UNICODE_LINE_SEPARATOR -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_LINE_SEPARATOR); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 87: // preclass ::= UNICODE_SPACE_SEPARATOR -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_SPACE_SEPARATOR); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 86: // preclass ::= UNICODE_OTHER_NUMBER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_OTHER_NUMBER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 85: // preclass ::= UNICODE_LETTER_NUMBER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_LETTER_NUMBER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 84: // preclass ::= UNICODE_DECIMAL_DIGIT_NUMBER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_DECIMAL_DIGIT_NUMBER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 83: // preclass ::= UNICODE_COMBINING_SPACING_MARK -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_COMBINING_SPACING_MARK); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 82: // preclass ::= UNICODE_ENCLOSING_MARK -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_ENCLOSING_MARK); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 81: // preclass ::= UNICODE_NON_SPACING_MARK -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_NON_SPACING_MARK); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 80: // preclass ::= UNICODE_OTHER_LETTER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_OTHER_LETTER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 79: // preclass ::= UNICODE_MODIFIER_LETTER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_MODIFIER_LETTER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 78: // preclass ::= UNICODE_TITLECASE_LETTER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_TITLECASE_LETTER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 77: // preclass ::= UNICODE_LOWERCASE_LETTER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_LOWERCASE_LETTER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 76: // preclass ::= UNICODE_UPPERCASE_LETTER -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_UPPERCASE_LETTER); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ -+ case 75: // preclass ::= UNICODE_UNASSIGNED -+ { -+ Vector RESULT =null; -+ RESULT = makePreClass(sym.UNICODE_UNASSIGNED); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); -+ } -+ return CUP$LexParse$result; -+ -+ /*. . . . . . . . . . . . . . . . . . . .*/ - case 74: // preclass ::= LOWERCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.LOWERCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 73: // preclass ::= UPPERCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.UPPERCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 72: // preclass ::= DIGITCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.DIGITCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 71: // preclass ::= LETTERCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.LETTERCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 70: // preclass ::= JLETTERDIGITCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.JLETTERDIGITCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 69: // preclass ::= JLETTERCLASS - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = makePreClass(sym.JLETTERCLASS); -- CUP$LexParse$result = new java_cup.runtime.Symbol(15/*preclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 68: // classcontentelem ::= CHAR - { -- Interval RESULT = null; -+ Interval RESULT =null; -- int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Interval(c.charValue(), c.charValue()); -- CUP$LexParse$result = new java_cup.runtime.Symbol(11/*classcontentelem*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 67: // classcontentelem ::= CHAR DASH CHAR - { -- Interval RESULT = null; -+ Interval RESULT =null; - int c1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int c1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Character c1 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; -- int c2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int c2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Character c2 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int c2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int c2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Character c2 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Interval(c1.charValue(), c2.charValue()); -- CUP$LexParse$result = new java_cup.runtime.Symbol(11/*classcontentelem*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 66: // classcontent ::= MACROUSE - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 65: // classcontent ::= classcontent MACROUSE - { -- Vector RESULT = null; -+ Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 64: // classcontent ::= STRING - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - RESULT = new Vector(); - for (int i = 0; i < s.length(); i++) - RESULT.addElement(new Interval(s.charAt(i),s.charAt(i))); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 63: // classcontent ::= classcontent STRING - { -- Vector RESULT = null; -+ Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - for (int i = 0; i < s.length(); i++) - list.addElement(new Interval(s.charAt(i),s.charAt(i))); - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 62: // classcontent ::= preclass - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = list; -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 61: // classcontent ::= classcontent preclass - { -- Vector RESULT = null; -+ Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int plistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int plistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Vector plist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int plistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int plistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Vector plist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - for (Enumeration e = plist.elements(); e.hasMoreElements();) - list.addElement(e.nextElement()); - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 60: // classcontent ::= classcontentelem - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - list.addElement(elem); - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 59: // classcontent ::= classcontent classcontentelem - { -- Vector RESULT = null; -+ Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - list.addElement(elem); - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(14/*classcontent*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 58: // charclass ::= OPENCLASS HAT DASH classcontent CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - list.addElement(new Interval('-','-')); -@@ -868,20 +1872,20 @@ - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 57: // charclass ::= OPENCLASS DASH classcontent CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - list.addElement(new Interval('-','-')); -@@ -892,20 +1896,20 @@ - } - RESULT = new RegExp1(sym.CCLASS,list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 56: // charclass ::= OPENCLASS HAT classcontent CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - charClasses.makeClassNot(list, Options.jlex && scanner.caseless); -@@ -915,17 +1919,17 @@ - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 55: // charclass ::= OPENCLASS HAT CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - list.addElement(new Interval((char)0,CharClasses.maxChar)); -@@ -937,20 +1941,20 @@ - } - RESULT = new RegExp1(sym.CCLASS,list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 54: // charclass ::= OPENCLASS classcontent CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - charClasses.makeClass(list, Options.jlex && scanner.caseless); -@@ -960,28 +1964,28 @@ - } - RESULT = new RegExp1(sym.CCLASS,list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 53: // charclass ::= OPENCLASS CLOSECLASS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - - RESULT = new RegExp1(sym.CCLASS,null); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(9/*charclass*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 52: // regexp ::= CHAR - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - if ( scanner.caseless ) { -@@ -997,14 +2001,14 @@ - syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright); - } - -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 51: // regexp ::= POINT - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - - Vector any = new Vector(); - any.addElement(new Interval('\n','\n')); -@@ -1012,17 +2016,17 @@ - charClasses.makeClass('\n', false); - RESULT = new RegExp1(sym.CCLASSNOT, any); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 50: // regexp ::= STRING - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int strleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int strright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String str = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int strleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int strright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String str = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - if ( scanner.caseless ) { -@@ -1039,17 +2043,17 @@ - } - - -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 49: // regexp ::= preclass - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - // assumption [correct?]: preclasses are already closed under case -@@ -1060,29 +2064,29 @@ - } - RESULT = new RegExp1(sym.CCLASS, list); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 48: // regexp ::= charclass - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp c = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp c = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = c; -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 47: // regexp ::= MACROUSE - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - if ( !scanner.macroDefinition ) { - if ( ! macros.markUsed(ident) ) -@@ -1091,26 +2095,26 @@ - } - RESULT = new RegExp1(sym.MACROUSE, ident); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 46: // regexp ::= OPENBRACKET series CLOSEBRACKET - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = r; -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 45: // regexp ::= regexp REPEAT REPEAT RBRACE - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; -@@ -1121,205 +2125,205 @@ - int n2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Integer n2 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 44: // regexp ::= regexp REPEAT RBRACE - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int nleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int nright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Integer n = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 43: // regexp ::= regexp QUESTION - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.QUESTION, r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 42: // regexp ::= regexp PLUS - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.PLUS, r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 41: // regexp ::= regexp STAR - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.STAR, r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(8/*regexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 40: // nregexp ::= TILDE nregexp - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp1(sym.TILDE, r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(7/*nregexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 39: // nregexp ::= BANG nregexp - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp1(sym.BANG, r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(7/*nregexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 38: // nregexp ::= regexp - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; -- CUP$LexParse$result = new java_cup.runtime.Symbol(7/*nregexp*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 37: // concs ::= nregexp - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; -- CUP$LexParse$result = new java_cup.runtime.Symbol(6/*concs*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 36: // concs ::= concs nregexp - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp2(sym.CONCAT, r1, r2); -- CUP$LexParse$result = new java_cup.runtime.Symbol(6/*concs*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 35: // series ::= BAR - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); -- CUP$LexParse$result = new java_cup.runtime.Symbol(5/*series*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 34: // series ::= concs - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; -- CUP$LexParse$result = new java_cup.runtime.Symbol(5/*series*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 33: // series ::= series BAR concs - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; -- int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp2(sym.BAR, r1, r2); -- CUP$LexParse$result = new java_cup.runtime.Symbol(5/*series*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 32: // hatOPT ::= - { -- Boolean RESULT = null; -+ Boolean RESULT =null; - RESULT = new Boolean(false); -- CUP$LexParse$result = new java_cup.runtime.Symbol(17/*hatOPT*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 31: // hatOPT ::= HAT - { -- Boolean RESULT = null; -+ Boolean RESULT =null; - // assumption: there is no upper case for \n - charClasses.makeClass('\n', false); - RESULT = new Boolean(true); -- CUP$LexParse$result = new java_cup.runtime.Symbol(17/*hatOPT*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 30: // states ::= IDENT COMMA - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object c = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object c = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); -- CUP$LexParse$result = new java_cup.runtime.Symbol(12/*states*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 29: // states ::= IDENT - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - stateNumber = scanner.states.getNumber( id ); -@@ -1331,20 +2335,20 @@ - } - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(12/*states*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 28: // states ::= IDENT COMMA states - { -- Vector RESULT = null; -+ Vector RESULT =null; - int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; -- int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - stateNumber = scanner.states.getNumber( id ); - if ( stateNumber != null ) -@@ -1355,125 +2359,125 @@ - } - RESULT = list; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(12/*states*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 27: // statesOPT ::= - { -- Vector RESULT = null; -+ Vector RESULT =null; - RESULT = new Vector(); -- CUP$LexParse$result = new java_cup.runtime.Symbol(13/*statesOPT*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 26: // statesOPT ::= LESSTHAN states MORETHAN - { -- Vector RESULT = null; -+ Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = list; -- CUP$LexParse$result = new java_cup.runtime.Symbol(13/*statesOPT*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 25: // actions ::= NOACTION - { -- Action RESULT = null; -+ Action RESULT =null; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(19/*actions*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 24: // actions ::= act - { -- Action RESULT = null; -+ Action RESULT =null; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = a; -- CUP$LexParse$result = new java_cup.runtime.Symbol(19/*actions*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 23: // act ::= REGEXPEND ACTION - { -- Action RESULT = null; -+ Action RESULT =null; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = a; -- CUP$LexParse$result = new java_cup.runtime.Symbol(18/*act*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("act",17, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 22: // lookahead ::= LOOKAHEAD series DOLLAR - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp s = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp2(sym.CONCAT, s, makeNL()); -- CUP$LexParse$result = new java_cup.runtime.Symbol(10/*lookahead*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 21: // lookahead ::= LOOKAHEAD series - { -- RegExp RESULT = null; -+ RegExp RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; -- CUP$LexParse$result = new java_cup.runtime.Symbol(10/*lookahead*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 20: // lookahead ::= DOLLAR - { -- RegExp RESULT = null; -+ RegExp RESULT =null; - RESULT = makeNL(); -- CUP$LexParse$result = new java_cup.runtime.Symbol(10/*lookahead*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 19: // rule ::= error - { -- Integer RESULT = null; -+ Integer RESULT =null; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(3/*rule*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 18: // rule ::= statesOPT EOFRULE ACTION - { -- Integer RESULT = null; -+ Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(s, a)); -- CUP$LexParse$result = new java_cup.runtime.Symbol(3/*rule*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 17: // rule ::= statesOPT hatOPT series lookahead NOACTION - { -- Integer RESULT = null; -+ Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; -@@ -1486,18 +2490,18 @@ - int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object a = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object a = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); -- CUP$LexParse$result = new java_cup.runtime.Symbol(3/*rule*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 16: // rule ::= statesOPT hatOPT series lookahead act - { -- Integer RESULT = null; -+ Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; -@@ -1510,18 +2514,18 @@ - int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); -- CUP$LexParse$result = new java_cup.runtime.Symbol(3/*rule*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 15: // rule ::= statesOPT hatOPT series actions - { -- Integer RESULT = null; -+ Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; -@@ -1531,30 +2535,30 @@ - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); -- CUP$LexParse$result = new java_cup.runtime.Symbol(3/*rule*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 14: // rules ::= rule - { -- Vector RESULT = null; -+ Vector RESULT =null; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Vector(); RESULT.addElement(r); -- CUP$LexParse$result = new java_cup.runtime.Symbol(16/*rules*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 13: // rules ::= LESSTHAN states MORETHAN LBRACE rules RBRACE - { -- Vector RESULT = null; -+ Vector RESULT =null; - int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; -@@ -1572,14 +2576,14 @@ - } - RESULT = rlist; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(16/*rules*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-5)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-5)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 12: // rules ::= rules LESSTHAN states MORETHAN LBRACE rules RBRACE - { -- Vector RESULT = null; -+ Vector RESULT =null; - int rlist1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).left; - int rlist1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).right; - Vector rlist1 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).value; -@@ -1601,41 +2605,41 @@ - } - RESULT = rlist1; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(16/*rules*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 11: // rules ::= rules rule - { -- Vector RESULT = null; -+ Vector RESULT =null; - int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; -- int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - rlist.addElement(r); RESULT = rlist; -- CUP$LexParse$result = new java_cup.runtime.Symbol(16/*rules*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 10: // macro ::= IDENT EQUALS - { -- Object RESULT = null; -+ Object RESULT =null; -- int eleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left; -- int eright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right; -- Object e = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).value; -+ int eleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; -+ int eright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; -+ Object e = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); -- CUP$LexParse$result = new java_cup.runtime.Symbol(2/*macro*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 9: // macro ::= IDENT EQUALS series REGEXPEND - { -- Object RESULT = null; -+ Object RESULT =null; - int nameleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int nameright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - String name = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; -@@ -1643,79 +2647,79 @@ - int definitionright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp definition = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - macros.insert(name, definition); -- CUP$LexParse$result = new java_cup.runtime.Symbol(2/*macro*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 8: // macro ::= UNICODE - { -- Object RESULT = null; -+ Object RESULT =null; - charClasses.setMaxCharCode(0xFFFF); -- CUP$LexParse$result = new java_cup.runtime.Symbol(2/*macro*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 7: // macro ::= FULL - { -- Object RESULT = null; -+ Object RESULT =null; - charClasses.setMaxCharCode(255); -- CUP$LexParse$result = new java_cup.runtime.Symbol(2/*macro*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 6: // macro ::= ASCII - { -- Object RESULT = null; -+ Object RESULT =null; - charClasses.setMaxCharCode(127); -- CUP$LexParse$result = new java_cup.runtime.Symbol(2/*macro*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 5: // macros ::= error - { -- Object RESULT = null; -+ Object RESULT =null; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(1/*macros*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 4: // macros ::= macros macro - { -- Object RESULT = null; -+ Object RESULT =null; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(1/*macros*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 3: // macros ::= - { -- Object RESULT = null; -+ Object RESULT =null; - -- CUP$LexParse$result = new java_cup.runtime.Symbol(1/*macros*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 2: // specification ::= - { -- NFA RESULT = null; -+ NFA RESULT =null; - - fatalError(ErrorMessages.NO_LEX_SPEC); - -- CUP$LexParse$result = new java_cup.runtime.Symbol(4/*specification*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 1: // specification ::= USERCODE macros DELIMITER rules - { -- NFA RESULT = null; -+ NFA RESULT =null; - - scanner.t.stop(); - -@@ -1762,19 +2766,19 @@ - Out.time(ErrorMessages.NFA_TOOK, t); - - -- CUP$LexParse$result = new java_cup.runtime.Symbol(4/*specification*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 0: // $START ::= specification EOF - { -- Object RESULT = null; -+ Object RESULT =null; - int start_valleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int start_valright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - NFA start_val = (NFA)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = start_val; -- CUP$LexParse$result = new java_cup.runtime.Symbol(0/*$START*/, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-0)).right, RESULT); -+ CUP$LexParse$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - /* ACCEPT */ - CUP$LexParse$parser.done_parsing(); -Index: jflex/src/JFlex/LexScan.java -=================================================================== ---- jflex/src/JFlex/LexScan.java (revision 433) -+++ jflex/src/JFlex/LexScan.java Tue Dec 01 08:12:15 EST 2009 -@@ -1,4 +1,4 @@ --/* The following code was generated by JFlex 1.4.3 on 5/27/08 8:22 PM */ -+/* The following code was generated by JFlex 1.4.3 on 12/1/09 8:12 AM */ - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * -@@ -77,11 +77,11 @@ - private static final String ZZ_CMAP_PACKED = - "\10\25\1\26\1\10\1\13\2\11\1\12\16\25\4\0\1\10\1\76"+ - "\1\32\1\0\1\103\1\35\1\22\1\33\1\100\1\101\1\30\1\102"+ -- "\1\15\1\106\1\14\1\31\1\7\1\66\2\7\2\3\1\67\1\64"+ -+ "\1\15\1\110\1\14\1\31\1\7\1\66\2\7\2\3\1\67\1\64"+ - "\1\65\1\1\1\105\1\0\1\20\1\71\1\21\1\23\1\0\4\2"+ -- "\1\72\1\74\10\24\1\73\13\24\1\16\1\4\1\17\1\104\1\24"+ -+ "\1\72\1\74\10\24\1\73\13\24\1\16\1\4\1\17\1\104\1\106"+ - "\1\0\1\53\1\57\1\55\1\62\1\46\1\47\1\63\1\42\1\37"+ -- "\1\60\1\70\1\51\1\56\1\40\1\44\1\61\1\24\1\43\1\54"+ -+ "\1\60\1\70\1\51\1\56\1\40\1\44\1\61\1\107\1\43\1\54"+ - "\1\41\1\6\1\52\1\45\1\5\1\50\1\24\1\36\1\75\1\34"+ - "\1\77\6\25\1\27\32\25\2\0\4\24\4\0\1\24\2\0\1\25"+ - "\7\0\1\24\4\0\1\24\5\0\27\24\1\0\37\24\1\0\u013f\24"+ -@@ -196,39 +196,46 @@ - "\1\11\2\117\1\11\1\0\1\71\1\0\1\120\6\0"+ - "\1\121\1\122\1\0\1\37\4\0\1\104\1\0\1\123"+ - "\1\124\2\125\3\0\2\11\1\126\24\11\1\127\12\11"+ -- "\3\0\2\11\1\0\2\120\14\0\2\123\3\0\20\11"+ -+ "\3\0\2\11\1\0\2\120\15\0\2\123\3\0\20\11"+ - "\1\130\3\11\1\131\10\11\1\132\6\11\1\133\1\11"+ -- "\1\134\1\130\1\0\2\11\1\0\1\120\13\0\1\123"+ -+ "\1\134\1\130\1\0\2\11\1\0\1\120\14\0\1\123"+ - "\5\0\11\11\1\0\1\11\1\135\5\11\1\136\1\137"+ -- "\17\11\1\140\1\141\2\11\7\0\2\37\10\0\2\142"+ -+ "\17\11\1\140\1\141\2\11\10\0\2\37\10\0\2\142"+ - "\3\0\11\11\1\143\1\0\11\11\1\144\4\11\1\145"+ -- "\1\0\3\11\1\146\1\147\2\11\6\0\1\150\1\37"+ -+ "\1\0\3\11\1\146\1\147\2\11\7\0\1\150\1\37"+ - "\3\0\1\37\6\0\2\151\4\0\1\141\1\11\1\152"+ - "\1\126\3\11\1\153\2\154\1\143\4\0\11\11\2\155"+ -- "\2\11\1\156\1\11\2\157\1\11\1\160\6\0\1\37"+ -+ "\2\11\1\156\1\11\2\157\1\11\1\160\7\0\1\37"+ - "\6\0\1\37\13\0\1\11\1\161\2\11\1\154\1\162"+ - "\1\154\1\143\3\0\2\11\1\163\2\11\1\164\3\11"+ - "\1\155\1\165\1\155\1\166\1\0\1\11\1\156\1\0"+ -- "\1\167\1\157\2\170\1\157\4\0\1\171\1\172\2\37"+ -+ "\1\167\1\157\2\170\1\157\5\0\1\171\1\172\2\37"+ - "\4\0\2\37\7\0\2\173\1\0\3\11\2\162\2\143"+ - "\1\174\2\175\1\0\1\11\1\0\5\11\2\165\2\0"+ -- "\1\11\1\0\2\170\2\0\1\176\2\0\1\37\2\0"+ -+ "\1\11\1\0\2\170\3\0\1\176\2\0\1\37\2\0"+ - "\2\37\4\0\1\37\2\0\2\37\7\0\2\177\1\11"+ - "\1\162\1\0\1\143\1\0\1\174\1\0\1\175\1\200"+ - "\1\175\2\0\2\11\1\201\1\11\1\202\1\203\2\204"+ - "\1\165\1\0\1\205\3\0\1\205\1\0\1\205\1\156"+ -- "\3\0\1\206\1\0\4\37\3\0\4\37\3\0\2\207"+ -+ "\20\0\1\206\1\0\4\37\3\0\4\37\3\0\2\207"+ - "\1\0\1\177\1\210\1\177\1\211\3\0\2\200\2\0"+ -- "\2\11\1\201\2\212\1\204\1\213\1\204\12\0\3\37"+ -+ "\2\11\1\201\2\212\1\204\1\213\1\204\41\0\3\37"+ - "\5\0\3\37\1\0\2\214\1\0\2\210\2\143\1\174"+ - "\1\200\3\0\2\11\1\212\1\215\1\212\2\213\1\205"+ -- "\2\0\1\216\1\217\4\0\1\37\3\0\1\37\2\220"+ -+ "\33\0\1\216\1\217\4\0\1\37\3\0\1\37\2\220"+ - "\1\210\1\0\1\143\1\163\1\0\1\163\1\11\2\215"+ -- "\1\213\1\0\2\205\1\0\1\205\3\0\1\37\2\0"+ -- "\1\37\2\221\1\215\10\0\1\222\3\205"; -+ "\1\213\1\0\2\205\1\0\1\205\35\0\1\37\2\0"+ -+ "\1\37\2\221\1\215\74\0\1\222\3\205\51\0\1\223"+ -+ "\44\0\1\224\62\0\1\225\14\0\1\226\57\0\1\227"+ -+ "\1\230\7\0\1\231\1\232\1\233\33\0\1\234\17\0"+ -+ "\1\235\2\0\1\236\20\0\1\237\3\0\1\240\1\241"+ -+ "\2\0\1\242\1\243\3\0\1\244\1\0\1\245\1\246"+ -+ "\2\0\1\247\5\0\1\250\1\0\1\251\1\0\1\252"+ -+ "\16\0\1\253\5\0\1\254\2\0\1\255\3\0\1\256"+ -+ "\1\0\1\257\1\0\1\260"; - - private static int [] zzUnpackAction() { -- int [] result = new int[826]; -+ int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; -@@ -253,113 +260,172 @@ - private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); - - private static final String ZZ_ROWMAP_PACKED_0 = -- "\0\0\0\107\0\216\0\325\0\u011c\0\u0163\0\u01aa\0\u01f1"+ -- "\0\u0238\0\u027f\0\u02c6\0\u030d\0\u0354\0\u039b\0\u03e2\0\u0429"+ -- "\0\u0429\0\u0470\0\u04b7\0\u04fe\0\u0545\0\u058c\0\u0470\0\u05d3"+ -- "\0\u061a\0\u0470\0\u0661\0\u06a8\0\u06ef\0\u0736\0\u077d\0\u07c4"+ -- "\0\u080b\0\u0852\0\u0899\0\u08e0\0\u0927\0\u096e\0\u09b5\0\u0470"+ -- "\0\u0470\0\u09fc\0\u0a43\0\u0a8a\0\u0ad1\0\u0470\0\u0b18\0\u0b5f"+ -- "\0\u0470\0\u0470\0\u0ba6\0\u0470\0\u0bed\0\u0c34\0\u0470\0\u0470"+ -- "\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470\0\u0c7b\0\u0cc2\0\u0d09"+ -- "\0\u0d50\0\u0470\0\u0470\0\u0d97\0\u0470\0\u0dde\0\u0e25\0\u0e6c"+ -- "\0\u0470\0\u0eb3\0\u0470\0\u0efa\0\u0efa\0\u0b18\0\u0470\0\u0470"+ -- "\0\u0f41\0\u0470\0\u0f88\0\u0fcf\0\u0fcf\0\u0470\0\u1016\0\u0470"+ -- "\0\u105d\0\u0470\0\u10a4\0\u0470\0\u10eb\0\u1132\0\u1179\0\u11c0"+ -- "\0\u0545\0\u0470\0\u0470\0\u058c\0\u0470\0\u1207\0\u124e\0\u1295"+ -- "\0\u12dc\0\u1323\0\u136a\0\u13b1\0\u13f8\0\u143f\0\u1486\0\u14cd"+ -- "\0\u1514\0\u155b\0\u15a2\0\u15e9\0\u1630\0\u1677\0\u16be\0\u1705"+ -- "\0\u174c\0\u0470\0\u1793\0\u17da\0\u1821\0\u09b5\0\u1868\0\u0470"+ -- "\0\u18af\0\u0470\0\u18f6\0\u193d\0\u1984\0\u19cb\0\u0470\0\u0470"+ -- "\0\u0470\0\u0470\0\u0470\0\u0a8a\0\u0bed\0\u1a12\0\u1a59\0\u0470"+ -- "\0\u1aa0\0\u1ae7\0\u0bed\0\u0c34\0\u0470\0\u1b2e\0\u0cc2\0\u0d09"+ -- "\0\u0d50\0\u1b75\0\u1bbc\0\u1c03\0\u1c4a\0\u1c91\0\u0470\0\u1cd8"+ -- "\0\u1d1f\0\u1d66\0\u1dad\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470"+ -- "\0\u0470\0\u0efa\0\u0b18\0\u1df4\0\u0470\0\u0fcf\0\u1e3b\0\u1e82"+ -- "\0\u1ec9\0\u1f10\0\u1f57\0\u105d\0\u1f9e\0\u0470\0\u1207\0\u0470"+ -- "\0\u1fe5\0\u12dc\0\u0470\0\u202c\0\u2073\0\u20ba\0\u2101\0\u2148"+ -- "\0\u218f\0\u21d6\0\u221d\0\u2264\0\u22ab\0\u22f2\0\u2339\0\u2380"+ -- "\0\u23c7\0\u240e\0\u2455\0\u249c\0\u24e3\0\u252a\0\u2571\0\u25b8"+ -- "\0\u25ff\0\u2646\0\u268d\0\u26d4\0\u271b\0\u2762\0\u27a9\0\u27f0"+ -- "\0\u2837\0\u287e\0\u28c5\0\u290c\0\u2953\0\u299a\0\u29e1\0\u2a28"+ -- "\0\u2a6f\0\u2ab6\0\u0470\0\u2afd\0\u2b44\0\u2b8b\0\u2bd2\0\u2c19"+ -- "\0\u2c60\0\u2ca7\0\u2cee\0\u0470\0\u0470\0\u2d35\0\u2d7c\0\u2dc3"+ -- "\0\u2e0a\0\u2e51\0\u2e98\0\u0470\0\u2edf\0\u2f26\0\u0470\0\u1e3b"+ -- "\0\u0470\0\u2f6d\0\u2fb4\0\u2ffb\0\u3042\0\u3089\0\u30d0\0\u3117"+ -- "\0\u315e\0\u31a5\0\u31ec\0\u3233\0\u327a\0\u32c1\0\u3308\0\u334f"+ -- "\0\u3396\0\u33dd\0\u3424\0\u346b\0\u34b2\0\u34f9\0\u3540\0\u3587"+ -- "\0\u35ce\0\u3615\0\u365c\0\u36a3\0\u36ea\0\u3731\0\u3778\0\u37bf"+ -- "\0\u3806\0\u384d\0\u3894\0\u38db\0\u3922\0\u3969\0\u39b0\0\u39f7"+ -- "\0\u3a3e\0\u3a85\0\u3acc\0\u3b13\0\u0470\0\u3b5a\0\u3ba1\0\u3be8"+ -- "\0\u3c2f\0\u3c76\0\u3cbd\0\u3d04\0\u3d4b\0\u3d92\0\u3dd9\0\u3e20"+ -- "\0\u3e67\0\u3eae\0\u0470\0\u3ef5\0\u3f3c\0\u3f83\0\u3fca\0\u4011"+ -- "\0\u4058\0\u409f\0\u40e6\0\u412d\0\u4174\0\u41bb\0\u4202\0\u4249"+ -- "\0\u4290\0\u42d7\0\u431e\0\u4365\0\u43ac\0\u43f3\0\u443a\0\u124e"+ -- "\0\u4481\0\u44c8\0\u450f\0\u124e\0\u4556\0\u459d\0\u45e4\0\u462b"+ -- "\0\u4672\0\u46b9\0\u4700\0\u4747\0\u124e\0\u478e\0\u47d5\0\u481c"+ -- "\0\u4863\0\u48aa\0\u48f1\0\u124e\0\u4938\0\u0470\0\u0470\0\u497f"+ -- "\0\u49c6\0\u4a0d\0\u4a54\0\u2afd\0\u4a9b\0\u4ae2\0\u4b29\0\u4b70"+ -- "\0\u4bb7\0\u4bfe\0\u4c45\0\u4c8c\0\u4cd3\0\u4d1a\0\u4d61\0\u2edf"+ -- "\0\u4da8\0\u4def\0\u4e36\0\u4e7d\0\u4ec4\0\u4f0b\0\u4f52\0\u4f99"+ -- "\0\u4fe0\0\u5027\0\u506e\0\u50b5\0\u50fc\0\u5143\0\u518a\0\u51d1"+ -- "\0\u124e\0\u5218\0\u525f\0\u52a6\0\u52ed\0\u5334\0\u124e\0\u124e"+ -- "\0\u537b\0\u53c2\0\u5409\0\u5450\0\u5497\0\u54de\0\u5525\0\u556c"+ -- "\0\u55b3\0\u55fa\0\u5641\0\u5688\0\u56cf\0\u5716\0\u575d\0\u124e"+ -- "\0\u0470\0\u57a4\0\u57eb\0\u5832\0\u5879\0\u58c0\0\u5907\0\u594e"+ -- "\0\u5995\0\u59dc\0\u5a23\0\u5a6a\0\u5ab1\0\u5af8\0\u5b3f\0\u5b86"+ -- "\0\u5bcd\0\u5c14\0\u5c5b\0\u5ca2\0\u4def\0\u0470\0\u5ce9\0\u5d30"+ -- "\0\u5d77\0\u5dbe\0\u5e05\0\u5e4c\0\u5e93\0\u5eda\0\u5f21\0\u5f68"+ -- "\0\u5faf\0\u5ff6\0\u603d\0\u6084\0\u60cb\0\u6112\0\u6159\0\u61a0"+ -- "\0\u61e7\0\u622e\0\u6275\0\u62bc\0\u6303\0\u124e\0\u634a\0\u6391"+ -- "\0\u63d8\0\u641f\0\u124e\0\u6466\0\u64ad\0\u64f4\0\u653b\0\u124e"+ -- "\0\u124e\0\u6582\0\u2a28\0\u65c9\0\u6610\0\u6657\0\u669e\0\u66e5"+ -- "\0\u672c\0\u6773\0\u67ba\0\u6801\0\u6848\0\u688f\0\u68d6\0\u691d"+ -- "\0\u6964\0\u69ab\0\u69f2\0\u6a39\0\u6a80\0\u5c5b\0\u0470\0\u6ac7"+ -- "\0\u6b0e\0\u6b55\0\u6b9c\0\u124e\0\u6be3\0\u124e\0\u124e\0\u6c2a"+ -- "\0\u6c71\0\u6cb8\0\u124e\0\u6cff\0\u6d46\0\u6d8d\0\u6dd4\0\u6e1b"+ -- "\0\u6e62\0\u6ea9\0\u6ef0\0\u6f37\0\u6f7e\0\u6fc5\0\u700c\0\u7053"+ -- "\0\u709a\0\u70e1\0\u7128\0\u716f\0\u71b6\0\u71fd\0\u7244\0\u728b"+ -- "\0\u72d2\0\u7319\0\u7360\0\u2953\0\u0470\0\u73a7\0\u73ee\0\u7435"+ -- "\0\u747c\0\u74c3\0\u750a\0\u7551\0\u7598\0\u75df\0\u7626\0\u766d"+ -- "\0\u76b4\0\u76fb\0\u7742\0\u7789\0\u77d0\0\u7817\0\u785e\0\u78a5"+ -- "\0\u78ec\0\u7933\0\u797a\0\u79c1\0\u7a08\0\u7a4f\0\u7a96\0\u7add"+ -- "\0\u7b24\0\u7b6b\0\u7bb2\0\u7bf9\0\u7c40\0\u7c87\0\u7cce\0\u7d15"+ -- "\0\u7d5c\0\u7da3\0\u7dea\0\u7e31\0\u7e78\0\u7ebf\0\u124e\0\u7f06"+ -- "\0\u7f4d\0\u7f94\0\u7fdb\0\u8022\0\u8069\0\u124e\0\u80b0\0\u80f7"+ -- "\0\u813e\0\u8185\0\u124e\0\u81cc\0\u8213\0\u825a\0\u82a1\0\u82e8"+ -- "\0\u832f\0\u8376\0\u83bd\0\u0470\0\u0470\0\u8404\0\u844b\0\u8492"+ -- "\0\u84d9\0\u8520\0\u8567\0\u85ae\0\u85f5\0\u863c\0\u8683\0\u86ca"+ -- "\0\u8711\0\u8758\0\u879f\0\u87e6\0\u7a08\0\u0470\0\u882d\0\u8874"+ -- "\0\u88bb\0\u8902\0\u8949\0\u8990\0\u89d7\0\u8a1e\0\u8a65\0\u8aac"+ -- "\0\u8af3\0\u8b3a\0\u8b81\0\u8bc8\0\u8c0f\0\u8c56\0\u8c9d\0\u8ce4"+ -- "\0\u8d2b\0\u8d72\0\u8db9\0\u8e00\0\u8e47\0\u8e8e\0\u8ed5\0\u8f1c"+ -- "\0\u8f63\0\u8faa\0\u8ff1\0\u0470\0\u9038\0\u907f\0\u90c6\0\u910d"+ -- "\0\u9154\0\u919b\0\u91e2\0\u9229\0\u9270\0\u92b7\0\u92fe\0\u9345"+ -- "\0\u938c\0\u93d3\0\u941a\0\u9461\0\u94a8\0\u94ef\0\u9536\0\u957d"+ -- "\0\u95c4\0\u960b\0\u9652\0\u9699\0\u96e0\0\u9727\0\u976e\0\u97b5"+ -- "\0\u97fc\0\u9843\0\u988a\0\u98d1\0\u9918\0\u995f\0\u99a6\0\u99ed"+ -- "\0\u9a34\0\u9a7b\0\u9ac2\0\u9b09\0\u9b50\0\u124e\0\u124e\0\u9b97"+ -- "\0\u9bde\0\u9c25\0\u9c6c\0\u9cb3\0\u9cfa\0\u9d41\0\u9d88\0\u8e00"+ -- "\0\u9dcf\0\u8e8e\0\u9e16\0\u9e5d\0\u9ea4\0\u9eeb\0\u0470\0\u9f32"+ -- "\0\u9f79\0\u9fc0\0\ua007\0\ua04e\0\ua095\0\ua0dc\0\ua123\0\ua16a"+ -- "\0\ua1b1\0\ua1f8\0\ua23f\0\ua286\0\ua2cd\0\ua314\0\u960b\0\u0470"+ -- "\0\ua35b\0\ua3a2\0\ua3e9\0\ua430\0\ua477\0\ua4be\0\ua505\0\ua54c"+ -- "\0\ua593\0\ua5da\0\ua621\0\ua668\0\ua6af\0\ua6f6\0\ua73d\0\ua784"+ -- "\0\ua7cb\0\ua812\0\ua859\0\ua8a0\0\ua8e7\0\ua92e\0\ua975\0\ua9bc"+ -- "\0\uaa03\0\uaa4a\0\uaa91\0\uaad8\0\uab1f\0\uab66\0\uabad\0\uabf4"+ -- "\0\uac3b\0\uac82\0\uacc9\0\uad10\0\uad57\0\uad9e\0\uade5\0\uae2c"+ -- "\0\uae73\0\uaeba\0\ua314\0\u0470\0\uaf01\0\uaf48\0\uaf8f\0\uafd6"+ -- "\0\ub01d\0\ub064\0\ub0ab\0\ub0f2\0\ub139\0\ub180\0\ub1c7\0\ub20e"+ -- "\0\ub255\0\ub29c\0\ub2e3\0\ub32a\0\ub371\0\ua8e7\0\ub3b8\0\ub3ff"+ -- "\0\u0470\0\u0470\0\ub446\0\ub48d\0\ub4d4\0\ub51b\0\ub562\0\ub5a9"+ -- "\0\ub5f0\0\ub637\0\ub67e\0\uaf01\0\u0470\0\ub6c5\0\ub70c\0\ub753"+ -- "\0\u0470\0\ub79a\0\u124e\0\ub7e1\0\ub828\0\ub86f\0\ub8b6\0\ub8fd"+ -- "\0\ub3b8\0\ub944\0\ub98b\0\ub3ff\0\ub9d2\0\uba19\0\uba60\0\ubaa7"+ -- "\0\ubaee\0\ubb35\0\ubb7c\0\u0470\0\u124e\0\ubbc3\0\ubc0a\0\ubc51"+ -- "\0\ubc98\0\ubcdf\0\ubd26\0\ubd6d\0\ubdb4\0\ubdfb\0\u0470\0\ubdb4"+ -- "\0\ube42\0\ubdfb"; -+ "\0\0\0\111\0\222\0\333\0\u0124\0\u016d\0\u01b6\0\u01ff"+ -+ "\0\u0248\0\u0291\0\u02da\0\u0323\0\u036c\0\u03b5\0\u03fe\0\u0447"+ -+ "\0\u0447\0\u0490\0\u04d9\0\u0522\0\u056b\0\u05b4\0\u0490\0\u05fd"+ -+ "\0\u0646\0\u0490\0\u068f\0\u06d8\0\u0721\0\u076a\0\u07b3\0\u07fc"+ -+ "\0\u0845\0\u088e\0\u08d7\0\u0920\0\u0969\0\u09b2\0\u09fb\0\u0490"+ -+ "\0\u0490\0\u0a44\0\u0a8d\0\u0ad6\0\u0b1f\0\u0490\0\u0b68\0\u0bb1"+ -+ "\0\u0490\0\u0490\0\u0bfa\0\u0490\0\u0c43\0\u0c8c\0\u0490\0\u0490"+ -+ "\0\u0490\0\u0490\0\u0490\0\u0490\0\u0490\0\u0cd5\0\u0d1e\0\u0d67"+ -+ "\0\u0db0\0\u0490\0\u0490\0\u0df9\0\u0490\0\u0e42\0\u0e8b\0\u0ed4"+ -+ "\0\u0490\0\u0f1d\0\u0490\0\u0f66\0\u0f66\0\u0b68\0\u0490\0\u0490"+ -+ "\0\u0faf\0\u0490\0\u0ff8\0\u1041\0\u1041\0\u0490\0\u108a\0\u0490"+ -+ "\0\u10d3\0\u0490\0\u111c\0\u0490\0\u1165\0\u11ae\0\u11f7\0\u1240"+ -+ "\0\u056b\0\u0490\0\u0490\0\u05b4\0\u0490\0\u1289\0\u12d2\0\u131b"+ -+ "\0\u1364\0\u13ad\0\u13f6\0\u143f\0\u1488\0\u14d1\0\u151a\0\u1563"+ -+ "\0\u15ac\0\u15f5\0\u163e\0\u1687\0\u16d0\0\u1719\0\u1762\0\u17ab"+ -+ "\0\u17f4\0\u0490\0\u183d\0\u1886\0\u18cf\0\u09fb\0\u1918\0\u0490"+ -+ "\0\u1961\0\u0490\0\u19aa\0\u19f3\0\u1a3c\0\u1a85\0\u0490\0\u0490"+ -+ "\0\u0490\0\u0490\0\u0490\0\u0ad6\0\u0c43\0\u1ace\0\u1b17\0\u0490"+ -+ "\0\u1b60\0\u1ba9\0\u0c43\0\u0c8c\0\u0490\0\u1bf2\0\u0d1e\0\u0d67"+ -+ "\0\u0db0\0\u1c3b\0\u1c84\0\u1ccd\0\u1d16\0\u1d5f\0\u0490\0\u1da8"+ -+ "\0\u1df1\0\u1e3a\0\u1e83\0\u0490\0\u0490\0\u0490\0\u0490\0\u0490"+ -+ "\0\u0490\0\u0f66\0\u0b68\0\u1ecc\0\u0490\0\u1041\0\u1f15\0\u1f5e"+ -+ "\0\u1fa7\0\u1ff0\0\u2039\0\u10d3\0\u2082\0\u0490\0\u1289\0\u0490"+ -+ "\0\u20cb\0\u1364\0\u0490\0\u2114\0\u215d\0\u21a6\0\u21ef\0\u2238"+ -+ "\0\u2281\0\u22ca\0\u2313\0\u235c\0\u23a5\0\u23ee\0\u2437\0\u2480"+ -+ "\0\u24c9\0\u2512\0\u255b\0\u25a4\0\u25ed\0\u2636\0\u267f\0\u26c8"+ -+ "\0\u2711\0\u275a\0\u27a3\0\u27ec\0\u2835\0\u287e\0\u28c7\0\u2910"+ -+ "\0\u2959\0\u29a2\0\u29eb\0\u2a34\0\u2a7d\0\u2ac6\0\u2b0f\0\u2b58"+ -+ "\0\u2ba1\0\u2bea\0\u0490\0\u2c33\0\u2c7c\0\u2cc5\0\u2d0e\0\u2d57"+ -+ "\0\u2da0\0\u2de9\0\u2e32\0\u0490\0\u0490\0\u2e7b\0\u2ec4\0\u2f0d"+ -+ "\0\u2f56\0\u2f9f\0\u2fe8\0\u0490\0\u3031\0\u307a\0\u0490\0\u1f15"+ -+ "\0\u0490\0\u30c3\0\u310c\0\u3155\0\u319e\0\u31e7\0\u3230\0\u3279"+ -+ "\0\u32c2\0\u330b\0\u3354\0\u339d\0\u33e6\0\u342f\0\u3478\0\u34c1"+ -+ "\0\u350a\0\u3553\0\u359c\0\u35e5\0\u362e\0\u3677\0\u36c0\0\u3709"+ -+ "\0\u3752\0\u379b\0\u37e4\0\u382d\0\u3876\0\u38bf\0\u3908\0\u3951"+ -+ "\0\u399a\0\u39e3\0\u3a2c\0\u3a75\0\u3abe\0\u3b07\0\u3b50\0\u3b99"+ -+ "\0\u3be2\0\u3c2b\0\u3c74\0\u3cbd\0\u0490\0\u3d06\0\u3d4f\0\u3d98"+ -+ "\0\u3de1\0\u3e2a\0\u3e73\0\u3ebc\0\u3f05\0\u3f4e\0\u3f97\0\u3fe0"+ -+ "\0\u4029\0\u4072\0\u40bb\0\u0490\0\u4104\0\u414d\0\u4196\0\u41df"+ -+ "\0\u4228\0\u4271\0\u42ba\0\u4303\0\u434c\0\u4395\0\u43de\0\u4427"+ -+ "\0\u4470\0\u44b9\0\u4502\0\u454b\0\u4594\0\u45dd\0\u4626\0\u466f"+ -+ "\0\u12d2\0\u46b8\0\u4701\0\u474a\0\u12d2\0\u4793\0\u47dc\0\u4825"+ -+ "\0\u486e\0\u48b7\0\u4900\0\u4949\0\u4992\0\u12d2\0\u49db\0\u4a24"+ -+ "\0\u4a6d\0\u4ab6\0\u4aff\0\u4b48\0\u12d2\0\u4b91\0\u0490\0\u0490"+ -+ "\0\u4bda\0\u4c23\0\u4c6c\0\u4cb5\0\u2c33\0\u4cfe\0\u4d47\0\u4d90"+ -+ "\0\u4dd9\0\u4e22\0\u4e6b\0\u4eb4\0\u4efd\0\u4f46\0\u4f8f\0\u4fd8"+ -+ "\0\u5021\0\u3031\0\u506a\0\u50b3\0\u50fc\0\u5145\0\u518e\0\u51d7"+ -+ "\0\u5220\0\u5269\0\u52b2\0\u52fb\0\u5344\0\u538d\0\u53d6\0\u541f"+ -+ "\0\u5468\0\u54b1\0\u12d2\0\u54fa\0\u5543\0\u558c\0\u55d5\0\u561e"+ -+ "\0\u12d2\0\u12d2\0\u5667\0\u56b0\0\u56f9\0\u5742\0\u578b\0\u57d4"+ -+ "\0\u581d\0\u5866\0\u58af\0\u58f8\0\u5941\0\u598a\0\u59d3\0\u5a1c"+ -+ "\0\u5a65\0\u12d2\0\u0490\0\u5aae\0\u5af7\0\u5b40\0\u5b89\0\u5bd2"+ -+ "\0\u5c1b\0\u5c64\0\u5cad\0\u5cf6\0\u5d3f\0\u5d88\0\u5dd1\0\u5e1a"+ -+ "\0\u5e63\0\u5eac\0\u5ef5\0\u5f3e\0\u5f87\0\u5fd0\0\u6019\0\u50b3"+ -+ "\0\u0490\0\u6062\0\u60ab\0\u60f4\0\u613d\0\u6186\0\u61cf\0\u6218"+ -+ "\0\u6261\0\u62aa\0\u62f3\0\u633c\0\u6385\0\u63ce\0\u6417\0\u6460"+ -+ "\0\u64a9\0\u64f2\0\u653b\0\u6584\0\u65cd\0\u6616\0\u665f\0\u66a8"+ -+ "\0\u12d2\0\u66f1\0\u673a\0\u6783\0\u67cc\0\u12d2\0\u6815\0\u685e"+ -+ "\0\u68a7\0\u68f0\0\u12d2\0\u12d2\0\u6939\0\u2b58\0\u6982\0\u69cb"+ -+ "\0\u6a14\0\u6a5d\0\u6aa6\0\u6aef\0\u6b38\0\u6b81\0\u6bca\0\u6c13"+ -+ "\0\u6c5c\0\u6ca5\0\u6cee\0\u6d37\0\u6d80\0\u6dc9\0\u6e12\0\u6e5b"+ -+ "\0\u6ea4\0\u5fd0\0\u0490\0\u6eed\0\u6f36\0\u6f7f\0\u6fc8\0\u12d2"+ -+ "\0\u7011\0\u12d2\0\u12d2\0\u705a\0\u70a3\0\u70ec\0\u12d2\0\u7135"+ -+ "\0\u717e\0\u71c7\0\u7210\0\u7259\0\u72a2\0\u72eb\0\u7334\0\u737d"+ -+ "\0\u73c6\0\u740f\0\u7458\0\u74a1\0\u74ea\0\u7533\0\u757c\0\u75c5"+ -+ "\0\u760e\0\u7657\0\u76a0\0\u76e9\0\u7732\0\u777b\0\u77c4\0\u2a7d"+ -+ "\0\u0490\0\u780d\0\u7856\0\u789f\0\u78e8\0\u7931\0\u797a\0\u79c3"+ -+ "\0\u7a0c\0\u7a55\0\u7a9e\0\u7ae7\0\u7b30\0\u7b79\0\u7bc2\0\u7c0b"+ -+ "\0\u7c54\0\u7c9d\0\u7ce6\0\u7d2f\0\u7d78\0\u7dc1\0\u7e0a\0\u7e53"+ -+ "\0\u7e9c\0\u7ee5\0\u7f2e\0\u7f77\0\u7fc0\0\u8009\0\u8052\0\u809b"+ -+ "\0\u80e4\0\u812d\0\u8176\0\u81bf\0\u8208\0\u8251\0\u829a\0\u82e3"+ -+ "\0\u832c\0\u8375\0\u83be\0\u12d2\0\u8407\0\u8450\0\u8499\0\u84e2"+ -+ "\0\u852b\0\u8574\0\u12d2\0\u85bd\0\u8606\0\u864f\0\u8698\0\u12d2"+ -+ "\0\u86e1\0\u872a\0\u8773\0\u87bc\0\u8805\0\u884e\0\u8897\0\u88e0"+ -+ "\0\u8929\0\u0490\0\u0490\0\u8972\0\u89bb\0\u8a04\0\u8a4d\0\u8a96"+ -+ "\0\u8adf\0\u8b28\0\u8b71\0\u8bba\0\u8c03\0\u8c4c\0\u8c95\0\u8cde"+ -+ "\0\u8d27\0\u8d70\0\u7ee5\0\u0490\0\u8db9\0\u8e02\0\u8e4b\0\u8e94"+ -+ "\0\u8edd\0\u8f26\0\u8f6f\0\u8fb8\0\u9001\0\u904a\0\u9093\0\u90dc"+ -+ "\0\u9125\0\u916e\0\u91b7\0\u9200\0\u9249\0\u9292\0\u92db\0\u9324"+ -+ "\0\u936d\0\u93b6\0\u93ff\0\u9448\0\u9491\0\u94da\0\u9523\0\u956c"+ -+ "\0\u95b5\0\u95fe\0\u0490\0\u9647\0\u9690\0\u96d9\0\u9722\0\u976b"+ -+ "\0\u97b4\0\u97fd\0\u9846\0\u988f\0\u98d8\0\u9921\0\u996a\0\u99b3"+ -+ "\0\u99fc\0\u9a45\0\u9a8e\0\u9ad7\0\u9b20\0\u9b69\0\u9bb2\0\u9bfb"+ -+ "\0\u9c44\0\u9c8d\0\u9cd6\0\u9d1f\0\u9d68\0\u9db1\0\u9dfa\0\u9e43"+ -+ "\0\u9e8c\0\u9ed5\0\u9f1e\0\u9f67\0\u9fb0\0\u9ff9\0\ua042\0\ua08b"+ -+ "\0\ua0d4\0\ua11d\0\ua166\0\ua1af\0\u12d2\0\u12d2\0\ua1f8\0\ua241"+ -+ "\0\ua28a\0\ua2d3\0\ua31c\0\ua365\0\ua3ae\0\ua3f7\0\u93b6\0\ua440"+ -+ "\0\u9448\0\ua489\0\ua4d2\0\ua51b\0\ua564\0\ua5ad\0\ua5f6\0\ua63f"+ -+ "\0\ua688\0\ua6d1\0\ua71a\0\ua763\0\ua7ac\0\ua7f5\0\ua83e\0\ua887"+ -+ "\0\ua8d0\0\ua919\0\u0490\0\ua962\0\ua9ab\0\ua9f4\0\uaa3d\0\uaa86"+ -+ "\0\uaacf\0\uab18\0\uab61\0\uabaa\0\uabf3\0\uac3c\0\uac85\0\uacce"+ -+ "\0\uad17\0\uad60\0\u9c44\0\u0490\0\uada9\0\uadf2\0\uae3b\0\uae84"+ -+ "\0\uaecd\0\uaf16\0\uaf5f\0\uafa8\0\uaff1\0\ub03a\0\ub083\0\ub0cc"+ -+ "\0\ub115\0\ub15e\0\ub1a7\0\ub1f0\0\ub239\0\ub282\0\ub2cb\0\ub314"+ -+ "\0\ub35d\0\ub3a6\0\ub3ef\0\ub438\0\ub481\0\ub4ca\0\ub513\0\ub55c"+ -+ "\0\ub5a5\0\ub5ee\0\ub637\0\ub680\0\ub6c9\0\ub712\0\ub75b\0\ub7a4"+ -+ "\0\ub7ed\0\ub836\0\ub87f\0\ub8c8\0\ub911\0\ub95a\0\ub9a3\0\ub9ec"+ -+ "\0\uba35\0\uba7e\0\ubac7\0\ubb10\0\ubb59\0\ubba2\0\ubbeb\0\ubc34"+ -+ "\0\ubc7d\0\ubcc6\0\ubd0f\0\ubd58\0\ubda1\0\ubdea\0\ube33\0\ube7c"+ -+ "\0\ubec5\0\ubf0e\0\ubf57\0\ubfa0\0\ubfe9\0\uad60\0\u0490\0\uc032"+ -+ "\0\uc07b\0\uc0c4\0\uc10d\0\uc156\0\uc19f\0\uc1e8\0\uc231\0\uc27a"+ -+ "\0\uc2c3\0\uc30c\0\uc355\0\uc39e\0\uc3e7\0\uc430\0\uc479\0\uc4c2"+ -+ "\0\ub35d\0\uc50b\0\uc554\0\uc59d\0\uc5e6\0\uc62f\0\uc678\0\uc6c1"+ -+ "\0\uc70a\0\uc753\0\uc79c\0\uc7e5\0\uc82e\0\uc877\0\uc8c0\0\uc909"+ -+ "\0\uc952\0\uc99b\0\uc9e4\0\uca2d\0\uca76\0\ucabf\0\ucb08\0\ucb51"+ -+ "\0\ucb9a\0\ucbe3\0\ucc2c\0\ucc75\0\u0490\0\u0490\0\uccbe\0\ucd07"+ -+ "\0\ucd50\0\ucd99\0\ucde2\0\uce2b\0\uce74\0\ucebd\0\ucf06\0\uc032"+ -+ "\0\u0490\0\ucf4f\0\ucf98\0\ucfe1\0\u0490\0\ud02a\0\u12d2\0\ud073"+ -+ "\0\ud0bc\0\ud105\0\ud14e\0\ud197\0\uc50b\0\ud1e0\0\ud229\0\uc554"+ -+ "\0\ud272\0\ud2bb\0\ud304\0\ud34d\0\ud396\0\ud3df\0\ud428\0\ud471"+ -+ "\0\ud4ba\0\ud503\0\ud54c\0\ud595\0\ud5de\0\ud627\0\ud670\0\ud6b9"+ -+ "\0\ud702\0\ud74b\0\ud794\0\ud7dd\0\ud826\0\ud86f\0\ud8b8\0\ud901"+ -+ "\0\ud94a\0\ud993\0\ud9dc\0\uda25\0\uda6e\0\udab7\0\udb00\0\udb49"+ -+ "\0\udb92\0\u0490\0\u12d2\0\udbdb\0\udc24\0\udc6d\0\udcb6\0\udcff"+ -+ "\0\udd48\0\udd91\0\uddda\0\ude23\0\ude6c\0\udeb5\0\udefe\0\udf47"+ -+ "\0\udf90\0\udfd9\0\ue022\0\ue06b\0\ue0b4\0\ue0fd\0\ue146\0\ue18f"+ -+ "\0\ue1d8\0\ue221\0\ue26a\0\ue2b3\0\ue2fc\0\ue345\0\ue38e\0\ue3d7"+ -+ "\0\ue420\0\ue469\0\ue4b2\0\ue4fb\0\ue544\0\ue58d\0\ue5d6\0\ue61f"+ -+ "\0\ue668\0\ue6b1\0\ue6fa\0\ue743\0\ue78c\0\ue7d5\0\ue81e\0\ue867"+ -+ "\0\ue8b0\0\ue8f9\0\ue942\0\ue98b\0\ue9d4\0\uea1d\0\uea66\0\ueaaf"+ -+ "\0\ueaf8\0\ueb41\0\ueb8a\0\uebd3\0\uec1c\0\uec65\0\uecae\0\uecf7"+ -+ "\0\u0490\0\ue544\0\ued40\0\ue58d\0\ued89\0\uedd2\0\uee1b\0\uee64"+ -+ "\0\ueead\0\ueef6\0\uef3f\0\uef88\0\uefd1\0\uf01a\0\uf063\0\uf0ac"+ -+ "\0\uf0f5\0\uf13e\0\uf187\0\uf1d0\0\uf219\0\uf262\0\uf2ab\0\uf2f4"+ -+ "\0\uf33d\0\uf386\0\uf3cf\0\uf418\0\uf461\0\uf4aa\0\uf4f3\0\uf53c"+ -+ "\0\uf585\0\uf5ce\0\uf617\0\uf660\0\uf6a9\0\uf6f2\0\uf73b\0\uf784"+ -+ "\0\uf7cd\0\uf816\0\uf85f\0\uf8a8\0\uf8f1\0\u0490\0\uf93a\0\uf983"+ -+ "\0\uf9cc\0\ufa15\0\ufa5e\0\ufaa7\0\ufaf0\0\ufb39\0\ufb82\0\ufbcb"+ -+ "\0\ufc14\0\ufc5d\0\ufca6\0\ufcef\0\ufd38\0\ufd81\0\ufdca\0\ufe13"+ -+ "\0\ufe5c\0\ufea5\0\ufeee\0\uff37\0\uff80\0\uffc9\1\22\1\133"+ -+ "\1\244\1\355\1\u0136\1\u017f\1\u01c8\1\u0211\1\u025a\1\u02a3"+ -+ "\1\u02ec\1\u0335\0\u0490\1\u037e\1\u03c7\1\u0410\1\u0459\1\u04a2"+ -+ "\1\u04eb\1\u0534\1\u057d\1\u05c6\1\u060f\1\u0658\1\u06a1\1\u06ea"+ -+ "\1\u0733\1\u077c\1\u07c5\1\u080e\1\u0857\1\u08a0\1\u08e9\1\u0932"+ -+ "\1\u097b\1\u09c4\1\u0a0d\1\u0a56\1\u0a9f\1\u0ae8\1\u0b31\1\u0b7a"+ -+ "\1\u0bc3\1\u0c0c\1\u0c55\1\u0c9e\1\u0ce7\1\u0d30\1\u0d79\1\u0dc2"+ -+ "\1\u0e0b\1\u0e54\1\u0e9d\1\u0ee6\1\u0f2f\1\u0f78\1\u0fc1\1\u100a"+ -+ "\1\u1053\1\u109c\1\u10e5\1\u112e\1\u1177\0\u0490\1\u11c0\1\u1209"+ -+ "\1\u1252\1\u129b\1\u12e4\1\u132d\1\u1376\1\u13bf\1\u1408\1\u1451"+ -+ "\1\u149a\1\u14e3\0\u0490\1\u152c\1\u1575\1\u15be\1\u1607\1\u1650"+ -+ "\1\u1699\1\u16e2\1\u172b\1\u1774\1\u17bd\1\u1806\1\u184f\1\u1898"+ -+ "\1\u18e1\1\u192a\1\u1973\1\u19bc\1\u1a05\1\u1a4e\1\u1a97\1\u1ae0"+ -+ "\1\u1b29\1\u1b72\1\u1bbb\1\u1c04\1\u1c4d\1\u1c96\1\u1cdf\1\u1d28"+ -+ "\1\u1d71\1\u1dba\1\u1e03\1\u1e4c\1\u1e95\1\u1ede\1\u1f27\1\u1f70"+ -+ "\1\u1fb9\1\u2002\1\u204b\1\u2094\1\u20dd\1\u2126\1\u216f\1\u21b8"+ -+ "\1\u2201\1\u224a\0\u0490\0\u0490\1\u2293\1\u22dc\1\u2325\1\u236e"+ -+ "\1\u23b7\1\u2400\1\u2449\0\u0490\0\u0490\0\u0490\1\u2492\1\u24db"+ -+ "\1\u2524\1\u256d\1\u25b6\1\u25ff\1\u2648\1\u2691\1\u26da\1\u2723"+ -+ "\1\u276c\1\u27b5\1\u27fe\1\u2847\1\u2890\1\u28d9\1\u2922\1\u296b"+ -+ "\1\u29b4\1\u29fd\1\u2a46\1\u2a8f\1\u2ad8\1\u2b21\1\u2b6a\1\u2bb3"+ -+ "\1\u2bfc\0\u0490\1\u2c45\1\u2c8e\1\u2cd7\1\u2d20\1\u2d69\1\u2db2"+ -+ "\1\u2dfb\1\u2e44\1\u2e8d\1\u2ed6\1\u2f1f\1\u2f68\1\u2fb1\1\u2ffa"+ -+ "\1\u3043\0\u0490\1\u308c\1\u30d5\0\u0490\1\u311e\1\u3167\1\u31b0"+ -+ "\1\u31f9\1\u3242\1\u328b\1\u32d4\1\u331d\1\u3366\1\u33af\1\u33f8"+ -+ "\1\u3441\1\u348a\1\u34d3\1\u351c\1\u3565\0\u0490\1\u35ae\1\u35f7"+ -+ "\1\u3640\0\u0490\0\u0490\1\u3689\1\u36d2\0\u0490\0\u0490\1\u371b"+ -+ "\1\u3764\1\u37ad\0\u0490\1\u37f6\0\u0490\0\u0490\1\u383f\1\u3888"+ -+ "\0\u0490\1\u38d1\1\u391a\1\u3963\1\u39ac\1\u39f5\0\u0490\1\u3a3e"+ -+ "\0\u0490\1\u3a87\0\u0490\1\u3ad0\1\u3b19\1\u3b62\1\u3bab\1\u3bf4"+ -+ "\1\u3c3d\1\u3c86\1\u3ccf\1\u3d18\1\u3d61\1\u3daa\1\u3df3\1\u3e3c"+ -+ "\1\u3e85\0\u0490\1\u3ece\1\u3f17\1\u3f60\1\u3fa9\1\u3ff2\0\u0490"+ -+ "\1\u403b\1\u4084\0\u0490\1\u40cd\1\u4116\1\u415f\0\u0490\1\u41a8"+ -+ "\0\u0490\1\u41f1\0\u0490"; - - private static int [] zzUnpackRowMap() { -- int [] result = new int[826]; -+ int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; -@@ -382,1092 +448,1291 @@ - private static final int [] ZZ_TRANS = zzUnpackTrans(); - - private static final String ZZ_TRANS_PACKED_0 = -- "\11\20\2\21\1\22\13\20\1\21\5\20\1\23\51\20"+ -- "\30\24\1\25\1\26\55\24\2\27\1\30\2\27\2\30"+ -+ "\11\20\2\21\1\22\13\20\1\21\5\20\1\23\53\20"+ -+ "\30\24\1\25\1\26\57\24\2\27\1\30\2\27\2\30"+ - "\1\27\1\31\1\32\1\33\1\32\1\27\1\34\6\27"+ - "\1\30\2\27\1\32\7\27\25\30\4\27\1\30\1\27"+ -- "\3\30\6\27\1\30\5\27\1\35\2\27\2\35\1\27"+ -- "\1\36\3\37\10\27\1\35\1\27\1\36\1\37\1\27"+ -- "\1\40\3\27\1\41\1\27\25\35\4\27\1\35\1\42"+ -- "\3\35\6\27\1\35\5\27\1\35\2\27\2\35\1\27"+ -- "\1\43\3\37\10\27\1\35\1\27\1\43\1\37\1\27"+ -- "\1\40\3\27\1\44\1\27\25\35\4\27\1\35\1\42"+ -- "\3\35\6\27\1\35\13\27\4\45\4\27\1\46\5\27"+ -- "\2\45\1\27\1\47\2\27\1\50\52\27\4\51\1\52"+ -- "\3\51\1\53\1\54\1\55\1\54\1\56\1\51\1\57"+ -- "\1\51\1\60\2\51\1\61\2\51\1\53\1\54\1\62"+ -- "\1\63\1\64\3\51\1\65\36\51\1\66\1\67\1\70"+ -- "\1\71\1\72\1\73\1\74\1\75\2\51\31\76\1\77"+ -- "\1\100\1\101\1\102\1\76\1\103\50\76\2\27\1\35"+ -- "\2\27\2\35\1\27\4\104\1\27\1\105\3\27\1\106"+ -- "\2\27\1\35\1\27\2\104\7\27\25\35\4\27\1\35"+ -- "\1\27\3\35\6\27\1\35\3\27\4\107\1\110\4\107"+ -- "\1\111\1\112\1\111\13\107\1\111\2\107\1\113\54\107"+ -+ "\3\30\6\27\1\30\2\27\2\30\3\27\1\35\2\27"+ -+ "\2\35\1\27\1\36\3\37\10\27\1\35\1\27\1\36"+ -+ "\1\37\1\27\1\40\3\27\1\41\1\27\25\35\4\27"+ -+ "\1\35\1\42\3\35\6\27\1\35\2\27\2\35\3\27"+ -+ "\1\35\2\27\2\35\1\27\1\43\3\37\10\27\1\35"+ -+ "\1\27\1\43\1\37\1\27\1\40\3\27\1\44\1\27"+ -+ "\25\35\4\27\1\35\1\42\3\35\6\27\1\35\2\27"+ -+ "\2\35\11\27\4\45\4\27\1\46\5\27\2\45\1\27"+ -+ "\1\47\2\27\1\50\54\27\4\51\1\52\3\51\1\53"+ -+ "\1\54\1\55\1\54\1\56\1\51\1\57\1\51\1\60"+ -+ "\2\51\1\61\2\51\1\53\1\54\1\62\1\63\1\64"+ -+ "\3\51\1\65\36\51\1\66\1\67\1\70\1\71\1\72"+ -+ "\1\73\1\74\1\75\4\51\31\76\1\77\1\100\1\101"+ -+ "\1\102\1\76\1\103\52\76\2\27\1\35\2\27\2\35"+ -+ "\1\27\4\104\1\27\1\105\3\27\1\106\2\27\1\35"+ -+ "\1\27\2\104\7\27\25\35\4\27\1\35\1\27\3\35"+ -+ "\6\27\1\35\2\27\2\35\1\27\4\107\1\110\4\107"+ -+ "\1\111\1\112\1\111\13\107\1\111\2\107\1\113\56\107"+ - "\4\51\1\52\3\51\3\114\1\115\2\51\1\116\1\117"+ - "\6\51\2\114\2\51\1\120\3\51\1\121\45\51\1\122"+ -- "\1\51\1\123\11\124\2\125\1\126\13\124\1\125\5\124"+ -- "\1\127\51\124\10\27\1\36\2\27\1\130\1\27\1\131"+ -- "\10\27\1\36\5\27\1\132\62\27\4\133\12\27\2\133"+ -- "\57\27\2\134\1\135\2\134\2\135\15\134\1\135\12\134"+ -- "\25\135\4\134\1\135\1\134\3\135\6\134\1\135\3\134"+ -- "\11\20\2\21\1\22\13\20\1\21\57\20\107\0\11\20"+ -- "\2\21\1\22\13\20\1\21\5\20\1\136\51\20\30\24"+ -- "\1\137\1\140\105\24\1\141\1\142\105\24\1\143\1\144"+ -- "\55\24\1\0\3\30\1\0\3\30\14\0\4\30\7\0"+ -- "\32\30\1\0\3\30\6\0\1\30\13\0\1\31\4\0"+ -- "\1\34\104\0\1\32\103\0\1\34\77\0\3\35\1\0"+ -- "\3\35\14\0\4\35\7\0\32\35\1\0\3\35\6\0"+ -- "\1\35\13\0\1\36\15\0\1\36\71\0\3\37\13\0"+ -- "\1\37\107\0\1\145\1\146\57\0\1\147\2\0\1\147"+ -- "\1\150\15\0\1\147\11\0\1\151\1\152\1\153\1\154"+ -- "\4\147\1\155\1\156\1\157\1\160\1\147\1\161\1\162"+ -- "\1\163\1\147\1\164\1\147\1\165\1\166\1\147\1\167"+ -- "\1\170\1\171\1\0\1\147\1\0\3\147\6\0\1\147"+ -- "\13\0\1\42\15\0\1\42\70\0\1\43\15\0\1\43"+ -- "\6\0\1\172\53\0\1\147\2\0\1\173\1\150\15\0"+ -+ "\3\51\1\123\11\124\2\125\1\126\13\124\1\125\5\124"+ -+ "\1\127\53\124\10\27\1\36\2\27\1\130\1\27\1\131"+ -+ "\10\27\1\36\5\27\1\132\64\27\4\133\12\27\2\133"+ -+ "\61\27\2\134\1\135\2\134\2\135\15\134\1\135\12\134"+ -+ "\25\135\4\134\1\135\1\134\3\135\6\134\1\135\2\134"+ -+ "\2\135\1\134\11\20\2\21\1\22\13\20\1\21\61\20"+ -+ "\111\0\11\20\2\21\1\22\13\20\1\21\5\20\1\136"+ -+ "\53\20\30\24\1\137\1\140\107\24\1\141\1\142\107\24"+ -+ "\1\143\1\144\57\24\1\0\3\30\1\0\3\30\14\0"+ -+ "\4\30\7\0\32\30\1\0\3\30\6\0\1\30\2\0"+ -+ "\2\30\11\0\1\31\4\0\1\34\106\0\1\32\105\0"+ -+ "\1\34\101\0\3\35\1\0\3\35\14\0\4\35\7\0"+ -+ "\32\35\1\0\3\35\6\0\1\35\2\0\2\35\11\0"+ -+ "\1\36\15\0\1\36\73\0\3\37\13\0\1\37\111\0"+ -+ "\1\145\1\146\61\0\1\147\2\0\1\147\1\150\15\0"+ -+ "\1\147\11\0\1\151\1\152\1\153\1\154\4\147\1\155"+ -+ "\1\156\1\157\1\160\1\147\1\161\1\162\1\163\1\147"+ -+ "\1\164\1\147\1\165\1\166\1\147\1\167\1\170\1\171"+ -+ "\1\0\1\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\11\0\1\42\15\0\1\42\72\0\1\43\15\0\1\43"+ -+ "\6\0\1\172\55\0\1\147\2\0\1\173\1\150\15\0"+ - "\1\147\10\0\1\174\1\151\1\152\1\153\1\154\4\147"+ - "\1\155\1\156\1\157\1\160\1\147\1\161\1\175\1\163"+ - "\1\147\1\164\1\147\1\165\1\166\1\147\1\167\1\170"+ -- "\1\171\1\0\1\147\1\0\3\147\6\0\1\147\13\0"+ -- "\4\45\4\0\1\46\5\0\2\45\1\0\1\176\2\0"+ -- "\1\50\72\0\1\177\116\0\1\200\1\201\55\0\3\202"+ -- "\1\203\1\202\1\204\1\205\1\206\3\202\1\0\24\202"+ -- "\1\207\1\210\1\202\1\211\3\202\1\212\7\202\1\213"+ -- "\4\202\1\203\1\202\1\206\1\203\17\202\10\0\1\53"+ -- "\3\214\1\56\1\0\1\57\4\0\1\61\2\0\1\53"+ -- "\1\214\1\62\1\63\1\64\3\0\1\215\36\0\1\66"+ -- "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\12\0"+ -- "\4\214\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+ -- "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+ -- "\1\70\1\71\1\72\1\73\1\74\1\75\12\0\3\214"+ -- "\1\54\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+ -- "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+ -- "\1\70\1\71\1\72\1\73\1\74\1\75\107\0\1\216"+ -- "\21\0\1\217\116\0\1\220\1\201\56\0\1\221\1\222"+ -- "\1\221\1\0\2\222\1\221\1\223\13\0\1\222\1\0"+ -- "\1\223\10\0\25\222\4\221\1\222\1\0\3\222\6\0"+ -- "\1\222\13\0\1\224\1\225\1\226\1\225\12\0\1\224"+ -- "\1\225\57\0\31\76\1\227\1\230\1\231\1\0\1\76"+ -- "\1\0\100\76\1\232\1\233\55\76\4\230\1\234\4\230"+ -- "\3\0\13\230\1\0\2\230\1\76\54\230\4\235\1\236"+ -- "\4\235\3\0\13\235\1\0\3\235\1\0\53\235\10\0"+ -- "\4\104\12\0\2\104\67\0\4\106\12\0\2\106\57\0"+ -- "\4\107\1\0\4\107\3\0\13\107\1\0\2\107\1\0"+ -- "\54\107\3\237\1\240\1\237\1\241\1\242\1\243\3\237"+ -- "\1\0\16\237\1\244\5\237\1\245\1\246\1\237\1\247"+ -- "\3\237\1\250\7\237\1\251\4\237\1\240\1\237\1\243"+ -- "\1\240\17\237\13\0\1\111\103\0\4\252\2\0\1\253"+ -- "\7\0\2\252\61\0\1\254\2\0\2\254\15\0\1\254"+ -- "\12\0\25\254\4\0\1\254\1\0\3\254\6\0\1\254"+ -- "\22\0\1\255\67\0\11\256\2\125\1\126\13\256\1\125"+ -- "\70\256\2\125\1\126\13\256\1\125\4\256\1\257\2\256"+ -- "\1\260\6\256\1\261\1\256\1\262\36\256\1\0\1\263"+ -- "\1\0\1\263\3\0\1\263\1\264\15\0\1\264\35\0"+ -- "\4\263\27\0\4\133\12\0\2\133\60\0\3\135\1\0"+ -- "\3\135\1\265\13\0\4\135\7\0\32\135\1\0\3\135"+ -- "\6\0\1\135\3\0\13\136\1\266\73\136\30\24\1\137"+ -- "\1\0\105\24\1\0\1\140\55\24\11\146\2\267\1\270"+ -- "\13\146\1\267\57\146\1\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\271"+ -- "\30\147\1\0\3\147\6\0\1\147\3\0\11\151\2\272"+ -- "\1\273\13\151\1\272\57\151\1\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\1\147\1\274\15\147\1\275\4\147"+ -- "\1\276\5\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\5\147\1\277\24\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -+ "\1\171\1\0\1\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\11\0\4\45\4\0\1\46\5\0\2\45\1\0"+ -+ "\1\176\2\0\1\50\74\0\1\177\120\0\1\200\1\201"+ -+ "\57\0\3\202\1\203\1\202\1\204\1\205\1\206\3\202"+ -+ "\1\0\24\202\1\207\1\210\1\202\1\211\3\202\1\212"+ -+ "\7\202\1\213\4\202\1\203\1\202\1\206\1\203\21\202"+ -+ "\10\0\1\53\3\214\1\56\1\0\1\57\4\0\1\61"+ -+ "\2\0\1\53\1\214\1\62\1\63\1\64\3\0\1\215"+ -+ "\36\0\1\66\1\67\1\70\1\71\1\72\1\73\1\74"+ -+ "\1\75\14\0\4\214\1\56\1\0\1\57\4\0\1\61"+ -+ "\2\0\2\214\1\62\1\63\1\64\3\0\1\215\36\0"+ -+ "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ -+ "\14\0\3\214\1\54\1\56\1\0\1\57\4\0\1\61"+ -+ "\2\0\2\214\1\62\1\63\1\64\3\0\1\215\36\0"+ -+ "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ -+ "\111\0\1\216\23\0\1\217\120\0\1\220\1\201\60\0"+ -+ "\1\221\1\222\1\221\1\0\2\222\1\221\1\223\13\0"+ -+ "\1\222\1\0\1\223\10\0\25\222\4\221\1\222\1\0"+ -+ "\3\222\6\0\1\222\2\0\2\222\11\0\1\224\1\225"+ -+ "\1\226\1\225\12\0\1\224\1\225\61\0\31\76\1\227"+ -+ "\1\230\1\231\1\0\1\76\1\0\102\76\1\232\1\233"+ -+ "\57\76\4\230\1\234\4\230\3\0\13\230\1\0\2\230"+ -+ "\1\76\56\230\4\235\1\236\4\235\3\0\13\235\1\0"+ -+ "\3\235\1\0\55\235\10\0\4\104\12\0\2\104\71\0"+ -+ "\4\106\12\0\2\106\61\0\4\107\1\0\4\107\3\0"+ -+ "\13\107\1\0\2\107\1\0\56\107\3\237\1\240\1\237"+ -+ "\1\241\1\242\1\243\3\237\1\0\16\237\1\244\5\237"+ -+ "\1\245\1\246\1\237\1\247\3\237\1\250\7\237\1\251"+ -+ "\4\237\1\240\1\237\1\243\1\240\21\237\13\0\1\111"+ -+ "\105\0\4\252\2\0\1\253\7\0\2\252\63\0\1\254"+ -+ "\2\0\2\254\15\0\1\254\12\0\25\254\4\0\1\254"+ -+ "\1\0\3\254\6\0\1\254\2\0\2\254\20\0\1\255"+ -+ "\71\0\11\256\2\125\1\126\13\256\1\125\72\256\2\125"+ -+ "\1\126\13\256\1\125\4\256\1\257\2\256\1\260\6\256"+ -+ "\1\261\1\256\1\262\40\256\1\0\1\263\1\0\1\263"+ -+ "\3\0\1\263\1\264\15\0\1\264\35\0\4\263\31\0"+ -+ "\4\133\12\0\2\133\62\0\3\135\1\0\3\135\1\265"+ -+ "\13\0\4\135\7\0\32\135\1\0\3\135\6\0\1\135"+ -+ "\2\0\2\135\1\0\13\136\1\266\75\136\30\24\1\137"+ -+ "\1\0\107\24\1\0\1\140\57\24\11\146\2\267\1\270"+ -+ "\13\146\1\267\61\146\1\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -+ "\1\147\1\271\30\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\1\0\11\151\2\272\1\273\13\151\1\272\61\151"+ -+ "\1\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -+ "\1\274\15\147\1\275\4\147\1\276\5\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\5\147\1\277\24\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\3\147\1\300\5\147\1\301\2\147"+ -- "\1\302\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\1\303\2\147\14\0\4\147\7\0\5\147\1\304"+ -- "\24\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\1\147\1\305\1\147\14\0\4\147\7\0\1\306\31\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\11\147\1\307\20\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\1\310\31\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\20\147\1\311"+ -- "\1\147\1\312\7\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\2\147\1\313"+ -- "\3\147\1\314\7\147\1\315\13\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\1\147\1\316\1\147\14\0"+ -- "\4\147\7\0\2\147\1\317\1\320\1\147\1\321\4\147"+ -- "\1\322\1\147\1\323\15\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\1\147\1\324\1\147\14\0\4\147"+ -+ "\1\302\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\1\303\2\147\14\0\4\147\7\0"+ -+ "\5\147\1\304\24\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\1\147\1\305\1\147\14\0"+ -+ "\4\147\7\0\1\306\31\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\11\147\1\307\20\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\1\310\31\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -+ "\20\147\1\311\1\147\1\312\7\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\2\147\1\313\3\147\1\314\7\147\1\315"+ -+ "\13\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\1\147\1\316\1\147\14\0\4\147\7\0"+ -+ "\2\147\1\317\1\320\1\147\1\321\4\147\1\322\1\147"+ -+ "\1\323\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\1\147\1\324\1\147\14\0\4\147"+ - "\7\0\11\147\1\325\20\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\1\147\1\326\1\147\14\0\4\147"+ -- "\7\0\14\147\1\327\15\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -- "\1\330\22\147\1\0\3\147\6\0\1\147\62\0\1\331"+ -- "\106\0\1\332\116\0\1\333\20\0\3\147\1\0\3\147"+ -- "\1\334\13\0\2\147\1\335\1\147\7\0\15\147\1\336"+ -- "\14\147\1\0\3\147\6\0\1\147\3\0\11\174\3\0"+ -- "\13\174\1\0\57\174\1\0\3\147\1\0\3\147\1\337"+ -+ "\2\0\2\147\2\0\3\147\1\0\1\147\1\326\1\147"+ -+ "\14\0\4\147\7\0\14\147\1\327\15\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\7\147\1\330\22\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\60\0\1\331\110\0\1\332"+ -+ "\120\0\1\333\22\0\3\147\1\0\3\147\1\334\13\0"+ -+ "\2\147\1\335\1\147\7\0\15\147\1\336\14\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\1\0\11\174\3\0"+ -+ "\13\174\1\0\61\174\1\0\3\147\1\0\3\147\1\337"+ - "\13\0\2\147\1\340\1\147\7\0\2\147\1\341\3\147"+ - "\1\314\7\147\1\315\13\147\1\0\3\147\6\0\1\147"+ -- "\75\0\1\342\14\0\11\201\3\0\13\201\1\0\57\201"+ -- "\3\0\1\343\3\0\1\343\54\0\1\343\1\0\2\343"+ -- "\20\0\3\344\3\0\1\344\36\0\2\344\3\0\1\344"+ -- "\1\0\1\344\1\0\1\344\2\0\1\344\1\0\4\344"+ -- "\2\0\1\344\1\0\1\344\13\0\3\345\3\0\1\345"+ -- "\36\0\2\345\3\0\1\345\1\0\1\345\1\0\1\345"+ -- "\2\0\1\345\1\0\4\345\2\0\1\345\1\0\1\345"+ -- "\15\0\1\203\3\0\1\203\54\0\1\203\1\0\2\203"+ -- "\25\0\1\346\42\0\1\347\6\0\1\350\1\0\1\351"+ -- "\116\0\1\352\15\0\1\221\1\0\1\221\3\0\1\221"+ -- "\54\0\4\221\20\0\3\222\1\0\3\222\1\353\13\0"+ -- "\4\222\4\0\1\354\2\0\32\222\1\0\3\222\6\0"+ -- "\1\222\16\0\1\355\73\0\30\232\1\356\56\232\11\233"+ -- "\2\357\1\76\13\233\1\357\57\233\11\230\3\0\13\230"+ -- "\1\0\57\230\33\0\1\76\53\0\3\235\1\360\1\361"+ -- "\1\235\1\362\1\363\1\235\3\0\13\235\1\0\34\235"+ -- "\1\360\1\235\1\363\1\360\17\235\3\0\1\364\3\0"+ -- "\1\364\54\0\1\364\1\0\2\364\20\0\3\365\3\0"+ -- "\1\365\36\0\2\365\3\0\1\365\1\0\1\365\1\0"+ -- "\1\365\2\0\1\365\1\0\4\365\2\0\1\365\1\0"+ -- "\1\365\13\0\3\366\3\0\1\366\36\0\2\366\3\0"+ -- "\1\366\1\0\1\366\1\0\1\366\2\0\1\366\1\0"+ -- "\4\366\2\0\1\366\1\0\1\366\15\0\1\240\3\0"+ -- "\1\240\54\0\1\240\1\0\2\240\20\0\3\254\1\0"+ -- "\3\254\14\0\4\254\4\0\1\367\2\0\32\254\1\0"+ -- "\3\254\6\0\1\254\3\0\11\257\2\370\1\371\13\257"+ -- "\1\370\57\257\11\256\2\125\1\126\13\256\1\125\10\256"+ -- "\1\372\57\256\2\125\1\126\13\256\1\125\14\256\1\373"+ -- "\53\256\2\125\1\126\13\256\1\125\20\256\1\374\36\256"+ -- "\1\0\1\263\1\0\1\263\3\0\1\263\54\0\4\263"+ -- "\27\0\1\265\15\0\1\265\61\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\1\375\31\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -+ "\2\0\2\147\73\0\1\342\16\0\11\201\3\0\13\201"+ -+ "\1\0\61\201\3\0\1\343\3\0\1\343\54\0\1\343"+ -+ "\1\0\2\343\22\0\3\344\3\0\1\344\36\0\2\344"+ -+ "\3\0\1\344\1\0\1\344\1\0\1\344\2\0\1\344"+ -+ "\1\0\4\344\2\0\1\344\1\0\1\344\15\0\3\345"+ -+ "\3\0\1\345\36\0\2\345\3\0\1\345\1\0\1\345"+ -+ "\1\0\1\345\2\0\1\345\1\0\4\345\2\0\1\345"+ -+ "\1\0\1\345\17\0\1\203\3\0\1\203\54\0\1\203"+ -+ "\1\0\2\203\27\0\1\346\42\0\1\347\6\0\1\350"+ -+ "\1\0\1\351\120\0\1\352\17\0\1\221\1\0\1\221"+ -+ "\3\0\1\221\54\0\4\221\22\0\3\222\1\0\3\222"+ -+ "\1\353\13\0\4\222\4\0\1\354\2\0\32\222\1\0"+ -+ "\3\222\6\0\1\222\2\0\2\222\14\0\1\355\75\0"+ -+ "\30\232\1\356\60\232\11\233\2\357\1\76\13\233\1\357"+ -+ "\61\233\11\230\3\0\13\230\1\0\61\230\33\0\1\76"+ -+ "\55\0\3\235\1\360\1\361\1\235\1\362\1\363\1\235"+ -+ "\3\0\13\235\1\0\34\235\1\360\1\235\1\363\1\360"+ -+ "\21\235\3\0\1\364\3\0\1\364\54\0\1\364\1\0"+ -+ "\2\364\22\0\3\365\3\0\1\365\36\0\2\365\3\0"+ -+ "\1\365\1\0\1\365\1\0\1\365\2\0\1\365\1\0"+ -+ "\4\365\2\0\1\365\1\0\1\365\15\0\3\366\3\0"+ -+ "\1\366\36\0\2\366\3\0\1\366\1\0\1\366\1\0"+ -+ "\1\366\2\0\1\366\1\0\4\366\2\0\1\366\1\0"+ -+ "\1\366\17\0\1\240\3\0\1\240\54\0\1\240\1\0"+ -+ "\2\240\22\0\3\254\1\0\3\254\14\0\4\254\4\0"+ -+ "\1\367\2\0\32\254\1\0\3\254\6\0\1\254\2\0"+ -+ "\2\254\1\0\11\257\2\370\1\371\13\257\1\370\61\257"+ -+ "\11\256\2\125\1\126\13\256\1\125\10\256\1\372\61\256"+ -+ "\2\125\1\126\13\256\1\125\14\256\1\373\55\256\2\125"+ -+ "\1\126\13\256\1\125\20\256\1\374\40\256\1\0\1\263"+ -+ "\1\0\1\263\3\0\1\263\54\0\4\263\31\0\1\265"+ -+ "\15\0\1\265\63\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\1\375\31\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\1\376\1\147\1\377\13\147\1\u0100\13\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\22\147\1\u0101\7\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -- "\1\u0102\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0103\27\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\22\147\1\u0101\7\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\1\147\1\u0102\30\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\2\147\1\u0103\27\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\4\147\1\u0104\25\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\22\147\1\u0105\7\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\20\147"+ -- "\1\u0106\11\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0107\27\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\22\147\1\u0105\7\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\20\147\1\u0106\11\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\2\147\1\u0107\27\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\10\147\1\u0108\21\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\1\147\1\u0109\10\147\1\u010a\17\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\1\147\1\u010b\30\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -- "\1\u010c\2\147\1\u010d\17\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -- "\1\u010e\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\15\147\1\u010f\14\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\1\u0110\31\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\14\147\1\u0111\15\147\1\0\3\147\6\0\1\147\4\0"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\1\147\1\u0109\10\147\1\u010a\17\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\1\147\1\u010b\30\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\7\147\1\u010c\2\147"+ -+ "\1\u010d\17\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -+ "\1\u010e\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -+ "\1\u010f\14\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\u0110"+ -+ "\31\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0111"+ -+ "\15\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\1\u0112\31\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\14\147\1\u0113\15\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\22\147\1\u0114\7\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ -- "\1\u0115\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0113\15\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\22\147\1\u0114\7\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\5\147\1\u0115\24\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0116\15\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\12\147\1\u0117\17\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\14\147\1\u0118\15\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -- "\1\u0119\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\12\147\1\u0117\17\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0118\15\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0119\14\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\10\147\1\u011a\21\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\14\147\1\u011b\15\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\20\147\1\u011c\11\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ -- "\1\u011d\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u011b\15\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011c\11\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\16\147\1\u011d\13\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011e\11\147"+ -- "\1\0\3\147\6\0\1\147\42\0\1\u011f\106\0\1\u0120"+ -- "\126\0\1\u0121\37\0\1\334\15\0\1\334\61\0\3\147"+ -- "\1\0\3\147\1\334\13\0\2\147\1\335\1\147\7\0"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\2\147\1\u0122\27\147\1\0"+ -- "\3\147\6\0\1\147\13\0\1\337\15\0\1\337\61\0"+ -- "\3\147\1\0\3\147\1\337\13\0\2\147\1\340\1\147"+ -- "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\40\0\1\u011f"+ -+ "\110\0\1\u0120\130\0\1\u0121\41\0\1\334\15\0\1\334"+ -+ "\63\0\3\147\1\0\3\147\1\334\13\0\2\147\1\335"+ -+ "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -+ "\2\147\1\u0122\27\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\11\0\1\337\15\0\1\337\63\0\3\147\1\0"+ -+ "\3\147\1\337\13\0\2\147\1\340\1\147\7\0\32\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0123\15\147"+ -- "\1\0\3\147\6\0\1\147\76\0\1\u0124\14\0\3\u0125"+ -- "\3\0\1\u0125\36\0\2\u0125\3\0\1\u0125\1\0\1\u0125"+ -- "\1\0\1\u0125\2\0\1\u0125\1\0\4\u0125\2\0\1\u0125"+ -- "\1\0\1\u0125\13\0\3\u0126\3\0\1\u0126\36\0\2\u0126"+ -- "\3\0\1\u0126\1\0\1\u0126\1\0\1\u0126\2\0\1\u0126"+ -- "\1\0\4\u0126\2\0\1\u0126\1\0\1\u0126\73\0\1\u0127"+ -- "\71\0\1\u0128\1\0\1\u0129\111\0\1\u012a\74\0\1\u012b"+ -- "\142\0\1\u012c\23\0\1\353\15\0\1\353\5\0\1\354"+ -- "\52\0\30\232\1\356\1\76\55\232\13\357\1\76\15\357"+ -- "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\50\357\3\0"+ -- "\1\235\3\0\1\235\23\0\1\76\30\0\1\235\1\0"+ -- "\2\235\23\0\1\u0130\1\0\1\u0131\24\0\1\76\54\0"+ -- "\3\u0132\3\0\1\u0132\23\0\1\76\12\0\2\u0132\3\0"+ -- "\1\u0132\1\0\1\u0132\1\0\1\u0132\2\0\1\u0132\1\0"+ -- "\4\u0132\2\0\1\u0132\1\0\1\u0132\15\0\1\360\3\0"+ -- "\1\360\23\0\1\76\30\0\1\360\1\0\2\360\20\0"+ -- "\3\u0133\3\0\1\u0133\36\0\2\u0133\3\0\1\u0133\1\0"+ -- "\1\u0133\1\0\1\u0133\2\0\1\u0133\1\0\4\u0133\2\0"+ -- "\1\u0133\1\0\1\u0133\13\0\3\u0134\3\0\1\u0134\36\0"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\74\0\1\u0124"+ -+ "\16\0\3\u0125\3\0\1\u0125\36\0\2\u0125\3\0\1\u0125"+ -+ "\1\0\1\u0125\1\0\1\u0125\2\0\1\u0125\1\0\4\u0125"+ -+ "\2\0\1\u0125\1\0\1\u0125\15\0\3\u0126\3\0\1\u0126"+ -+ "\36\0\2\u0126\3\0\1\u0126\1\0\1\u0126\1\0\1\u0126"+ -+ "\2\0\1\u0126\1\0\4\u0126\2\0\1\u0126\1\0\1\u0126"+ -+ "\54\0\1\u0127\20\0\1\u0128\73\0\1\u0129\1\0\1\u012a"+ -+ "\113\0\1\u012b\76\0\1\u012c\144\0\1\u012d\25\0\1\353"+ -+ "\15\0\1\353\5\0\1\354\54\0\30\232\1\356\1\76"+ -+ "\57\232\13\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ -+ "\1\357\1\233\52\357\3\0\1\235\3\0\1\235\23\0"+ -+ "\1\76\30\0\1\235\1\0\2\235\25\0\1\u0131\1\0"+ -+ "\1\u0132\24\0\1\76\56\0\3\u0133\3\0\1\u0133\23\0"+ -+ "\1\76\12\0\2\u0133\3\0\1\u0133\1\0\1\u0133\1\0"+ -+ "\1\u0133\2\0\1\u0133\1\0\4\u0133\2\0\1\u0133\1\0"+ -+ "\1\u0133\17\0\1\360\3\0\1\360\23\0\1\76\30\0"+ -+ "\1\360\1\0\2\360\22\0\3\u0134\3\0\1\u0134\36\0"+ - "\2\u0134\3\0\1\u0134\1\0\1\u0134\1\0\1\u0134\2\0"+ -- "\1\u0134\1\0\4\u0134\2\0\1\u0134\1\0\1\u0134\12\0"+ -- "\11\256\2\125\1\126\13\256\1\125\7\256\1\u0135\60\256"+ -- "\2\125\1\126\13\256\1\125\17\256\1\u0136\50\256\2\125"+ -- "\1\126\13\256\1\125\21\256\1\u0137\35\256\1\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0138\13\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\2\147\1\u0139\27\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\6\147\1\u013a\1\u013b\22\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\12\147\1\u013c\17\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u013d"+ -- "\17\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\5\147\1\u013e\24\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u013f"+ -+ "\1\u0134\1\0\4\u0134\2\0\1\u0134\1\0\1\u0134\15\0"+ -+ "\3\u0135\3\0\1\u0135\36\0\2\u0135\3\0\1\u0135\1\0"+ -+ "\1\u0135\1\0\1\u0135\2\0\1\u0135\1\0\4\u0135\2\0"+ -+ "\1\u0135\1\0\1\u0135\14\0\11\256\2\125\1\126\13\256"+ -+ "\1\125\7\256\1\u0136\62\256\2\125\1\126\13\256\1\125"+ -+ "\17\256\1\u0137\52\256\2\125\1\126\13\256\1\125\21\256"+ -+ "\1\u0138\37\256\1\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\16\147\1\u0139\13\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\2\147\1\u013a\27\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\6\147\1\u013b\1\u013c\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\12\147\1\u013d\17\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\12\147\1\u013e\17\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\5\147\1\u013f\24\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\1\147\1\u0140"+ - "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\5\147\1\u0140\24\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u0141"+ -- "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\12\147\1\u0142\17\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\7\147\1\u0143\22\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\6\0"+ -- "\1\151\2\147\1\u0144\10\147\1\u0145\2\147\1\u0146\13\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\16\147\1\u0147\13\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\12\147\1\u0148\17\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\14\147"+ -- "\1\u0149\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\5\147\1\u014a\24\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\7\147\1\u014b\22\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\7\147\1\u014c\22\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ -- "\1\u014d\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\22\147\1\u014e\7\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\1\147\1\u014f\30\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\2\147\1\u0150\27\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -- "\1\u0151\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0152\5\147"+ -- "\1\u0153\6\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\4\147\1\u0154\25\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\4\147\1\u0155\25\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\1\147\1\u0156\1\147"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\5\147\1\u0141\24\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u0142\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\12\147\1\u0143\17\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u0144\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\6\0\1\151\2\147\1\u0145\10\147\1\u0146\2\147"+ -+ "\1\u0147\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ -+ "\1\u0148\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\12\147"+ -+ "\1\u0149\17\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\14\147"+ -+ "\1\u014a\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ -+ "\1\u014b\24\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -+ "\1\u014c\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -+ "\1\u014d\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ -+ "\1\u014e\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ -+ "\1\u014f\7\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -+ "\1\u0150\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ -+ "\1\u0151\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -+ "\1\u0152\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -+ "\1\u0153\5\147\1\u0154\6\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\4\147\1\u0155\25\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\4\147\1\u0156\25\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\1\147\1\u0157\1\147"+ - "\14\0\4\147\7\0\32\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -- "\1\u0157\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\7\147\1\u0158\22\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\10\147\1\u0159\21\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\16\147\1\u015a\13\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\12\147"+ -- "\1\u015b\17\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\31\147\1\u015c\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u015d"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\15\147\1\u0158\14\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\7\147\1\u0159\22\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\10\147\1\u015a\21\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\16\147\1\u015b\13\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\12\147\1\u015c\17\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\31\147\1\u015d\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\1\147\1\u015e\1\147\14\0"+ -+ "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\42\0\1\u015f\110\0\1\u0160\106\0\1\u0161\52\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0162"+ -+ "\15\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0150"+ -+ "\1\u0163\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\75\0\1\u0164\15\0\3\u0165\3\0\1\u0165\36\0\2\u0165"+ -+ "\3\0\1\u0165\1\0\1\u0165\1\0\1\u0165\2\0\1\u0165"+ -+ "\1\0\4\u0165\2\0\1\u0165\1\0\1\u0165\53\0\1\u0166"+ -+ "\132\0\1\u0167\74\0\1\u0168\104\0\1\u0169\115\0\1\u016a"+ -+ "\125\0\1\u016b\121\0\1\u016c\14\0\13\357\1\76\14\357"+ -+ "\1\u016d\1\233\57\357\4\u012f\1\u016e\4\u012f\2\357\1\76"+ -+ "\13\u012f\1\357\2\u012f\1\357\56\u012f\4\u016f\1\u0170\4\u016f"+ -+ "\2\357\1\76\13\u016f\1\357\3\u016f\1\233\55\u016f\4\0"+ -+ "\1\u0131\1\0\1\u0132\103\0\3\u0133\3\0\1\u0133\36\0"+ -+ "\2\u0133\3\0\1\u0133\1\0\1\u0133\1\0\1\u0133\2\0"+ -+ "\1\u0133\1\0\4\u0133\2\0\1\u0133\1\0\1\u0133\15\0"+ -+ "\3\u0171\3\0\1\u0171\36\0\2\u0171\3\0\1\u0171\1\0"+ -+ "\1\u0171\1\0\1\u0171\2\0\1\u0171\1\0\4\u0171\2\0"+ -+ "\1\u0171\1\0\1\u0171\15\0\3\u0172\3\0\1\u0172\36\0"+ -+ "\2\u0172\3\0\1\u0172\1\0\1\u0172\1\0\1\u0172\2\0"+ -+ "\1\u0172\1\0\4\u0172\2\0\1\u0172\1\0\1\u0172\14\0"+ -+ "\11\256\2\125\1\126\13\256\1\125\11\256\1\u0173\60\256"+ -+ "\2\125\1\126\13\256\1\125\4\256\1\u0174\4\256\1\u0175"+ -+ "\10\256\1\u0176\47\256\2\125\1\126\13\256\1\125\16\256"+ -+ "\1\u0177\42\256\1\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\5\147\1\u0178\24\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\6\0\1\151\2\147\1\u0179\27\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\4\147\1\u017a\25\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\24\147\1\u017b\5\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\1\147\1\u017c"+ - "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ -- "\1\147\44\0\1\u015e\106\0\1\u015f\104\0\1\u0160\50\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0161"+ -- "\15\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\1\147\1\u014f\1\u0162\27\147"+ -- "\1\0\3\147\6\0\1\147\77\0\1\u0163\13\0\3\u0164"+ -- "\3\0\1\u0164\36\0\2\u0164\3\0\1\u0164\1\0\1\u0164"+ -- "\1\0\1\u0164\2\0\1\u0164\1\0\4\u0164\2\0\1\u0164"+ -- "\1\0\1\u0164\73\0\1\u0165\72\0\1\u0166\102\0\1\u0167"+ -- "\113\0\1\u0168\123\0\1\u0169\117\0\1\u016a\12\0\13\357"+ -- "\1\76\14\357\1\u016b\1\233\55\357\4\u012e\1\u016c\4\u012e"+ -- "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\54\u012e\4\u016d"+ -- "\1\u016e\4\u016d\2\357\1\76\13\u016d\1\357\3\u016d\1\233"+ -- "\53\u016d\4\0\1\u0130\1\0\1\u0131\101\0\3\u0132\3\0"+ -- "\1\u0132\36\0\2\u0132\3\0\1\u0132\1\0\1\u0132\1\0"+ -- "\1\u0132\2\0\1\u0132\1\0\4\u0132\2\0\1\u0132\1\0"+ -- "\1\u0132\13\0\3\u016f\3\0\1\u016f\36\0\2\u016f\3\0"+ -- "\1\u016f\1\0\1\u016f\1\0\1\u016f\2\0\1\u016f\1\0"+ -- "\4\u016f\2\0\1\u016f\1\0\1\u016f\13\0\3\u0170\3\0"+ -- "\1\u0170\36\0\2\u0170\3\0\1\u0170\1\0\1\u0170\1\0"+ -- "\1\u0170\2\0\1\u0170\1\0\4\u0170\2\0\1\u0170\1\0"+ -- "\1\u0170\12\0\11\256\2\125\1\126\13\256\1\125\11\256"+ -- "\1\u0171\56\256\2\125\1\126\13\256\1\125\4\256\1\u0172"+ -- "\4\256\1\u0173\10\256\1\u0174\45\256\2\125\1\126\13\256"+ -- "\1\125\16\256\1\u0175\40\256\1\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\5\147\1\u0176\24\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\6\0\1\151\2\147\1\u0177\27\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\4\147\1\u0178\25\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\24\147\1\u0179"+ -- "\5\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\1\147\1\u017a\1\147\14\0\4\147\7\0\32\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\7\147\1\u017b\22\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\4\147\1\u017c\25\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u017d"+ -- "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\6\147\1\u017e\23\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u017f"+ -- "\13\0\2\147\1\u0180\1\147\7\0\32\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\7\147\1\u0181\22\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -- "\1\u0182\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\3\147\1\u0183\26\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\14\147\1\u0184\15\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\12\147\1\u0185\17\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ -- "\1\u0186\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\12\147\1\u0187\17\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\10\147\1\u0188\21\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\1\u0189\2\147\14\0"+ -- "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u018a"+ -- "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\4\147\1\u018b\25\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\23\147\1\u018c\6\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\16\147\1\u018d\13\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u018e"+ -- "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\11\147\1\u018f\20\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u017d\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\4\147\1\u017e\25\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\1\147\1\u017f\30\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\6\147\1\u0180\23\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\1\u0181"+ -+ "\13\0\2\147\1\u0182\1\147\7\0\32\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\7\147\1\u0183\22\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\1\147\1\u0184\30\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\3\147\1\u0185\26\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\14\147\1\u0186\15\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\12\147\1\u0187\17\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\2\147\1\u0188\27\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\12\147\1\u0189\17\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\10\147\1\u018a\21\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\1\u018b"+ -+ "\2\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\4\147\1\u018c\25\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\4\147\1\u018d\25\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\23\147\1\u018e\6\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\16\147\1\u018f\13\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0190\22\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\14\147\1\u0191\15\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\17\147\1\u0192"+ -- "\12\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\15\147\1\u0193\14\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\12\147\1\u0194\17\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\7\147\1\u0195\22\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u0196"+ -- "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\1\u0197\31\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\24\147\1\u0198\5\147\1\0\3\147\6\0\1\147"+ -- "\44\0\1\u0199\46\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\2\147\1\u019a\27\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -- "\1\u019b\22\147\1\0\3\147\6\0\1\147\24\0\1\u019c"+ -- "\133\0\1\u019d\106\0\1\u019e\101\0\1\u019f\106\0\1\u01a0"+ -- "\104\0\1\u01a1\70\0\1\u01a2\65\0\11\u016b\2\u01a3\1\u01a4"+ -- "\13\u016b\1\u01a3\1\u01a5\56\u016b\11\u012e\2\357\1\76\13\u012e"+ -- "\1\357\57\u012e\11\233\2\357\1\76\13\233\1\357\3\233"+ -- "\1\357\53\233\3\u016d\1\u01a6\1\u01a7\1\u016d\1\u01a8\1\u01a9"+ -- "\1\u016d\2\357\1\76\13\u016d\1\357\34\u016d\1\u01a6\1\u016d"+ -- "\1\u01a9\1\u01a6\17\u016d\1\0\3\u01aa\3\0\1\u01aa\36\0"+ -- "\2\u01aa\3\0\1\u01aa\1\0\1\u01aa\1\0\1\u01aa\2\0"+ -- "\1\u01aa\1\0\4\u01aa\2\0\1\u01aa\1\0\1\u01aa\12\0"+ -- "\11\256\2\125\1\126\13\256\1\125\4\256\1\u01ab\4\256"+ -- "\1\u01ac\45\256\11\u0172\2\u01ad\1\u01ae\13\u0172\1\u01ad\57\u0172"+ -- "\11\256\2\125\1\126\13\256\1\125\12\256\1\u01af\55\256"+ -- "\2\125\1\126\13\256\1\125\23\256\1\u01b0\40\256\1\u01b1"+ -- "\3\256\2\125\1\126\13\256\1\125\57\256\1\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b2\6\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\3\147\1\u01b3\26\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\14\147\1\u01b4\15\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -- "\1\u01b5\22\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b6\6\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\17\147\1\u01b7\12\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\7\147\1\u01b8\22\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\u01b9"+ -- "\31\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\15\147\1\u01ba\14\147\1\0"+ -- "\3\147\6\0\1\147\5\0\1\u01bb\2\0\2\u01bb\1\0"+ -- "\1\u017f\7\0\1\u01bc\3\0\1\u01bb\1\0\1\u017f\10\0"+ -- "\25\u01bb\4\0\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0"+ -- "\1\147\1\u01bb\1\147\1\0\2\u01bb\1\147\1\u017f\7\0"+ -- "\1\u01bc\3\0\1\u01bb\1\147\1\u0180\1\147\7\0\25\u01bb"+ -- "\4\147\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01bd\6\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\4\147\1\u01be\25\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\12\147\1\u01bf\17\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ -- "\1\u01c0\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\1\u01c1\31\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\2\147\1\u01c2\27\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\14\147\1\u01c3\15\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\1\u01c4\31\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\14\147\1\u01c5\15\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\3\147\1\u01c6\26\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ -- "\1\u01c7\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\17\147\1\u01c8\12\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\20\147\1\u01c9\11\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\11\147\1\u0191\20\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u0192\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\14\147\1\u0193\15\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\17\147\1\u0194\12\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\15\147\1\u0195\14\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\12\147\1\u0196\17\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u0197\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\16\147\1\u0198\13\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\1\u0199\31\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\24\147\1\u019a\5\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\42\0\1\u019b\50\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\2\147\1\u019c\27\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\7\147\1\u019d\22\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\22\0\1\u019e\144\0\1\u019f"+ -+ "\101\0\1\u01a0\110\0\1\u01a1\103\0\1\u01a2\110\0\1\u01a3"+ -+ "\106\0\1\u01a4\72\0\1\u01a5\67\0\11\u016d\2\u01a6\1\u01a7"+ -+ "\13\u016d\1\u01a6\1\u01a8\60\u016d\11\u012f\2\357\1\76\13\u012f"+ -+ "\1\357\61\u012f\11\233\2\357\1\76\13\233\1\357\3\233"+ -+ "\1\357\55\233\3\u016f\1\u01a9\1\u01aa\1\u016f\1\u01ab\1\u01ac"+ -+ "\1\u016f\2\357\1\76\13\u016f\1\357\34\u016f\1\u01a9\1\u016f"+ -+ "\1\u01ac\1\u01a9\21\u016f\1\0\3\u01ad\3\0\1\u01ad\36\0"+ -+ "\2\u01ad\3\0\1\u01ad\1\0\1\u01ad\1\0\1\u01ad\2\0"+ -+ "\1\u01ad\1\0\4\u01ad\2\0\1\u01ad\1\0\1\u01ad\14\0"+ -+ "\11\256\2\125\1\126\13\256\1\125\4\256\1\u01ae\4\256"+ -+ "\1\u01af\47\256\11\u0174\2\u01b0\1\u01b1\13\u0174\1\u01b0\61\u0174"+ -+ "\11\256\2\125\1\126\13\256\1\125\12\256\1\u01b2\57\256"+ -+ "\2\125\1\126\13\256\1\125\23\256\1\u01b3\42\256\1\u01b4"+ -+ "\3\256\2\125\1\126\13\256\1\125\61\256\1\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b5\6\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\3\147\1\u01b6\26\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u01b7\15\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\7\147\1\u01b8\22\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b9\6\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\17\147\1\u01ba\12\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\7\147\1\u01bb\22\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\14\0\4\147\7\0\1\u01bc\31\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\15\147\1\u01bd\14\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\3\0\1\u01be\2\0"+ -+ "\2\u01be\1\0\1\u0181\7\0\1\u01bf\3\0\1\u01be\1\0"+ -+ "\1\u0181\10\0\25\u01be\4\0\1\u01be\1\0\3\u01be\6\0"+ -+ "\1\u01be\2\0\2\u01be\2\0\1\147\1\u01be\1\147\1\0"+ -+ "\2\u01be\1\147\1\u0181\7\0\1\u01bf\3\0\1\u01be\1\147"+ -+ "\1\u0182\1\147\7\0\25\u01be\4\147\1\u01be\1\0\3\u01be"+ -+ "\6\0\1\u01be\2\0\2\u01be\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\23\147\1\u01c0\6\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\4\147\1\u01c1\25\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\12\147\1\u01c2\17\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\5\147\1\u01c3\24\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\1\u01c4\31\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\2\147\1\u01c5\27\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\14\147\1\u01c6\15\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\1\u01c7\31\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\14\147\1\u01c8\15\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\3\147\1\u01c9\26\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u01ca\25\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ -- "\1\u01cb\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\1\u01cc\13\0\2\147\1\u01cd\1\147\7\0"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\7\147\1\u01ce\22\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\4\147\1\u01cf\25\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\21\147\1\u01d0\10\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u01d1"+ -- "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\7\147\1\u01d2\22\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\337"+ -- "\13\0\2\147\1\340\1\147\7\0\15\147\1\u01d3\14\147"+ -- "\1\0\3\147\6\0\1\147\24\0\1\u01d4\130\0\1\u01d5"+ -- "\106\0\1\u01d6\111\0\1\u01d7\101\0\1\u01d8\106\0\1\u01d9"+ -- "\66\0\1\u01da\65\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u01dc"+ -- "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\50\u01a3\30\u01a4\1\u01df"+ -- "\1\u01e0\1\u01e1\1\u01e2\1\232\1\u01a4\1\232\50\u01a4\11\u016b"+ -- "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\357\55\u016b\3\233"+ -- "\1\u016d\3\233\1\u016d\1\233\2\357\1\76\13\233\1\357"+ -- "\3\233\1\357\30\233\1\u016d\1\233\2\u016d\23\233\1\u01e3"+ -- "\1\233\1\u01e4\2\233\2\357\1\76\13\233\1\357\3\233"+ -- "\1\357\54\233\3\u01e5\3\233\1\u01e5\1\233\2\357\1\76"+ -- "\13\233\1\357\3\233\1\357\12\233\2\u01e5\3\233\1\u01e5"+ -- "\1\233\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5"+ -- "\2\233\1\u01e5\1\233\1\u01e5\15\233\1\u01a6\3\233\1\u01a6"+ -- "\1\233\2\357\1\76\13\233\1\357\3\233\1\357\30\233"+ -- "\1\u01a6\1\233\2\u01a6\17\233\1\0\3\235\3\0\1\235"+ -- "\36\0\2\235\3\0\1\235\1\0\1\235\1\0\1\235"+ -- "\2\0\1\235\1\0\4\235\2\0\1\235\1\0\1\235"+ -- "\12\0\11\u01ab\2\u01e6\1\u01e7\13\u01ab\1\u01e6\57\u01ab\11\256"+ -- "\2\125\1\126\13\256\1\125\12\256\1\u01e8\55\256\2\125"+ -- "\1\126\13\256\1\125\13\256\1\u01e9\54\256\2\125\1\126"+ -- "\13\256\1\125\21\256\1\u01ea\46\256\2\125\1\126\13\256"+ -- "\1\125\11\256\1\u01eb\45\256\1\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\7\147\1\u01ec\22\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\4\147\1\u01ed\25\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ -- "\1\u01ee\7\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\4\147\1\u01ef\25\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\7\147\1\u01f0\22\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\7\147\1\u01f1\22\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ -- "\1\u01f2\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\1\u01f3\2\147\14\0\4\147\7\0\32\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u01f4"+ -- "\13\0\2\147\1\u01f5\1\147\7\0\32\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\u01bb\1\0\3\u01bb\1\u01f6\3\0"+ -- "\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\3\0\4\u01bb\7\0"+ -- "\32\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\u01fa\1\0"+ -- "\4\u01fa\3\0\2\u01fa\2\0\10\u01fa\7\0\32\u01fa\1\0"+ -- "\3\u01fa\6\0\1\u01fa\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\15\147\1\u01fb\14\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\5\147\1\u01fc\24\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\6\0\1\151\32\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\15\147\1\u01fd\14\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\5\147\1\u01fe\24\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\3\147"+ -- "\1\u01ff\26\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0200\13\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\13\147\1\u0201\16\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\12\147\1\u0202\17\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ -- "\1\u0203\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\1\u0204\13\0\2\147\1\u0205\1\147\7\0"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\1\147\1\u0206\1\147\14\0\4\147\7\0\32\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\24\147\1\u0207\5\147\1\0\3\147\6\0"+ -- "\1\147\5\0\1\u0208\2\0\2\u0208\1\0\1\u01cc\13\0"+ -- "\1\u0208\1\0\1\u01cc\10\0\25\u0208\4\0\1\u0208\1\0"+ -- "\3\u0208\6\0\1\u0208\4\0\1\147\1\u0208\1\147\1\0"+ -- "\2\u0208\1\147\1\u01cc\13\0\1\u0208\1\147\1\u01cd\1\147"+ -- "\7\0\25\u0208\4\147\1\u0208\1\0\3\u0208\6\0\1\u0208"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -- "\1\u0209\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\1\u020a\13\0\2\147\1\u020b\1\147\7\0"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\1\334\13\0\2\147\1\335\1\147\7\0\15\147"+ -- "\1\u020c\14\147\1\0\3\147\6\0\1\147\13\0\4\u01d4"+ -- "\12\0\2\u01d4\6\0\1\u020d\125\0\1\u020e\106\0\1\u020f"+ -- "\74\0\1\u0210\111\0\1\u0211\145\0\1\u0212\11\0\4\u0213"+ -- "\12\0\2\u0213\57\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u0214"+ -- "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\63\u01a3\1\u01a4\14\u01a3"+ -- "\1\u0215\1\u016b\55\u01a3\4\u01dd\1\u0216\4\u01dd\2\u01a3\1\u01a4"+ -- "\13\u01dd\1\u01a3\1\u0217\1\u01dd\1\u01a3\54\u01dd\4\u0218\1\u0219"+ -- "\4\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\2\u0218\1\u016b"+ -- "\53\u0218\30\u01a4\1\u01df\1\u021b\1\u01e1\1\u01e2\1\232\1\u01a4"+ -- "\1\232\100\u01a4\1\u021c\1\u016b\55\u01a4\4\u01e1\1\u021d\4\u01e1"+ -- "\3\232\13\u01e1\1\232\1\u021e\1\u01e1\1\u01a4\54\u01e1\4\u021f"+ -- "\1\u0220\4\u021f\3\232\13\u021f\1\232\1\u0221\2\u021f\1\232"+ -- "\53\u021f\4\233\1\u01e3\1\233\1\u01e4\2\233\2\357\1\76"+ -- "\13\233\1\357\60\233\3\u01e5\3\233\1\u01e5\1\233\2\357"+ -- "\1\76\13\233\1\357\16\233\2\u01e5\3\233\1\u01e5\1\233"+ -- "\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5\2\233"+ -- "\1\u01e5\1\233\1\u01e5\13\233\3\u0222\3\233\1\u0222\1\233"+ -- "\2\357\1\76\13\233\1\357\16\233\2\u0222\3\233\1\u0222"+ -- "\1\233\1\u0222\1\233\1\u0222\2\233\1\u0222\1\233\4\u0222"+ -- "\2\233\1\u0222\1\233\1\u0222\12\233\11\256\2\125\1\126"+ -- "\13\256\1\125\13\256\1\u0223\54\256\2\125\1\126\13\256"+ -- "\1\125\14\256\1\u0224\53\256\2\125\1\126\13\256\1\125"+ -- "\4\256\1\u0225\63\256\2\125\1\126\13\256\1\125\12\256"+ -- "\1\u0226\44\256\1\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\5\147\1\u0227\24\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\1\u0228\13\0\2\147\1\u0228"+ -- "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0229"+ -- "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\14\147\1\u022a\15\147\1\0"+ -- "\3\147\6\0\1\147\3\0\2\u022b\1\u022c\2\u022b\2\u022c"+ -- "\1\u022b\1\u01f4\3\0\10\u022b\1\u022c\1\u022b\1\u01f4\1\0"+ -- "\7\u022b\25\u022c\4\u022b\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c"+ -- "\4\u022b\1\u022d\1\u022c\1\u022d\1\u022b\2\u022c\1\u022d\1\u01f4"+ -- "\3\0\10\u022b\1\u022c\1\u022d\1\u01f5\1\147\7\u022b\25\u022c"+ -- "\4\u022d\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c\3\u022b\10\0"+ -- "\1\u01f6\3\0\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\5\0"+ -- "\1\u01f6\62\0\1\u01bb\2\0\2\u01bb\1\0\1\u01f7\13\0"+ -- "\1\u01bb\1\0\1\u01f7\10\0\25\u01bb\4\0\1\u01bb\1\0"+ -- "\3\u01bb\6\0\1\u01bb\13\0\1\u01f8\6\0\1\u022e\6\0"+ -- "\1\u01f8\61\0\3\u022f\1\0\4\u022f\3\0\2\u022f\2\0"+ -- "\10\u022f\7\0\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0"+ -- "\3\u01fa\1\0\4\u01fa\3\0\2\u01fa\2\0\1\u01fa\1\u0230"+ -- "\6\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa\4\0"+ -- "\3\147\1\0\3\147\1\u0231\13\0\2\147\1\u0232\1\147"+ -- "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\6\147\1\u0233\23\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\7\147\1\u0234\22\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\1\147\1\u0235\30\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ -- "\1\u0236\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0237\27\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\14\147\1\u0238\15\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\5\147\1\u0239\24\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ -- "\1\u023a\24\147\1\0\3\147\6\0\1\147\3\0\2\u023b"+ -- "\1\u023c\2\u023b\2\u023c\1\u023b\1\u0204\3\0\10\u023b\1\u023c"+ -- "\1\u023b\1\u0204\1\0\7\u023b\25\u023c\4\u023b\1\u023c\1\u023b"+ -- "\3\u023c\6\u023b\1\u023c\4\u023b\1\u023d\1\u023c\1\u023d\1\u023b"+ -- "\2\u023c\1\u023d\1\u0204\3\0\10\u023b\1\u023c\1\u023d\1\u0205"+ -- "\1\147\7\u023b\25\u023c\4\u023d\1\u023c\1\u023b\3\u023c\6\u023b"+ -- "\1\u023c\3\u023b\1\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\24\147\1\u023e\5\147\1\0\3\147\6\0\1\147"+ -- "\4\0\3\147\1\0\3\147\1\u023f\13\0\2\147\1\u0240"+ -- "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\u0208\1\0\3\u0208\1\u0241\7\0\1\u0242\3\0\4\u0208"+ -- "\7\0\32\u0208\1\0\3\u0208\6\0\1\u0208\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0243\14\147"+ -- "\1\0\3\147\6\0\1\147\3\0\1\u0244\1\u0245\1\u0244"+ -- "\1\u0245\3\u0244\1\u0245\1\u020a\3\0\12\u0244\1\u020a\1\0"+ -- "\34\u0244\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247"+ -- "\1\u0246\1\u020a\3\0\10\u0244\2\u0247\1\u020b\1\147\7\u0244"+ -- "\25\u0247\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244"+ -- "\53\0\1\u0248\106\0\1\u0249\140\0\1\u024a\44\0\1\u024b"+ -- "\62\0\1\u024c\77\0\4\u0213\12\0\2\u0213\6\0\1\u024d"+ -- "\50\0\13\357\1\76\14\357\1\u01a3\1\u012d\1\u024e\1\u024f"+ -- "\53\357\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\u01a3"+ -- "\55\u016b\11\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\62\u01dd"+ -- "\1\u0216\4\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\1\u024e"+ -- "\1\u01a3\54\u01dd\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+ -- "\2\u016b\1\u01a3\53\u016b\3\u0218\1\u0250\1\u0251\1\u0218\1\u0252"+ -- "\1\u0253\1\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\33\u0218"+ -- "\1\u0250\1\u0218\1\u0253\1\u0250\17\u0218\11\u016b\2\u01a3\1\u01a4"+ -- "\13\u016b\1\u01a3\1\u01a5\1\357\1\u016b\1\u01a3\53\u016b\30\76"+ -- "\1\u01a4\1\u012d\1\u0254\1\u0255\53\76\30\232\1\356\1\u01a4"+ -- "\55\232\11\u01e1\3\232\13\u01e1\1\232\1\u021e\62\u01e1\1\u021d"+ -- "\4\u01e1\3\232\13\u01e1\1\232\1\u021e\1\u0254\1\u01a4\54\u01e1"+ -- "\30\232\1\356\2\232\1\u01a4\53\232\3\u021f\1\u0256\1\u0257"+ -- "\1\u021f\1\u0258\1\u0259\1\u021f\3\232\13\u021f\1\232\1\u0221"+ -- "\33\u021f\1\u0256\1\u021f\1\u0259\1\u0256\17\u021f\30\232\1\356"+ -- "\1\76\1\232\1\u01a4\53\232\1\233\3\u025a\3\233\1\u025a"+ -- "\1\233\2\357\1\76\13\233\1\357\16\233\2\u025a\3\233"+ -- "\1\u025a\1\233\1\u025a\1\233\1\u025a\2\233\1\u025a\1\233"+ -- "\4\u025a\2\233\1\u025a\1\233\1\u025a\12\233\11\256\2\125"+ -- "\1\126\13\256\1\125\14\256\1\u025b\53\256\2\125\1\126"+ -- "\13\256\1\125\15\256\1\u025c\41\256\11\u0225\2\u025d\1\u025e"+ -- "\13\u0225\1\u025d\57\u0225\11\256\2\125\1\126\13\256\1\125"+ -- "\13\256\1\u025f\43\256\1\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\6\147\1\u0260\23\147\1\0\3\147\6\0"+ -- "\1\147\3\0\13\u0228\1\0\73\u0228\1\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\2\147\1\u0261\27\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\15\147\1\u0262\14\147\1\0\3\147\6\0"+ -- "\1\147\3\0\11\u022b\3\0\13\u022b\1\0\60\u022b\3\u022c"+ -- "\1\u022b\3\u022c\1\u0263\3\0\2\u01f4\6\u022b\3\u022c\1\u0264"+ -- "\7\u022b\32\u022c\1\u022b\3\u022c\6\u022b\1\u022c\4\u022b\3\u022d"+ -- "\1\u022b\3\u022d\1\u022b\3\0\10\u022b\3\u022d\1\147\7\u022b"+ -- "\32\u022d\1\u022b\3\u022d\6\u022b\1\u022d\3\u022b\10\0\1\u022e"+ -- "\5\0\1\u01f8\7\0\1\u022e\61\0\3\u022f\1\0\4\u022f"+ -- "\3\0\2\u022f\2\0\1\u022f\1\u0265\6\u022f\7\0\32\u022f"+ -- "\1\0\3\u022f\6\0\1\u022f\4\0\1\u01fa\1\u0266\1\u01fa"+ -- "\1\0\2\u0266\1\u01fa\1\u0230\3\0\2\u01fa\2\0\1\u01fa"+ -- "\1\u0230\2\u01fa\1\u0266\1\u01fa\1\u0230\1\u01fa\7\0\25\u0266"+ -- "\4\u01fa\1\u0266\1\0\3\u0266\6\0\1\u0266\5\0\1\u0267"+ -- "\2\0\2\u0267\1\0\1\u0231\13\0\1\u0267\1\0\1\u0231"+ -- "\10\0\25\u0267\4\0\1\u0267\1\0\3\u0267\6\0\1\u0267"+ -- "\4\0\1\147\1\u0267\1\147\1\0\2\u0267\1\147\1\u0231"+ -- "\13\0\1\u0267\1\147\1\u0232\1\147\7\0\25\u0267\4\147"+ -- "\1\u0267\1\0\3\u0267\6\0\1\u0267\4\0\3\147\1\0"+ -- "\3\147\1\u0268\13\0\2\147\1\u0269\1\147\6\0\1\151"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0\32\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\1\u026c\13\0\2\147\1\u026d\1\147\7\0\32\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\5\147\1\u026e\24\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\2\147\1\u026f\27\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0270"+ -- "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\4\147\1\u0271\25\147\1\0"+ -- "\3\147\6\0\1\147\3\0\11\u023b\3\0\13\u023b\1\0"+ -- "\60\u023b\3\u023c\1\u023b\3\u023c\1\u0272\3\0\1\u0204\7\u023b"+ -- "\3\u023c\1\u0273\7\u023b\32\u023c\1\u023b\3\u023c\6\u023b\1\u023c"+ -- "\4\u023b\3\u023d\1\u023b\3\u023d\1\u023b\3\0\10\u023b\3\u023d"+ -- "\1\147\7\u023b\32\u023d\1\u023b\3\u023d\6\u023b\1\u023d\3\u023b"+ -- "\2\0\1\u0274\2\0\2\u0274\1\0\1\u023f\7\0\1\u0275"+ -- "\3\0\1\u0274\1\0\1\u023f\10\0\25\u0274\4\0\1\u0274"+ -- "\1\0\3\u0274\6\0\1\u0274\4\0\1\147\1\u0276\1\147"+ -- "\1\0\2\u0276\1\147\1\u023f\7\0\1\u0275\3\0\1\u0276"+ -- "\1\147\1\u0240\1\147\7\0\25\u0276\4\147\1\u0276\1\0"+ -- "\3\u0276\6\0\1\u0276\13\0\1\u0241\7\0\1\u0242\5\0"+ -- "\1\u0241\61\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+ -- "\10\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\3\0"+ -- "\11\u0244\3\0\13\u0244\1\0\60\u0244\1\u0245\1\u0244\1\u0245"+ -- "\3\u0244\1\u0245\1\u0278\3\0\12\u0244\1\u0278\1\0\34\u0244"+ -- "\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247\1\u0246"+ -- "\1\u0278\3\0\10\u0244\2\u0247\1\u0279\1\147\7\u0244\25\u0247"+ -- "\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\4\u0244\3\u0247"+ -- "\1\u0244\3\u0247\1\u0244\3\0\10\u0244\3\u0247\1\147\7\u0244"+ -- "\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244\54\0\1\u027a"+ -- "\106\0\1\u027b\51\0\1\u027c\151\0\1\u027d\22\0\1\u027e"+ -- "\1\0\4\u024e\1\u027f\4\u024e\2\357\1\76\13\u024e\1\357"+ -- "\1\u024e\1\u0280\1\u024e\1\u0281\1\u012e\1\u024e\1\u012e\50\u024e"+ -- "\4\u0282\1\u0283\4\u0282\2\357\1\76\13\u0282\1\357\1\u0282"+ -- "\1\u012d\1\u0284\1\u012f\1\u016d\1\u0282\1\u016d\50\u0282\3\u016b"+ -- "\1\u0218\3\u016b\1\u0218\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ -- "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0218\1\u016b\2\u0218\23\u016b"+ -- "\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ -- "\1\u01a5\2\u016b\1\u01a3\54\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+ -- "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\2\u016b\1\u01a3\12\u016b"+ -- "\2\u0287\3\u016b\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b"+ -- "\1\u0287\1\u016b\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\15\u016b"+ -- "\1\u0250\3\u016b\1\u0250\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ -- "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0250\1\u016b\2\u0250\17\u016b"+ -- "\4\u0254\1\u0288\4\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289"+ -- "\1\u0254\1\u028a\1\230\1\u0254\1\230\50\u0254\4\u028b\1\u028c"+ -- "\4\u028b\3\76\13\u028b\1\76\1\u028b\1\227\1\u028d\1\231"+ -- "\1\235\1\u028b\1\235\50\u028b\3\232\1\u021f\3\232\1\u021f"+ -- "\20\232\1\356\2\232\1\u01a4\30\232\1\u021f\1\232\2\u021f"+ -- "\23\232\1\u028e\1\232\1\u028f\21\232\1\356\2\232\1\u01a4"+ -- "\54\232\3\u0290\3\232\1\u0290\20\232\1\356\2\232\1\u01a4"+ -- "\12\232\2\u0290\3\232\1\u0290\1\232\1\u0290\1\232\1\u0290"+ -- "\2\232\1\u0290\1\232\4\u0290\2\232\1\u0290\1\232\1\u0290"+ -- "\15\232\1\u0256\3\232\1\u0256\20\232\1\356\2\232\1\u01a4"+ -- "\30\232\1\u0256\1\232\2\u0256\17\232\1\233\3\u016d\3\233"+ -- "\1\u016d\1\233\2\357\1\76\13\233\1\357\16\233\2\u016d"+ -- "\3\233\1\u016d\1\233\1\u016d\1\233\1\u016d\2\233\1\u016d"+ -- "\1\233\4\u016d\2\233\1\u016d\1\233\1\u016d\12\233\11\256"+ -- "\2\125\1\126\13\256\1\125\15\256\1\u0291\52\256\2\125"+ -- "\1\126\13\256\1\125\4\256\1\u0292\63\256\2\125\1\126"+ -- "\13\256\1\125\14\256\1\u0293\42\256\1\0\3\147\1\0"+ -- "\3\147\1\u0294\13\0\2\147\1\u0295\1\147\6\0\1\151"+ -- "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\15\147\1\u0296\14\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\7\147\1\u0243\22\147\1\0\3\147\6\0"+ -- "\1\147\3\0\10\u022b\1\u0263\3\0\2\u01f4\10\u022b\1\u0263"+ -- "\1\0\57\u022b\1\0\3\u0264\1\0\3\u0264\1\u0297\3\0"+ -- "\2\u0298\6\0\4\u0264\7\0\32\u0264\1\0\3\u0264\6\0"+ -- "\1\u0264\4\0\3\u022f\1\0\3\u022f\1\u0265\3\0\2\u022f"+ -- "\1\u01f8\1\0\1\u022f\1\u0265\4\u022f\1\u0265\1\u022f\7\0"+ -- "\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0\3\u0266\1\0"+ -- "\3\u0266\1\u0299\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a"+ -- "\1\u0230\2\u01fa\4\u0266\7\0\32\u0266\1\0\3\u0266\6\0"+ -- "\1\u0266\4\0\3\u0267\1\0\3\u0267\1\u029b\3\0\1\u0231"+ -- "\3\0\1\u029c\3\0\4\u0267\7\0\32\u0267\1\0\3\u0267"+ -- "\6\0\1\u0267\3\0\2\u029d\1\u029e\2\u029d\2\u029e\1\u029d"+ -- "\1\u0268\3\0\10\u029d\1\u029e\1\u029d\1\u0268\1\0\7\u029d"+ -- "\25\u029e\4\u029d\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\4\u029d"+ -- "\1\u029f\1\u029e\1\u029f\1\u029d\2\u029e\1\u029f\1\u0268\3\0"+ -- "\10\u029d\1\u029e\1\u029f\1\u0269\1\147\7\u029d\25\u029e\4\u029f"+ -- "\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\3\u029d\10\0\1\u026a"+ -- "\15\0\1\u026a\12\0\1\u02a0\5\0\1\u02a1\40\0\3\147"+ -- "\1\0\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0"+ -- "\2\147\1\u02a2\5\147\1\u02a3\21\147\1\0\3\147\6\0"+ -- "\1\147\5\0\1\u02a4\2\0\2\u02a4\1\0\1\u026c\13\0"+ -- "\1\u02a4\1\0\1\u026c\10\0\25\u02a4\4\0\1\u02a4\1\0"+ -- "\3\u02a4\6\0\1\u02a4\4\0\1\147\1\u02a4\1\147\1\0"+ -- "\2\u02a4\1\147\1\u026c\13\0\1\u02a4\1\147\1\u026d\1\147"+ -- "\7\0\25\u02a4\4\147\1\u02a4\1\0\3\u02a4\6\0\1\u02a4"+ -- "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\6\147"+ -- "\1\u02a5\23\147\1\0\3\147\6\0\1\147\4\0\3\147"+ -- "\1\0\3\147\14\0\4\147\7\0\7\147\1\u02a6\22\147"+ -- "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ -- "\14\0\4\147\7\0\7\147\1\u02a7\22\147\1\0\3\147"+ -- "\6\0\1\147\4\0\3\147\1\0\3\147\1\u02a8\13\0"+ -- "\2\147\1\u02a9\1\147\7\0\32\147\1\0\3\147\6\0"+ -- "\1\147\3\0\10\u023b\1\u0272\3\0\1\u0204\11\u023b\1\u0272"+ -- "\1\0\57\u023b\1\0\3\u0273\1\0\3\u0273\1\u02aa\3\0"+ -- "\1\u02ab\7\0\4\u0273\7\0\32\u0273\1\0\3\u0273\6\0"+ -- "\1\u0273\4\0\3\u0274\1\0\3\u0274\1\u02ac\3\0\1\u02ad"+ -- "\1\0\1\u02ae\1\0\1\u02af\3\0\2\u0274\1\u02b0\1\u0274"+ -- "\7\0\32\u0274\1\0\3\u0274\6\0\1\u0274\4\0\3\u02b1"+ -- "\1\0\4\u02b1\3\0\2\u02b1\2\0\10\u02b1\7\0\32\u02b1"+ -- "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0276\1\0\3\u0276"+ -- "\1\u02ac\3\0\1\u02ad\1\0\1\u02ae\1\0\1\u02af\3\0"+ -- "\2\u0276\1\u02b2\1\u0276\7\0\32\u0276\1\0\3\u0276\6\0"+ -- "\1\u0276\4\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+ -- "\1\u0277\1\u02b3\6\u0277\7\0\32\u0277\1\0\3\u0277\6\0"+ -- "\1\u0277\3\0\10\u0244\1\u0278\3\0\12\u0244\1\u0278\1\0"+ -- "\60\u0244\3\u0247\1\u0244\3\u0247\1\u0278\3\0\10\u0244\2\u0247"+ -- "\1\u0279\1\147\7\u0244\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247"+ -- "\3\u0244\46\0\1\u02b4\106\0\1\u02b5\77\0\1\u02b6\66\0"+ -- "\1\u02b7\67\0\11\u024e\2\357\1\76\13\u024e\1\357\1\u024e"+ -- "\1\u0280\1\u012e\1\u0281\1\u012e\1\u024e\1\u012e\54\u024e\1\u027f"+ -- "\4\u024e\2\357\1\76\13\u024e\1\357\1\u01dd\1\u012e\1\357"+ -- "\54\u024e\4\u0284\1\u02b8\4\u0284\2\357\1\76\13\u0284\1\357"+ -- "\2\u0284\1\u0282\1\u012e\53\u0284\13\357\1\76\15\357\1\u012d"+ -- "\1\u012e\1\u024f\1\233\1\357\1\233\50\357\3\u0282\1\u02b9"+ -- "\1\u02ba\1\u0282\1\u02bb\1\u02bc\1\u0282\2\357\1\76\13\u0282"+ -- "\1\357\1\u0282\1\u012d\1\u0284\1\u02bd\1\u016d\1\u0282\1\u016d"+ -- "\25\u0282\1\u02b9\1\u0282\1\u02bc\1\u02b9\17\u0282\4\u012e\1\u016c"+ -- "\4\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e"+ -- "\53\u012e\4\u016b\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4"+ -- "\13\u016b\1\u01a3\1\u01a5\57\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+ -- "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0287\3\u016b"+ -- "\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b\1\u0287\1\u016b"+ -- "\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\13\u016b\3\u02be\3\u016b"+ -- "\1\u02be\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b"+ -- "\2\u02be\3\u016b\1\u02be\1\u016b\1\u02be\1\u016b\1\u02be\2\u016b"+ -- "\1\u02be\1\u016b\4\u02be\2\u016b\1\u02be\1\u016b\1\u02be\12\u016b"+ -- "\11\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289\1\230\1\u028a"+ -- "\1\230\1\u0254\1\230\54\u0254\1\u0288\4\u0254\3\76\13\u0254"+ -- "\1\76\1\u01e1\1\u012e\1\76\54\u0254\4\u028d\1\u02bf\4\u028d"+ -- "\3\0\13\u028d\1\0\2\u028d\1\u028b\1\230\53\u028d\31\76"+ -- "\1\227\1\230\1\u0255\1\0\1\76\1\0\50\76\3\u028b"+ -- "\1\u02c0\1\u02c1\1\u028b\1\u02c2\1\u02c3\1\u028b\3\76\13\u028b"+ -- "\1\76\1\u028b\1\227\1\u028d\1\u02c4\1\235\1\u028b\1\235"+ -- "\25\u028b\1\u02c0\1\u028b\1\u02c3\1\u02c0\17\u028b\4\230\1\234"+ -- "\4\230\3\0\13\230\1\0\2\230\1\76\1\u0254\53\230"+ -- "\4\232\1\u028e\1\232\1\u028f\21\232\1\356\57\232\3\u0290"+ -- "\3\232\1\u0290\20\232\1\356\15\232\2\u0290\3\232\1\u0290"+ -- "\1\232\1\u0290\1\232\1\u0290\2\232\1\u0290\1\232\4\u0290"+ -- "\2\232\1\u0290\1\232\1\u0290\13\232\3\u02c5\3\232\1\u02c5"+ -- "\20\232\1\356\15\232\2\u02c5\3\232\1\u02c5\1\232\1\u02c5"+ -- "\1\232\1\u02c5\2\232\1\u02c5\1\232\4\u02c5\2\232\1\u02c5"+ -- "\1\232\1\u02c5\12\232\11\256\2\125\1\126\13\256\1\125"+ -- "\4\256\1\u02c6\52\256\11\u0292\2\u02c7\1\u02c8\13\u0292\1\u02c7"+ -- "\57\u0292\11\256\2\125\1\126\13\256\1\125\15\256\1\u02c9"+ -- "\41\256\2\u02ca\1\u02cb\2\u02ca\2\u02cb\1\u02ca\1\u0294\3\0"+ -- "\10\u02ca\1\u02cb\1\u02ca\1\u0294\1\0\7\u02ca\25\u02cb\4\u02ca"+ -- "\1\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb\4\u02ca\1\u02cc\1\u02cb"+ -- "\1\u02cc\1\u02ca\2\u02cb\1\u02cc\1\u0294\3\0\10\u02ca\1\u02cb"+ -- "\1\u02cc\1\u0295\1\147\7\u02ca\25\u02cb\4\u02cc\1\u02cb\1\u02ca"+ -- "\3\u02cb\6\u02ca\1\u02cb\3\u02ca\1\0\3\147\1\0\3\147"+ -- "\1\u02cd\13\0\2\147\1\u02cd\1\147\7\0\32\147\1\0"+ -- "\3\147\6\0\1\147\13\0\1\u0297\3\0\2\u0298\10\0"+ -- "\1\u0297\62\0\1\u0264\2\0\2\u0264\1\0\1\u0298\13\0"+ -- "\1\u0264\1\0\1\u0298\10\0\25\u0264\4\0\1\u0264\1\0"+ -- "\3\u0264\6\0\1\u0264\4\0\3\u01fa\1\0\3\u01fa\1\u0299"+ -- "\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a\1\u0230\4\u01fa"+ -- "\1\u0299\1\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa"+ -- "\4\0\3\u02ce\1\0\4\u02ce\3\0\2\u02ce\2\0\1\u02ce"+ -- "\1\u02cf\6\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+ -- "\13\0\1\u029b\3\0\1\u0231\3\0\1\u029c\5\0\1\u029b"+ -- "\61\0\3\u02d0\1\0\4\u02d0\3\0\2\u02d0\2\0\10\u02d0"+ -- "\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\11\u029d"+ -- "\3\0\13\u029d\1\0\60\u029d\3\u029e\1\u029d\3\u029e\1\u02d1"+ -- "\3\0\2\u0268\6\u029d\3\u029e\1\u02d2\7\u029d\32\u029e\1\u029d"+ -- "\3\u029e\6\u029d\1\u029e\4\u029d\3\u029f\1\u029d\3\u029f\1\u029d"+ -- "\3\0\10\u029d\3\u029f\1\147\7\u029d\32\u029f\1\u029d\3\u029f"+ -- "\6\u029d\1\u029f\3\u029d\43\0\1\u02d3\116\0\1\u02d4\34\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u02d5"+ -- "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ -- "\3\147\14\0\4\147\7\0\14\147\1\u02d6\15\147\1\0"+ -- "\3\147\6\0\1\147\4\0\3\u02a4\1\0\3\u02a4\1\u02d7"+ -- "\13\0\4\u02a4\7\0\32\u02a4\1\0\3\u02a4\6\0\1\u02a4"+ -- "\4\0\3\147\1\0\3\147\1\u02d8\13\0\2\147\1\u02d9"+ -- "\1\147\6\0\1\151\32\147\1\0\3\147\6\0\1\147"+ -- "\3\0\2\u02da\1\u02db\2\u02da\2\u02db\1\u02da\1\u02a8\3\0"+ -- "\10\u02da\1\u02db\1\u02da\1\u02a8\1\0\7\u02da\25\u02db\4\u02da"+ -- "\1\u02db\1\u02da\3\u02db\6\u02da\1\u02db\4\u02da\1\u02dc\1\u02db"+ -- "\1\u02dc\1\u02da\2\u02db\1\u02dc\1\u02a8\3\0\10\u02da\1\u02db"+ -- "\1\u02dc\1\u02a9\1\147\7\u02da\25\u02db\4\u02dc\1\u02db\1\u02da"+ -- "\3\u02db\6\u02da\1\u02db\3\u02da\10\0\1\u02aa\3\0\1\u02ab"+ -- "\11\0\1\u02aa\62\0\1\u0273\2\0\2\u0273\1\0\1\u02ab"+ -- "\13\0\1\u0273\1\0\1\u02ab\10\0\25\u0273\4\0\1\u0273"+ -- "\1\0\3\u0273\6\0\1\u0273\13\0\1\u02ac\3\0\1\u02ad"+ -- "\1\0\1\u02ae\1\0\1\u02af\5\0\1\u02ac\62\0\1\u0274"+ -- "\2\0\2\u0274\1\0\1\u02ad\13\0\1\u0274\1\0\1\u02ad"+ -- "\10\0\25\u0274\4\0\1\u0274\1\0\3\u0274\6\0\1\u0274"+ -- "\13\0\1\u02ae\6\0\1\u02dd\6\0\1\u02ae\61\0\3\u02de"+ -- "\1\0\4\u02de\3\0\2\u02de\2\0\10\u02de\7\0\32\u02de"+ -- "\1\0\3\u02de\6\0\1\u02de\4\0\3\u02b1\1\0\4\u02b1"+ -- "\3\0\2\u02b1\2\0\1\u02b1\1\u02df\6\u02b1\7\0\32\u02b1"+ -- "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0277\1\0\3\u0277"+ -- "\1\u02b3\3\0\2\u0277\2\0\1\u0277\1\u02b3\4\u0277\1\u02b3"+ -- "\1\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\110\0"+ -- "\1\u02e0\106\0\1\u02e1\64\0\1\u02e2\23\0\3\u0284\1\u02e3"+ -- "\1\u02e4\1\u0284\1\u02e5\1\u02e6\1\u0284\2\357\1\76\13\u0284"+ -- "\1\357\34\u0284\1\u02e3\1\u0284\1\u02e6\1\u02e3\17\u0284\3\357"+ -- "\1\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d\1\u012e"+ -- "\1\u024f\1\233\1\357\1\233\25\357\1\u0282\1\357\2\u0282"+ -- "\23\357\1\u02e7\1\357\1\u02e8\4\357\1\76\15\357\1\u012d"+ -- "\1\u012e\1\u024f\1\233\1\357\1\233\51\357\3\u02e9\3\357"+ -- "\1\u02e9\3\357\1\76\15\357\1\u012d\1\u012e\1\u024f\1\233"+ -- "\1\357\1\233\7\357\2\u02e9\3\357\1\u02e9\1\357\1\u02e9"+ -- "\1\357\1\u02e9\2\357\1\u02e9\1\357\4\u02e9\2\357\1\u02e9"+ -- "\1\357\1\u02e9\15\357\1\u02b9\3\357\1\u02b9\3\357\1\76"+ -- "\15\357\1\u012d\1\u012e\1\u024f\1\233\1\357\1\233\25\357"+ -- "\1\u02b9\1\357\2\u02b9\17\357\4\u016d\1\u016e\4\u016d\2\357"+ -- "\1\76\13\u016d\1\357\3\u016d\1\357\53\u016d\1\u016b\3\u02ea"+ -- "\3\u016b\1\u02ea\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+ -- "\15\u016b\2\u02ea\3\u016b\1\u02ea\1\u016b\1\u02ea\1\u016b\1\u02ea"+ -- "\2\u016b\1\u02ea\1\u016b\4\u02ea\2\u016b\1\u02ea\1\u016b\1\u02ea"+ -- "\12\u016b\3\u028d\1\u02eb\1\u02ec\1\u028d\1\u02ed\1\u02ee\1\u028d"+ -- "\3\0\13\u028d\1\0\34\u028d\1\u02eb\1\u028d\1\u02ee\1\u02eb"+ -- "\17\u028d\3\76\1\u028b\3\76\1\u028b\21\76\1\227\1\230"+ -- "\1\u0255\1\0\1\76\1\0\25\76\1\u028b\1\76\2\u028b"+ -- "\23\76\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\u0255"+ -- "\1\0\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76"+ -- "\1\227\1\230\1\u0255\1\0\1\76\1\0\7\76\2\u02f1"+ -- "\3\76\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1"+ -- "\1\76\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\15\76\1\u02c0"+ -- "\3\76\1\u02c0\21\76\1\227\1\230\1\u0255\1\0\1\76"+ -- "\1\0\25\76\1\u02c0\1\76\2\u02c0\17\76\4\235\1\236"+ -- "\4\235\3\0\13\235\1\0\3\235\1\76\53\235\1\232"+ -- "\3\u02f2\3\232\1\u02f2\20\232\1\356\15\232\2\u02f2\3\232"+ -- "\1\u02f2\1\232\1\u02f2\1\232\1\u02f2\2\232\1\u02f2\1\232"+ -- "\4\u02f2\2\232\1\u02f2\1\232\1\u02f2\12\232\11\u02c6\2\u02f3"+ -- "\1\u02f4\13\u02c6\1\u02f3\57\u02c6\11\256\2\125\1\126\13\256"+ -- "\1\125\4\256\1\u02f5\52\256\11\u02ca\3\0\13\u02ca\1\0"+ -- "\60\u02ca\3\u02cb\1\u02ca\3\u02cb\1\u02f6\3\0\2\u0294\6\u02ca"+ -- "\3\u02cb\1\u02f7\7\u02ca\32\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb"+ -- "\4\u02ca\3\u02cc\1\u02ca\3\u02cc\1\u02ca\3\0\10\u02ca\3\u02cc"+ -- "\1\147\7\u02ca\32\u02cc\1\u02ca\3\u02cc\6\u02ca\1\u02cc\3\u02ca"+ -- "\13\u02cd\1\0\73\u02cd\1\0\3\u02ce\1\0\4\u02ce\3\0"+ -- "\2\u02ce\2\0\1\u02ce\1\u02f8\6\u02ce\7\0\32\u02ce\1\0"+ -- "\3\u02ce\6\0\1\u02ce\4\0\1\u02ce\1\u02f9\1\u02ce\1\0"+ -- "\2\u02f9\1\u02ce\1\u02cf\3\0\2\u02ce\2\0\1\u02ce\1\u02f8"+ -- "\2\u02ce\1\u02f9\1\u02ce\1\u02cf\1\u02ce\7\0\25\u02f9\4\u02ce"+ -- "\1\u02f9\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0"+ -- "\4\u02d0\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\6\u02d0\7\0"+ -- "\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\10\u029d\1\u02d1"+ -- "\3\0\2\u0268\10\u029d\1\u02d1\1\0\57\u029d\1\0\3\u02d2"+ -- "\1\0\3\u02d2\1\u02fb\3\0\2\u02fc\6\0\4\u02d2\7\0"+ -- "\32\u02d2\1\0\3\u02d2\6\0\1\u02d2\11\0\1\u02fd\151\0"+ -- "\1\u02fe\36\0\3\147\1\0\1\147\1\u02ff\1\147\14\0"+ -- "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ -- "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u0300"+ -- "\17\147\1\0\3\147\6\0\1\147\13\0\1\u02d7\15\0"+ -- "\1\u02d7\60\0\2\u0301\1\u0302\2\u0301\2\u0302\1\u0301\1\u02d8"+ -- "\3\0\10\u0301\1\u0302\1\u0301\1\u02d8\1\0\7\u0301\25\u0302"+ -- "\4\u0301\1\u0302\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\1\u0303"+ -- "\1\u0302\1\u0303\1\u0301\2\u0302\1\u0303\1\u02d8\3\0\10\u0301"+ -- "\1\u0302\1\u0303\1\u02d9\1\147\7\u0301\25\u0302\4\u0303\1\u0302"+ -- "\1\u0301\3\u0302\6\u0301\1\u0302\3\u0301\11\u02da\3\0\13\u02da"+ -- "\1\0\60\u02da\3\u02db\1\u02da\3\u02db\1\u0304\3\0\1\u02a8"+ -- "\7\u02da\3\u02db\1\u0305\7\u02da\32\u02db\1\u02da\3\u02db\6\u02da"+ -- "\1\u02db\4\u02da\3\u02dc\1\u02da\3\u02dc\1\u02da\3\0\10\u02da"+ -- "\3\u02dc\1\147\7\u02da\32\u02dc\1\u02da\3\u02dc\6\u02da\1\u02dc"+ -- "\3\u02da\10\0\1\u0306\5\0\1\u02ae\7\0\1\u0306\61\0"+ -- "\3\u02de\1\0\4\u02de\3\0\2\u02de\2\0\1\u02de\1\u0307"+ -- "\6\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+ -- "\1\u02b1\1\u0308\1\u02b1\1\0\2\u0308\1\u02b1\1\u02df\3\0"+ -- "\2\u02b1\2\0\1\u02b1\1\u02df\2\u02b1\1\u0308\1\u02b1\1\u02df"+ -- "\1\u02b1\7\0\25\u0308\4\u02b1\1\u0308\1\0\3\u0308\6\0"+ -- "\1\u0308\22\0\1\u0309\106\0\1\u030a\126\0\1\u030b\47\0"+ -- "\3\u012e\1\u0284\1\u016c\2\u012e\1\u0284\1\u012e\2\357\1\76"+ -- "\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e\1\u0284\1\u012e"+ -- "\2\u0284\23\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76"+ -- "\13\u012e\1\357\2\u012e\1\357\1\u024e\54\u012e\3\u030e\1\u016c"+ -- "\2\u012e\1\u030e\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ -- "\1\357\1\u024e\12\u012e\2\u030e\3\u012e\1\u030e\1\u012e\1\u030e"+ -- "\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e\4\u030e\2\u012e\1\u030e"+ -- "\1\u012e\1\u030e\15\u012e\1\u02e3\1\u016c\2\u012e\1\u02e3\1\u012e"+ -- "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e"+ -- "\1\u02e3\1\u012e\2\u02e3\17\u012e\4\357\1\u02e7\1\357\1\u02e8"+ -- "\4\357\1\76\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357"+ -- "\1\233\51\357\3\u02e9\3\357\1\u02e9\3\357\1\76\15\357"+ -- "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u02e9"+ -- "\3\357\1\u02e9\1\357\1\u02e9\1\357\1\u02e9\2\357\1\u02e9"+ -- "\1\357\4\u02e9\2\357\1\u02e9\1\357\1\u02e9\13\357\3\u030f"+ -- "\3\357\1\u030f\3\357\1\76\15\357\1\u012d\1\u012e\1\u012f"+ -- "\1\233\1\357\1\233\7\357\2\u030f\3\357\1\u030f\1\357"+ -- "\1\u030f\1\357\1\u030f\2\357\1\u030f\1\357\4\u030f\2\357"+ -- "\1\u030f\1\357\1\u030f\12\357\1\u016b\3\u0218\3\u016b\1\u0218"+ -- "\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0218"+ -- "\3\u016b\1\u0218\1\u016b\1\u0218\1\u016b\1\u0218\2\u016b\1\u0218"+ -- "\1\u016b\4\u0218\2\u016b\1\u0218\1\u016b\1\u0218\12\u016b\3\230"+ -- "\1\u028d\1\234\2\230\1\u028d\1\230\3\0\13\230\1\0"+ -- "\2\230\1\76\1\u0254\30\230\1\u028d\1\230\2\u028d\23\230"+ -- "\1\u0310\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230"+ -- "\1\76\1\u0254\54\230\3\u0312\1\234\2\230\1\u0312\1\230"+ -- "\3\0\13\230\1\0\2\230\1\76\1\u0254\12\230\2\u0312"+ -- "\3\230\1\u0312\1\230\1\u0312\1\230\1\u0312\2\230\1\u0312"+ -- "\1\230\4\u0312\2\230\1\u0312\1\230\1\u0312\15\230\1\u02eb"+ -- "\1\234\2\230\1\u02eb\1\230\3\0\13\230\1\0\2\230"+ -- "\1\76\1\u0254\30\230\1\u02eb\1\230\2\u02eb\17\230\4\76"+ -- "\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\231\1\0"+ -- "\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76\1\227"+ -- "\1\230\1\231\1\0\1\76\1\0\7\76\2\u02f1\3\76"+ -- "\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1\1\76"+ -- "\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\13\76\3\u0313\3\76"+ -- "\1\u0313\21\76\1\227\1\230\1\231\1\0\1\76\1\0"+ -- "\7\76\2\u0313\3\76\1\u0313\1\76\1\u0313\1\76\1\u0313"+ -- "\2\76\1\u0313\1\76\4\u0313\2\76\1\u0313\1\76\1\u0313"+ -- "\12\76\1\232\3\u021f\3\232\1\u021f\20\232\1\356\15\232"+ -- "\2\u021f\3\232\1\u021f\1\232\1\u021f\1\232\1\u021f\2\232"+ -- "\1\u021f\1\232\4\u021f\2\232\1\u021f\1\232\1\u021f\12\232"+ -- "\11\u02f5\2\u0314\1\u0315\13\u02f5\1\u0314\57\u02f5\10\u02ca\1\u02f6"+ -- "\3\0\2\u0294\10\u02ca\1\u02f6\1\0\57\u02ca\1\0\3\u02f7"+ -- "\1\0\3\u02f7\1\u0316\3\0\2\u0317\6\0\4\u02f7\7\0"+ -- "\32\u02f7\1\0\3\u02f7\6\0\1\u02f7\4\0\1\u02ce\1\u02f9"+ -- "\1\u02ce\1\0\2\u02f9\1\u02ce\1\u02f8\3\0\2\u02ce\1\u01f8"+ -- "\1\0\1\u02ce\1\u02f8\2\u02ce\1\u02f9\1\u02ce\1\u02f8\1\u02ce"+ -- "\7\0\25\u02f9\4\u02ce\1\u02f9\1\0\3\u02f9\6\0\1\u02f9"+ -- "\4\0\3\u02f9\1\0\3\u02f9\1\u0318\3\0\1\u02cf\1\u02ce"+ -- "\1\u01f8\1\0\1\u02ce\1\u02f8\2\u02ce\4\u02f9\7\0\32\u02f9"+ -- "\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0\3\u02d0"+ -- "\1\u02fa\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\4\u02d0\1\u02fa"+ -- "\1\u02d0\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\13\0"+ -- "\1\u02fb\3\0\2\u02fc\10\0\1\u02fb\62\0\1\u02d2\2\0"+ -- "\2\u02d2\1\0\1\u02fc\13\0\1\u02d2\1\0\1\u02fc\10\0"+ -- "\25\u02d2\4\0\1\u02d2\1\0\3\u02d2\6\0\1\u02d2\51\0"+ -- "\1\u0319\114\0\1\u031a\33\0\3\147\1\0\3\147\14\0"+ -- "\4\147\7\0\7\147\1\u031b\22\147\1\0\3\147\6\0"+ -- "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -- "\15\147\1\u031c\14\147\1\0\3\147\6\0\1\147\3\0"+ -- "\11\u0301\3\0\13\u0301\1\0\60\u0301\3\u0302\1\u0301\3\u0302"+ -- "\1\u031d\3\0\2\u02d8\6\u0301\3\u0302\1\u031e\7\u0301\32\u0302"+ -- "\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\3\u0303\1\u0301\3\u0303"+ -- "\1\u0301\3\0\10\u0301\3\u0303\1\147\7\u0301\32\u0303\1\u0301"+ -- "\3\u0303\6\u0301\1\u0303\3\u0301\10\u02da\1\u0304\3\0\1\u02a8"+ -- "\11\u02da\1\u0304\1\0\57\u02da\1\0\3\u0305\1\0\3\u0305"+ -- "\1\u031f\3\0\1\u0320\7\0\4\u0305\7\0\32\u0305\1\0"+ -- "\3\u0305\6\0\1\u0305\4\0\3\u02de\1\0\3\u02de\1\u0321"+ -- "\3\0\2\u02de\1\u02ae\1\0\1\u02de\1\u0307\4\u02de\1\u0321"+ -- "\1\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+ -- "\3\u0308\1\0\3\u0308\1\u0322\3\0\1\u02df\1\u02b1\1\u02ae"+ -- "\1\0\1\u0323\1\u02df\2\u02b1\2\u0308\1\u0324\1\u0308\7\0"+ -- "\32\u0308\1\0\3\u0308\6\0\1\u0308\44\0\1\u0325\45\0"+ -- "\4\u012e\1\u0326\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+ -- "\1\357\60\u012e\3\u030e\1\u016c\2\u012e\1\u030e\1\u012e\2\357"+ -- "\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e\2\u030e\3\u012e"+ -- "\1\u030e\1\u012e\1\u030e\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e"+ -- "\4\u030e\2\u012e\1\u030e\1\u012e\1\u030e\13\u012e\3\u0327\1\u016c"+ -- "\2\u012e\1\u0327\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ -- "\1\357\13\u012e\2\u0327\3\u012e\1\u0327\1\u012e\1\u0327\1\u012e"+ -- "\1\u0327\2\u012e\1\u0327\1\u012e\4\u0327\2\u012e\1\u0327\1\u012e"+ -- "\1\u0327\12\u012e\1\357\3\u0328\3\357\1\u0328\3\357\1\76"+ -- "\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357"+ -- "\2\u0328\3\357\1\u0328\1\357\1\u0328\1\357\1\u0328\2\357"+ -- "\1\u0328\1\357\4\u0328\2\357\1\u0328\1\357\1\u0328\12\357"+ -- "\4\230\1\u0329\1\230\1\u0311\2\230\3\0\13\230\1\0"+ -- "\60\230\3\u0312\1\234\2\230\1\u0312\1\230\3\0\13\230"+ -- "\1\0\2\230\1\76\13\230\2\u0312\3\230\1\u0312\1\230"+ -- "\1\u0312\1\230\1\u0312\2\230\1\u0312\1\230\4\u0312\2\230"+ -- "\1\u0312\1\230\1\u0312\13\230\3\u032a\1\234\2\230\1\u032a"+ -- "\1\230\3\0\13\230\1\0\2\230\1\76\13\230\2\u032a"+ -- "\3\230\1\u032a\1\230\1\u032a\1\230\1\u032a\2\230\1\u032a"+ -- "\1\230\4\u032a\2\230\1\u032a\1\230\1\u032a\12\230\1\76"+ -- "\3\u032b\3\76\1\u032b\21\76\1\227\1\230\1\231\1\0"+ -- "\1\76\1\0\7\76\2\u032b\3\76\1\u032b\1\76\1\u032b"+ -- "\1\76\1\u032b\2\76\1\u032b\1\76\4\u032b\2\76\1\u032b"+ -- "\1\76\1\u032b\12\76\10\0\1\u0316\3\0\2\u0317\10\0"+ -- "\1\u0316\62\0\1\u02f7\2\0\2\u02f7\1\0\1\u0317\13\0"+ -- "\1\u02f7\1\0\1\u0317\10\0\25\u02f7\4\0\1\u02f7\1\0"+ -- "\3\u02f7\6\0\1\u02f7\4\0\3\u02ce\1\0\3\u02ce\1\u0318"+ -- "\3\0\1\u02cf\1\u02ce\1\u01f8\1\0\1\u02ce\1\u02f8\4\u02ce"+ -- "\1\u0318\1\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+ -- "\51\0\1\u032c\41\0\3\147\1\0\3\147\14\0\4\147"+ -- "\7\0\7\147\1\u032d\22\147\1\0\3\147\6\0\1\147"+ -- "\3\0\10\u0301\1\u031d\3\0\2\u02d8\10\u0301\1\u031d\1\0"+ -- "\57\u0301\1\0\3\u031e\1\0\3\u031e\1\u032e\3\0\2\u032f"+ -- "\6\0\4\u031e\7\0\32\u031e\1\0\3\u031e\6\0\1\u031e"+ -- "\13\0\1\u031f\3\0\1\u0320\11\0\1\u031f\62\0\1\u0305"+ -- "\2\0\2\u0305\1\0\1\u0320\13\0\1\u0305\1\0\1\u0320"+ -- "\10\0\25\u0305\4\0\1\u0305\1\0\3\u0305\6\0\1\u0305"+ -- "\4\0\3\u02b1\1\0\3\u02b1\1\u0322\3\0\1\u02df\1\u02b1"+ -- "\1\u02ae\1\0\1\u0323\1\u02df\4\u02b1\1\u0322\1\u02b1\7\0"+ -- "\32\u02b1\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0330\1\0"+ -- "\4\u0330\3\0\2\u0330\2\0\1\u0330\1\u0331\6\u0330\7\0"+ -- "\32\u0330\1\0\3\u0330\6\0\1\u0330\110\0\1\u0332\1\0"+ -- "\4\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+ -- "\1\357\2\u012e\1\357\55\u012e\3\u0333\1\u016c\2\u012e\1\u0333"+ -- "\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e"+ -- "\2\u0333\3\u012e\1\u0333\1\u012e\1\u0333\1\u012e\1\u0333\2\u012e"+ -- "\1\u0333\1\u012e\4\u0333\2\u012e\1\u0333\1\u012e\1\u0333\12\u012e"+ -- "\1\357\3\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d"+ -- "\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u0282\3\357"+ -- "\1\u0282\1\357\1\u0282\1\357\1\u0282\2\357\1\u0282\1\357"+ -- "\4\u0282\2\357\1\u0282\1\357\1\u0282\12\357\4\230\1\u0310"+ -- "\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230\1\76"+ -- "\55\230\3\u0334\1\234\2\230\1\u0334\1\230\3\0\13\230"+ -- "\1\0\2\230\1\76\13\230\2\u0334\3\230\1\u0334\1\230"+ -- "\1\u0334\1\230\1\u0334\2\230\1\u0334\1\230\4\u0334\2\230"+ -- "\1\u0334\1\230\1\u0334\12\230\1\76\3\u028b\3\76\1\u028b"+ -- "\21\76\1\227\1\230\1\231\1\0\1\76\1\0\7\76"+ -- "\2\u028b\3\76\1\u028b\1\76\1\u028b\1\76\1\u028b\2\76"+ -- "\1\u028b\1\76\4\u028b\2\76\1\u028b\1\76\1\u028b\12\76"+ -- "\10\0\1\u032e\3\0\2\u032f\10\0\1\u032e\62\0\1\u031e"+ -- "\2\0\2\u031e\1\0\1\u032f\13\0\1\u031e\1\0\1\u032f"+ -- "\10\0\25\u031e\4\0\1\u031e\1\0\3\u031e\6\0\1\u031e"+ -- "\4\0\3\u0330\1\0\4\u0330\3\0\2\u0330\2\0\1\u0330"+ -- "\1\u0335\6\u0330\7\0\32\u0330\1\0\3\u0330\6\0\1\u0330"+ -- "\4\0\1\u0330\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0331"+ -- "\3\0\2\u0330\2\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330"+ -- "\1\u0331\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336"+ -- "\6\0\1\u0336\22\0\1\u0337\67\0\1\u012e\3\u0284\1\u016c"+ -- "\2\u012e\1\u0284\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ -- "\1\357\13\u012e\2\u0284\3\u012e\1\u0284\1\u012e\1\u0284\1\u012e"+ -- "\1\u0284\2\u012e\1\u0284\1\u012e\4\u0284\2\u012e\1\u0284\1\u012e"+ -- "\1\u0284\12\u012e\1\230\3\u028d\1\234\2\230\1\u028d\1\230"+ -- "\3\0\13\230\1\0\2\230\1\76\13\230\2\u028d\3\230"+ -- "\1\u028d\1\230\1\u028d\1\230\1\u028d\2\230\1\u028d\1\230"+ -- "\4\u028d\2\230\1\u028d\1\230\1\u028d\12\230\1\0\1\u0330"+ -- "\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0338\3\0\2\u0330"+ -- "\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330\1\u0338"+ -- "\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336\6\0"+ -- "\1\u0336\4\0\3\u0336\1\0\3\u0336\1\u0339\3\0\1\u0331"+ -- "\1\u0330\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\2\u0336\1\u033a"+ -- "\1\u0336\7\0\32\u0336\1\0\3\u0336\6\0\1\u0336\4\0"+ -- "\3\u0330\1\0\3\u0330\1\u0339\3\0\1\u0331\1\u0330\1\u02ae"+ -- "\1\0\1\u0330\1\u0335\4\u0330\1\u0339\1\u0330\7\0\32\u0330"+ -- "\1\0\3\u0330\6\0\1\u0330\3\0"; -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\17\147\1\u01cb\12\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\20\147\1\u01cc\11\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\4\147\1\u01cd\25\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\1\147\1\u01ce\30\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\1\u01cf\13\0"+ -+ "\2\147\1\u01d0\1\147\7\0\32\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u01d1\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\4\147\1\u01d2\25\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\21\147\1\u01d3\10\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\16\147\1\u01d4\13\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u01d5\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\1\337"+ -+ "\13\0\2\147\1\340\1\147\7\0\15\147\1\u01d6\14\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\22\0\1\u01d7"+ -+ "\133\0\1\u01d8\107\0\1\u01d9\110\0\1\u01da\113\0\1\u01db"+ -+ "\103\0\1\u01dc\110\0\1\u01dd\70\0\1\u01de\67\0\13\u01a6"+ -+ "\1\u01a7\14\u01a6\1\u01df\1\u01e0\1\u01e1\1\u01e2\1\u016d\1\u01a6"+ -+ "\1\u016d\52\u01a6\30\u01a7\1\u01e3\1\u01e4\1\u01e5\1\u01e6\1\232"+ -+ "\1\u01a7\1\232\52\u01a7\11\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ -+ "\1\u01a8\1\357\57\u016d\3\233\1\u016f\3\233\1\u016f\1\233"+ -+ "\2\357\1\76\13\233\1\357\3\233\1\357\30\233\1\u016f"+ -+ "\1\233\2\u016f\25\233\1\u01e7\1\233\1\u01e8\2\233\2\357"+ -+ "\1\76\13\233\1\357\3\233\1\357\56\233\3\u01e9\3\233"+ -+ "\1\u01e9\1\233\2\357\1\76\13\233\1\357\3\233\1\357"+ -+ "\12\233\2\u01e9\3\233\1\u01e9\1\233\1\u01e9\1\233\1\u01e9"+ -+ "\2\233\1\u01e9\1\233\4\u01e9\2\233\1\u01e9\1\233\1\u01e9"+ -+ "\17\233\1\u01a9\3\233\1\u01a9\1\233\2\357\1\76\13\233"+ -+ "\1\357\3\233\1\357\30\233\1\u01a9\1\233\2\u01a9\21\233"+ -+ "\1\0\3\235\3\0\1\235\36\0\2\235\3\0\1\235"+ -+ "\1\0\1\235\1\0\1\235\2\0\1\235\1\0\4\235"+ -+ "\2\0\1\235\1\0\1\235\14\0\11\u01ae\2\u01ea\1\u01eb"+ -+ "\13\u01ae\1\u01ea\61\u01ae\11\256\2\125\1\126\13\256\1\125"+ -+ "\12\256\1\u01ec\57\256\2\125\1\126\13\256\1\125\13\256"+ -+ "\1\u01ed\56\256\2\125\1\126\13\256\1\125\21\256\1\u01ee"+ -+ "\50\256\2\125\1\126\13\256\1\125\11\256\1\u01ef\47\256"+ -+ "\1\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -+ "\1\u01f0\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ -+ "\1\u01f1\25\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ -+ "\1\u01f2\7\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ -+ "\1\u01f3\25\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -+ "\1\u01f4\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ -+ "\1\u01f5\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ -+ "\1\u01f6\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\1\u01f7\2\147\14\0\4\147\7\0"+ -+ "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\1\u01f8\13\0\2\147\1\u01f9\1\147"+ -+ "\7\0\32\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\u01be\1\0\3\u01be\1\u01fa\3\0\1\u01fb\1\0"+ -+ "\1\u01fc\1\0\1\u01fd\3\0\4\u01be\7\0\32\u01be\1\0"+ -+ "\3\u01be\6\0\1\u01be\2\0\2\u01be\2\0\3\u01fe\1\0"+ -+ "\4\u01fe\3\0\2\u01fe\2\0\10\u01fe\7\0\32\u01fe\1\0"+ -+ "\3\u01fe\6\0\1\u01fe\2\0\2\u01fe\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\15\147\1\u01ff\14\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\5\147\1\u0200\24\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\6\0\1\151\32\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\15\147\1\u0201\14\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\5\147\1\u0202\24\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\3\147\1\u0203\26\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\16\147\1\u0204\13\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\13\147\1\u0205\16\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\12\147\1\u0206\17\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\4\147\1\u0207\25\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\1\u0208\13\0\2\147\1\u0209\1\147\7\0\32\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\1\147\1\u020a\1\147\14\0\4\147\7\0\32\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\24\147\1\u020b\5\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\3\0\1\u020c\2\0"+ -+ "\2\u020c\1\0\1\u01cf\13\0\1\u020c\1\0\1\u01cf\10\0"+ -+ "\25\u020c\4\0\1\u020c\1\0\3\u020c\6\0\1\u020c\2\0"+ -+ "\2\u020c\2\0\1\147\1\u020c\1\147\1\0\2\u020c\1\147"+ -+ "\1\u01cf\13\0\1\u020c\1\147\1\u01d0\1\147\7\0\25\u020c"+ -+ "\4\147\1\u020c\1\0\3\u020c\6\0\1\u020c\2\0\2\u020c"+ -+ "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ -+ "\1\u020d\14\147\1\0\3\147\6\0\1\147\2\0\2\147"+ -+ "\2\0\3\147\1\0\3\147\1\u020e\13\0\2\147\1\u020f"+ -+ "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\2\0\3\147\1\0\3\147\1\334\13\0\2\147"+ -+ "\1\335\1\147\7\0\15\147\1\u0210\14\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\11\0\4\u01d7\12\0\2\u01d7"+ -+ "\6\0\1\u0211\134\0\1\u0212\103\0\1\u0213\110\0\1\u0214"+ -+ "\76\0\1\u0215\113\0\1\u0216\147\0\1\u0217\13\0\4\u0218"+ -+ "\12\0\2\u0218\61\0\13\u01a6\1\u01a7\14\u01a6\1\u01df\1\u0219"+ -+ "\1\u01e1\1\u01e2\1\u016d\1\u01a6\1\u016d\65\u01a6\1\u01a7\14\u01a6"+ -+ "\1\u021a\1\u016d\57\u01a6\4\u01e1\1\u021b\4\u01e1\2\u01a6\1\u01a7"+ -+ "\13\u01e1\1\u01a6\1\u021c\1\u01e1\1\u01a6\56\u01e1\4\u021d\1\u021e"+ -+ "\4\u021d\2\u01a6\1\u01a7\13\u021d\1\u01a6\1\u021f\2\u021d\1\u016d"+ -+ "\55\u021d\30\u01a7\1\u01e3\1\u0220\1\u01e5\1\u01e6\1\232\1\u01a7"+ -+ "\1\232\102\u01a7\1\u0221\1\u016d\57\u01a7\4\u01e5\1\u0222\4\u01e5"+ -+ "\3\232\13\u01e5\1\232\1\u0223\1\u01e5\1\u01a7\56\u01e5\4\u0224"+ -+ "\1\u0225\4\u0224\3\232\13\u0224\1\232\1\u0226\2\u0224\1\232"+ -+ "\55\u0224\4\233\1\u01e7\1\233\1\u01e8\2\233\2\357\1\76"+ -+ "\13\233\1\357\62\233\3\u01e9\3\233\1\u01e9\1\233\2\357"+ -+ "\1\76\13\233\1\357\16\233\2\u01e9\3\233\1\u01e9\1\233"+ -+ "\1\u01e9\1\233\1\u01e9\2\233\1\u01e9\1\233\4\u01e9\2\233"+ -+ "\1\u01e9\1\233\1\u01e9\15\233\3\u0227\3\233\1\u0227\1\233"+ -+ "\2\357\1\76\13\233\1\357\16\233\2\u0227\3\233\1\u0227"+ -+ "\1\233\1\u0227\1\233\1\u0227\2\233\1\u0227\1\233\4\u0227"+ -+ "\2\233\1\u0227\1\233\1\u0227\14\233\11\256\2\125\1\126"+ -+ "\13\256\1\125\13\256\1\u0228\56\256\2\125\1\126\13\256"+ -+ "\1\125\14\256\1\u0229\55\256\2\125\1\126\13\256\1\125"+ -+ "\4\256\1\u022a\65\256\2\125\1\126\13\256\1\125\12\256"+ -+ "\1\u022b\46\256\1\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\5\147\1\u022c\24\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\1\u022d\13\0"+ -+ "\2\147\1\u022d\1\147\7\0\32\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\1\147\1\u022e\30\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\14\147\1\u022f\15\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\1\0\2\u0230\1\u0231\2\u0230\2\u0231"+ -+ "\1\u0230\1\u01f8\3\0\10\u0230\1\u0231\1\u0230\1\u01f8\1\0"+ -+ "\7\u0230\25\u0231\4\u0230\1\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ -+ "\2\u0230\2\u0231\2\u0230\1\u0232\1\u0231\1\u0232\1\u0230\2\u0231"+ -+ "\1\u0232\1\u01f8\3\0\10\u0230\1\u0231\1\u0232\1\u01f9\1\147"+ -+ "\7\u0230\25\u0231\4\u0232\1\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ -+ "\2\u0230\2\u0231\1\u0230\10\0\1\u01fa\3\0\1\u01fb\1\0"+ -+ "\1\u01fc\1\0\1\u01fd\5\0\1\u01fa\64\0\1\u01be\2\0"+ -+ "\2\u01be\1\0\1\u01fb\13\0\1\u01be\1\0\1\u01fb\10\0"+ -+ "\25\u01be\4\0\1\u01be\1\0\3\u01be\6\0\1\u01be\2\0"+ -+ "\2\u01be\11\0\1\u01fc\6\0\1\u0233\6\0\1\u01fc\63\0"+ -+ "\3\u0234\1\0\4\u0234\3\0\2\u0234\2\0\10\u0234\7\0"+ -+ "\32\u0234\1\0\3\u0234\6\0\1\u0234\2\0\2\u0234\2\0"+ -+ "\3\u01fe\1\0\4\u01fe\3\0\2\u01fe\2\0\1\u01fe\1\u0235"+ -+ "\6\u01fe\7\0\32\u01fe\1\0\3\u01fe\6\0\1\u01fe\2\0"+ -+ "\2\u01fe\2\0\3\147\1\0\3\147\1\u0236\13\0\2\147"+ -+ "\1\u0237\1\147\7\0\32\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\6\147\1\u0238\23\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\7\147\1\u0239\22\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\1\147\1\u023a\30\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\4\147\1\u023b\25\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\2\147\1\u023c\27\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\14\147\1\u023d\15\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\5\147\1\u023e\24\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\5\147\1\u023f\24\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\1\0\2\u0240\1\u0241\2\u0240\2\u0241\1\u0240"+ -+ "\1\u0208\3\0\10\u0240\1\u0241\1\u0240\1\u0208\1\0\7\u0240"+ -+ "\25\u0241\4\u0240\1\u0241\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240"+ -+ "\2\u0241\2\u0240\1\u0242\1\u0241\1\u0242\1\u0240\2\u0241\1\u0242"+ -+ "\1\u0208\3\0\10\u0240\1\u0241\1\u0242\1\u0209\1\147\7\u0240"+ -+ "\25\u0241\4\u0242\1\u0241\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240"+ -+ "\2\u0241\1\u0240\1\0\3\147\1\0\3\147\14\0\4\147"+ -+ "\7\0\24\147\1\u0243\5\147\1\0\3\147\6\0\1\147"+ -+ "\2\0\2\147\2\0\3\147\1\0\3\147\1\u0244\13\0"+ -+ "\2\147\1\u0245\1\147\7\0\32\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\u020c\1\0\3\u020c\1\u0246"+ -+ "\7\0\1\u0247\3\0\4\u020c\7\0\32\u020c\1\0\3\u020c"+ -+ "\6\0\1\u020c\2\0\2\u020c\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\15\147\1\u0248\14\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\1\0\1\u0249\1\u024a\1\u0249"+ -+ "\1\u024a\3\u0249\1\u024a\1\u020e\3\0\12\u0249\1\u020e\1\0"+ -+ "\34\u0249\4\u024a\22\u0249\1\u024b\1\u024c\1\u024b\1\u0249\2\u024c"+ -+ "\1\u024b\1\u020e\3\0\10\u0249\2\u024c\1\u020f\1\147\7\u0249"+ -+ "\25\u024c\4\u024b\1\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249"+ -+ "\2\u024c\1\u0249\46\0\1\u024d\115\0\1\u024e\110\0\1\u024f"+ -+ "\142\0\1\u0250\46\0\1\u0251\64\0\1\u0252\101\0\4\u0218"+ -+ "\12\0\2\u0218\6\0\1\u0253\52\0\13\357\1\76\14\357"+ -+ "\1\u01a6\1\u012e\1\u0254\1\u0255\55\357\11\u016d\2\u01a6\1\u01a7"+ -+ "\13\u016d\1\u01a6\1\u01a8\1\u01a6\57\u016d\11\u01e1\2\u01a6\1\u01a7"+ -+ "\13\u01e1\1\u01a6\1\u021c\64\u01e1\1\u021b\4\u01e1\2\u01a6\1\u01a7"+ -+ "\13\u01e1\1\u01a6\1\u021c\1\u0254\1\u01a6\56\u01e1\11\u016d\2\u01a6"+ -+ "\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\55\u016d\3\u021d"+ -+ "\1\u0256\1\u0257\1\u021d\1\u0258\1\u0259\1\u021d\2\u01a6\1\u01a7"+ -+ "\13\u021d\1\u01a6\1\u021f\33\u021d\1\u0256\1\u021d\1\u0259\1\u0256"+ -+ "\21\u021d\11\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\1\357"+ -+ "\1\u016d\1\u01a6\55\u016d\30\76\1\u01a7\1\u012e\1\u025a\1\u025b"+ -+ "\55\76\30\232\1\356\1\u01a7\57\232\11\u01e5\3\232\13\u01e5"+ -+ "\1\232\1\u0223\64\u01e5\1\u0222\4\u01e5\3\232\13\u01e5\1\232"+ -+ "\1\u0223\1\u025a\1\u01a7\56\u01e5\30\232\1\356\2\232\1\u01a7"+ -+ "\55\232\3\u0224\1\u025c\1\u025d\1\u0224\1\u025e\1\u025f\1\u0224"+ -+ "\3\232\13\u0224\1\232\1\u0226\33\u0224\1\u025c\1\u0224\1\u025f"+ -+ "\1\u025c\21\u0224\30\232\1\356\1\76\1\232\1\u01a7\55\232"+ -+ "\1\233\3\u0260\3\233\1\u0260\1\233\2\357\1\76\13\233"+ -+ "\1\357\16\233\2\u0260\3\233\1\u0260\1\233\1\u0260\1\233"+ -+ "\1\u0260\2\233\1\u0260\1\233\4\u0260\2\233\1\u0260\1\233"+ -+ "\1\u0260\14\233\11\256\2\125\1\126\13\256\1\125\14\256"+ -+ "\1\u0261\55\256\2\125\1\126\13\256\1\125\15\256\1\u0262"+ -+ "\43\256\11\u022a\2\u0263\1\u0264\13\u022a\1\u0263\61\u022a\11\256"+ -+ "\2\125\1\126\13\256\1\125\13\256\1\u0265\45\256\1\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\6\147\1\u0266"+ -+ "\23\147\1\0\3\147\6\0\1\147\2\0\2\147\1\0"+ -+ "\13\u022d\1\0\75\u022d\1\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\2\147\1\u0267\27\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\15\147\1\u0268\14\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\1\0\11\u0230\3\0\13\u0230\1\0"+ -+ "\62\u0230\3\u0231\1\u0230\3\u0231\1\u0269\3\0\2\u01f8\6\u0230"+ -+ "\3\u0231\1\u026a\7\u0230\32\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ -+ "\2\u0230\2\u0231\2\u0230\3\u0232\1\u0230\3\u0232\1\u0230\3\0"+ -+ "\10\u0230\3\u0232\1\147\7\u0230\32\u0232\1\u0230\3\u0232\6\u0230"+ -+ "\1\u0232\2\u0230\2\u0232\1\u0230\10\0\1\u0233\5\0\1\u01fc"+ -+ "\7\0\1\u0233\63\0\3\u0234\1\0\4\u0234\3\0\2\u0234"+ -+ "\2\0\1\u0234\1\u026b\6\u0234\7\0\32\u0234\1\0\3\u0234"+ -+ "\6\0\1\u0234\2\0\2\u0234\2\0\1\u01fe\1\u026c\1\u01fe"+ -+ "\1\0\2\u026c\1\u01fe\1\u0235\3\0\2\u01fe\2\0\1\u01fe"+ -+ "\1\u0235\2\u01fe\1\u026c\1\u01fe\1\u0235\1\u01fe\7\0\25\u026c"+ -+ "\4\u01fe\1\u026c\1\0\3\u026c\6\0\1\u026c\2\0\2\u026c"+ -+ "\3\0\1\u026d\2\0\2\u026d\1\0\1\u0236\13\0\1\u026d"+ -+ "\1\0\1\u0236\10\0\25\u026d\4\0\1\u026d\1\0\3\u026d"+ -+ "\6\0\1\u026d\2\0\2\u026d\2\0\1\147\1\u026d\1\147"+ -+ "\1\0\2\u026d\1\147\1\u0236\13\0\1\u026d\1\147\1\u0237"+ -+ "\1\147\7\0\25\u026d\4\147\1\u026d\1\0\3\u026d\6\0"+ -+ "\1\u026d\2\0\2\u026d\2\0\3\147\1\0\3\147\1\u026e"+ -+ "\13\0\2\147\1\u026f\1\147\6\0\1\151\32\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\1\u0270\13\0\2\147\1\u0271\1\147\7\0\32\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ -+ "\1\0\3\147\1\u0272\13\0\2\147\1\u0273\1\147\7\0"+ -+ "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\5\147\1\u0274"+ -+ "\24\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\2\147\1\u0275"+ -+ "\27\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0276"+ -+ "\30\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u0277"+ -+ "\25\147\1\0\3\147\6\0\1\147\2\0\2\147\1\0"+ -+ "\11\u0240\3\0\13\u0240\1\0\62\u0240\3\u0241\1\u0240\3\u0241"+ -+ "\1\u0278\3\0\1\u0208\7\u0240\3\u0241\1\u0279\7\u0240\32\u0241"+ -+ "\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240\2\u0241\2\u0240\3\u0242"+ -+ "\1\u0240\3\u0242\1\u0240\3\0\10\u0240\3\u0242\1\147\7\u0240"+ -+ "\32\u0242\1\u0240\3\u0242\6\u0240\1\u0242\2\u0240\2\u0242\1\u0240"+ -+ "\2\0\1\u027a\2\0\2\u027a\1\0\1\u0244\7\0\1\u027b"+ -+ "\3\0\1\u027a\1\0\1\u0244\10\0\25\u027a\4\0\1\u027a"+ -+ "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\2\0\1\147"+ -+ "\1\u027c\1\147\1\0\2\u027c\1\147\1\u0244\7\0\1\u027b"+ -+ "\3\0\1\u027c\1\147\1\u0245\1\147\7\0\25\u027c\4\147"+ -+ "\1\u027c\1\0\3\u027c\6\0\1\u027c\2\0\2\u027c\11\0"+ -+ "\1\u0246\7\0\1\u0247\5\0\1\u0246\63\0\3\u027d\1\0"+ -+ "\4\u027d\3\0\2\u027d\2\0\10\u027d\7\0\32\u027d\1\0"+ -+ "\3\u027d\6\0\1\u027d\2\0\2\u027d\1\0\11\u0249\3\0"+ -+ "\13\u0249\1\0\62\u0249\1\u024a\1\u0249\1\u024a\3\u0249\1\u024a"+ -+ "\1\u027e\3\0\12\u0249\1\u027e\1\0\34\u0249\4\u024a\22\u0249"+ -+ "\1\u024b\1\u024c\1\u024b\1\u0249\2\u024c\1\u024b\1\u027e\3\0"+ -+ "\10\u0249\2\u024c\1\u027f\1\147\7\u0249\25\u024c\4\u024b\1\u024c"+ -+ "\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c\2\u0249\3\u024c"+ -+ "\1\u0249\3\u024c\1\u0249\3\0\10\u0249\3\u024c\1\147\7\u0249"+ -+ "\32\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c\1\u0249"+ -+ "\106\0\1\u0280\56\0\1\u0281\110\0\1\u0282\53\0\1\u0283"+ -+ "\153\0\1\u0284\22\0\1\u0285\3\0\4\u0254\1\u0286\4\u0254"+ -+ "\2\357\1\76\13\u0254\1\357\1\u0254\1\u0287\1\u0254\1\u0288"+ -+ "\1\u012f\1\u0254\1\u012f\52\u0254\4\u0289\1\u028a\4\u0289\2\357"+ -+ "\1\76\13\u0289\1\357\1\u0289\1\u012e\1\u028b\1\u0130\1\u016f"+ -+ "\1\u0289\1\u016f\52\u0289\3\u016d\1\u021d\3\u016d\1\u021d\1\u016d"+ -+ "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\30\u016d"+ -+ "\1\u021d\1\u016d\2\u021d\25\u016d\1\u028c\1\u016d\1\u028d\2\u016d"+ -+ "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\56\u016d"+ -+ "\3\u028e\3\u016d\1\u028e\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ -+ "\1\u01a8\2\u016d\1\u01a6\12\u016d\2\u028e\3\u016d\1\u028e\1\u016d"+ -+ "\1\u028e\1\u016d\1\u028e\2\u016d\1\u028e\1\u016d\4\u028e\2\u016d"+ -+ "\1\u028e\1\u016d\1\u028e\17\u016d\1\u0256\3\u016d\1\u0256\1\u016d"+ -+ "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\30\u016d"+ -+ "\1\u0256\1\u016d\2\u0256\21\u016d\4\u025a\1\u028f\4\u025a\3\76"+ -+ "\13\u025a\1\76\1\u025a\1\u0290\1\u025a\1\u0291\1\230\1\u025a"+ -+ "\1\230\52\u025a\4\u0292\1\u0293\4\u0292\3\76\13\u0292\1\76"+ -+ "\1\u0292\1\227\1\u0294\1\231\1\235\1\u0292\1\235\52\u0292"+ -+ "\3\232\1\u0224\3\232\1\u0224\20\232\1\356\2\232\1\u01a7"+ -+ "\30\232\1\u0224\1\232\2\u0224\25\232\1\u0295\1\232\1\u0296"+ -+ "\21\232\1\356\2\232\1\u01a7\56\232\3\u0297\3\232\1\u0297"+ -+ "\20\232\1\356\2\232\1\u01a7\12\232\2\u0297\3\232\1\u0297"+ -+ "\1\232\1\u0297\1\232\1\u0297\2\232\1\u0297\1\232\4\u0297"+ -+ "\2\232\1\u0297\1\232\1\u0297\17\232\1\u025c\3\232\1\u025c"+ -+ "\20\232\1\356\2\232\1\u01a7\30\232\1\u025c\1\232\2\u025c"+ -+ "\21\232\1\233\3\u016f\3\233\1\u016f\1\233\2\357\1\76"+ -+ "\13\233\1\357\16\233\2\u016f\3\233\1\u016f\1\233\1\u016f"+ -+ "\1\233\1\u016f\2\233\1\u016f\1\233\4\u016f\2\233\1\u016f"+ -+ "\1\233\1\u016f\14\233\11\256\2\125\1\126\13\256\1\125"+ -+ "\15\256\1\u0298\54\256\2\125\1\126\13\256\1\125\4\256"+ -+ "\1\u0299\65\256\2\125\1\126\13\256\1\125\14\256\1\u029a"+ -+ "\44\256\1\0\3\147\1\0\3\147\1\u029b\13\0\2\147"+ -+ "\1\u029c\1\147\6\0\1\151\32\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\15\147\1\u029d\14\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ -+ "\4\147\7\0\7\147\1\u0248\22\147\1\0\3\147\6\0"+ -+ "\1\147\2\0\2\147\1\0\10\u0230\1\u0269\3\0\2\u01f8"+ -+ "\10\u0230\1\u0269\1\0\61\u0230\1\0\3\u026a\1\0\3\u026a"+ -+ "\1\u029e\3\0\2\u029f\6\0\4\u026a\7\0\32\u026a\1\0"+ -+ "\3\u026a\6\0\1\u026a\2\0\2\u026a\2\0\3\u0234\1\0"+ -+ "\3\u0234\1\u026b\3\0\2\u0234\1\u01fc\1\0\1\u0234\1\u026b"+ -+ "\4\u0234\1\u026b\1\u0234\7\0\32\u0234\1\0\3\u0234\6\0"+ -+ "\1\u0234\2\0\2\u0234\2\0\3\u026c\1\0\3\u026c\1\u02a0"+ -+ "\3\0\1\u0235\1\u01fe\1\u01fc\1\0\1\u02a1\1\u0235\2\u01fe"+ -+ "\4\u026c\7\0\32\u026c\1\0\3\u026c\6\0\1\u026c\2\0"+ -+ "\2\u026c\2\0\3\u026d\1\0\3\u026d\1\u02a2\3\0\1\u0236"+ -+ "\3\0\1\u02a3\3\0\4\u026d\7\0\32\u026d\1\0\3\u026d"+ -+ "\6\0\1\u026d\2\0\2\u026d\1\0\2\u02a4\1\u02a5\2\u02a4"+ -+ "\2\u02a5\1\u02a4\1\u026e\3\0\10\u02a4\1\u02a5\1\u02a4\1\u026e"+ -+ "\1\0\7\u02a4\25\u02a5\4\u02a4\1\u02a5\1\u02a4\3\u02a5\6\u02a4"+ -+ "\1\u02a5\2\u02a4\2\u02a5\2\u02a4\1\u02a6\1\u02a5\1\u02a6\1\u02a4"+ -+ "\2\u02a5\1\u02a6\1\u026e\3\0\10\u02a4\1\u02a5\1\u02a6\1\u026f"+ -+ "\1\147\7\u02a4\25\u02a5\4\u02a6\1\u02a5\1\u02a4\3\u02a5\6\u02a4"+ -+ "\1\u02a5\2\u02a4\2\u02a5\1\u02a4\10\0\1\u0270\15\0\1\u0270"+ -+ "\12\0\1\u02a7\5\0\1\u02a8\42\0\3\147\1\0\3\147"+ -+ "\1\u0270\13\0\2\147\1\u0271\1\147\7\0\2\147\1\u02a9"+ -+ "\5\147\1\u02aa\21\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\3\0\1\u02ab\2\0\2\u02ab\1\0\1\u0272\13\0"+ -+ "\1\u02ab\1\0\1\u0272\10\0\25\u02ab\4\0\1\u02ab\1\0"+ -+ "\3\u02ab\6\0\1\u02ab\2\0\2\u02ab\2\0\1\147\1\u02ab"+ -+ "\1\147\1\0\2\u02ab\1\147\1\u0272\13\0\1\u02ab\1\147"+ -+ "\1\u0273\1\147\7\0\25\u02ab\4\147\1\u02ab\1\0\3\u02ab"+ -+ "\6\0\1\u02ab\2\0\2\u02ab\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\6\147\1\u02ac\23\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\7\147\1\u02ad\22\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\14\0\4\147\7\0\7\147\1\u02ae\22\147\1\0\3\147"+ -+ "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ -+ "\1\u02af\13\0\2\147\1\u02b0\1\147\7\0\32\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\1\0\10\u0240\1\u0278"+ -+ "\3\0\1\u0208\11\u0240\1\u0278\1\0\61\u0240\1\0\3\u0279"+ -+ "\1\0\3\u0279\1\u02b1\3\0\1\u02b2\7\0\4\u0279\7\0"+ -+ "\32\u0279\1\0\3\u0279\6\0\1\u0279\2\0\2\u0279\2\0"+ -+ "\3\u027a\1\0\3\u027a\1\u02b3\3\0\1\u02b4\1\0\1\u02b5"+ -+ "\1\0\1\u02b6\3\0\2\u027a\1\u02b7\1\u027a\7\0\32\u027a"+ -+ "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\2\0\3\u02b8"+ -+ "\1\0\4\u02b8\3\0\2\u02b8\2\0\10\u02b8\7\0\32\u02b8"+ -+ "\1\0\3\u02b8\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u027c"+ -+ "\1\0\3\u027c\1\u02b3\3\0\1\u02b4\1\0\1\u02b5\1\0"+ -+ "\1\u02b6\3\0\2\u027c\1\u02b9\1\u027c\7\0\32\u027c\1\0"+ -+ "\3\u027c\6\0\1\u027c\2\0\2\u027c\2\0\3\u027d\1\0"+ -+ "\4\u027d\3\0\2\u027d\2\0\1\u027d\1\u02ba\6\u027d\7\0"+ -+ "\32\u027d\1\0\3\u027d\6\0\1\u027d\2\0\2\u027d\1\0"+ -+ "\10\u0249\1\u027e\3\0\12\u0249\1\u027e\1\0\62\u0249\3\u024c"+ -+ "\1\u0249\3\u024c\1\u027e\3\0\10\u0249\2\u024c\1\u027f\1\147"+ -+ "\7\u0249\32\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c"+ -+ "\1\u0249\6\0\1\u02bb\30\0\1\u02bc\1\u02bd\1\u02be\2\0"+ -+ "\1\u02bf\1\0\1\u02c0\1\u02c1\1\0\1\u02c2\2\0\1\u02c3"+ -+ "\1\u02c4\1\u02c5\2\0\1\u02c6\1\u02c7\74\0\1\u02c8\110\0"+ -+ "\1\u02c9\101\0\1\u02ca\70\0\1\u02cb\71\0\11\u0254\2\357"+ -+ "\1\76\13\u0254\1\357\1\u0254\1\u0287\1\u012f\1\u0288\1\u012f"+ -+ "\1\u0254\1\u012f\56\u0254\1\u0286\4\u0254\2\357\1\76\13\u0254"+ -+ "\1\357\1\u01e1\1\u012f\1\357\56\u0254\4\u028b\1\u02cc\4\u028b"+ -+ "\2\357\1\76\13\u028b\1\357\2\u028b\1\u0289\1\u012f\55\u028b"+ -+ "\13\357\1\76\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357"+ -+ "\1\233\52\357\3\u0289\1\u02cd\1\u02ce\1\u0289\1\u02cf\1\u02d0"+ -+ "\1\u0289\2\357\1\76\13\u0289\1\357\1\u0289\1\u012e\1\u028b"+ -+ "\1\u02d1\1\u016f\1\u0289\1\u016f\25\u0289\1\u02cd\1\u0289\1\u02d0"+ -+ "\1\u02cd\21\u0289\4\u012f\1\u016e\4\u012f\2\357\1\76\13\u012f"+ -+ "\1\357\2\u012f\1\357\1\u0254\55\u012f\4\u016d\1\u028c\1\u016d"+ -+ "\1\u028d\2\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\61\u016d"+ -+ "\3\u028e\3\u016d\1\u028e\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ -+ "\1\u01a8\15\u016d\2\u028e\3\u016d\1\u028e\1\u016d\1\u028e\1\u016d"+ -+ "\1\u028e\2\u016d\1\u028e\1\u016d\4\u028e\2\u016d\1\u028e\1\u016d"+ -+ "\1\u028e\15\u016d\3\u02d2\3\u016d\1\u02d2\1\u016d\2\u01a6\1\u01a7"+ -+ "\13\u016d\1\u01a6\1\u01a8\15\u016d\2\u02d2\3\u016d\1\u02d2\1\u016d"+ -+ "\1\u02d2\1\u016d\1\u02d2\2\u016d\1\u02d2\1\u016d\4\u02d2\2\u016d"+ -+ "\1\u02d2\1\u016d\1\u02d2\14\u016d\11\u025a\3\76\13\u025a\1\76"+ -+ "\1\u025a\1\u0290\1\230\1\u0291\1\230\1\u025a\1\230\56\u025a"+ -+ "\1\u028f\4\u025a\3\76\13\u025a\1\76\1\u01e5\1\u012f\1\76"+ -+ "\56\u025a\4\u0294\1\u02d3\4\u0294\3\0\13\u0294\1\0\2\u0294"+ -+ "\1\u0292\1\230\55\u0294\31\76\1\227\1\230\1\u025b\1\0"+ -+ "\1\76\1\0\52\76\3\u0292\1\u02d4\1\u02d5\1\u0292\1\u02d6"+ -+ "\1\u02d7\1\u0292\3\76\13\u0292\1\76\1\u0292\1\227\1\u0294"+ -+ "\1\u02d8\1\235\1\u0292\1\235\25\u0292\1\u02d4\1\u0292\1\u02d7"+ -+ "\1\u02d4\21\u0292\4\230\1\234\4\230\3\0\13\230\1\0"+ -+ "\2\230\1\76\1\u025a\55\230\4\232\1\u0295\1\232\1\u0296"+ -+ "\21\232\1\356\61\232\3\u0297\3\232\1\u0297\20\232\1\356"+ -+ "\15\232\2\u0297\3\232\1\u0297\1\232\1\u0297\1\232\1\u0297"+ -+ "\2\232\1\u0297\1\232\4\u0297\2\232\1\u0297\1\232\1\u0297"+ -+ "\15\232\3\u02d9\3\232\1\u02d9\20\232\1\356\15\232\2\u02d9"+ -+ "\3\232\1\u02d9\1\232\1\u02d9\1\232\1\u02d9\2\232\1\u02d9"+ -+ "\1\232\4\u02d9\2\232\1\u02d9\1\232\1\u02d9\14\232\11\256"+ -+ "\2\125\1\126\13\256\1\125\4\256\1\u02da\54\256\11\u0299"+ -+ "\2\u02db\1\u02dc\13\u0299\1\u02db\61\u0299\11\256\2\125\1\126"+ -+ "\13\256\1\125\15\256\1\u02dd\43\256\2\u02de\1\u02df\2\u02de"+ -+ "\2\u02df\1\u02de\1\u029b\3\0\10\u02de\1\u02df\1\u02de\1\u029b"+ -+ "\1\0\7\u02de\25\u02df\4\u02de\1\u02df\1\u02de\3\u02df\6\u02de"+ -+ "\1\u02df\2\u02de\2\u02df\2\u02de\1\u02e0\1\u02df\1\u02e0\1\u02de"+ -+ "\2\u02df\1\u02e0\1\u029b\3\0\10\u02de\1\u02df\1\u02e0\1\u029c"+ -+ "\1\147\7\u02de\25\u02df\4\u02e0\1\u02df\1\u02de\3\u02df\6\u02de"+ -+ "\1\u02df\2\u02de\2\u02df\1\u02de\1\0\3\147\1\0\3\147"+ -+ "\1\u02e1\13\0\2\147\1\u02e1\1\147\7\0\32\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\11\0\1\u029e\3\0"+ -+ "\2\u029f\10\0\1\u029e\64\0\1\u026a\2\0\2\u026a\1\0"+ -+ "\1\u029f\13\0\1\u026a\1\0\1\u029f\10\0\25\u026a\4\0"+ -+ "\1\u026a\1\0\3\u026a\6\0\1\u026a\2\0\2\u026a\2\0"+ -+ "\3\u01fe\1\0\3\u01fe\1\u02a0\3\0\1\u0235\1\u01fe\1\u01fc"+ -+ "\1\0\1\u02a1\1\u0235\4\u01fe\1\u02a0\1\u01fe\7\0\32\u01fe"+ -+ "\1\0\3\u01fe\6\0\1\u01fe\2\0\2\u01fe\2\0\3\u02e2"+ -+ "\1\0\4\u02e2\3\0\2\u02e2\2\0\1\u02e2\1\u02e3\6\u02e2"+ -+ "\7\0\32\u02e2\1\0\3\u02e2\6\0\1\u02e2\2\0\2\u02e2"+ -+ "\11\0\1\u02a2\3\0\1\u0236\3\0\1\u02a3\5\0\1\u02a2"+ -+ "\63\0\3\u02e4\1\0\4\u02e4\3\0\2\u02e4\2\0\10\u02e4"+ -+ "\7\0\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0\2\u02e4"+ -+ "\1\0\11\u02a4\3\0\13\u02a4\1\0\62\u02a4\3\u02a5\1\u02a4"+ -+ "\3\u02a5\1\u02e5\3\0\2\u026e\6\u02a4\3\u02a5\1\u02e6\7\u02a4"+ -+ "\32\u02a5\1\u02a4\3\u02a5\6\u02a4\1\u02a5\2\u02a4\2\u02a5\2\u02a4"+ -+ "\3\u02a6\1\u02a4\3\u02a6\1\u02a4\3\0\10\u02a4\3\u02a6\1\147"+ -+ "\7\u02a4\32\u02a6\1\u02a4\3\u02a6\6\u02a4\1\u02a6\2\u02a4\2\u02a6"+ -+ "\1\u02a4\43\0\1\u02e7\120\0\1\u02e8\36\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\4\147\1\u02e9\25\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\14\147\1\u02ea\15\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\u02ab\1\0"+ -+ "\3\u02ab\1\u02eb\13\0\4\u02ab\7\0\32\u02ab\1\0\3\u02ab"+ -+ "\6\0\1\u02ab\2\0\2\u02ab\2\0\3\147\1\0\3\147"+ -+ "\1\u02ec\13\0\2\147\1\u02ed\1\147\6\0\1\151\32\147"+ -+ "\1\0\3\147\6\0\1\147\2\0\2\147\1\0\2\u02ee"+ -+ "\1\u02ef\2\u02ee\2\u02ef\1\u02ee\1\u02af\3\0\10\u02ee\1\u02ef"+ -+ "\1\u02ee\1\u02af\1\0\7\u02ee\25\u02ef\4\u02ee\1\u02ef\1\u02ee"+ -+ "\3\u02ef\6\u02ee\1\u02ef\2\u02ee\2\u02ef\2\u02ee\1\u02f0\1\u02ef"+ -+ "\1\u02f0\1\u02ee\2\u02ef\1\u02f0\1\u02af\3\0\10\u02ee\1\u02ef"+ -+ "\1\u02f0\1\u02b0\1\147\7\u02ee\25\u02ef\4\u02f0\1\u02ef\1\u02ee"+ -+ "\3\u02ef\6\u02ee\1\u02ef\2\u02ee\2\u02ef\1\u02ee\10\0\1\u02b1"+ -+ "\3\0\1\u02b2\11\0\1\u02b1\64\0\1\u0279\2\0\2\u0279"+ -+ "\1\0\1\u02b2\13\0\1\u0279\1\0\1\u02b2\10\0\25\u0279"+ -+ "\4\0\1\u0279\1\0\3\u0279\6\0\1\u0279\2\0\2\u0279"+ -+ "\11\0\1\u02b3\3\0\1\u02b4\1\0\1\u02b5\1\0\1\u02b6"+ -+ "\5\0\1\u02b3\64\0\1\u027a\2\0\2\u027a\1\0\1\u02b4"+ -+ "\13\0\1\u027a\1\0\1\u02b4\10\0\25\u027a\4\0\1\u027a"+ -+ "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\11\0\1\u02b5"+ -+ "\6\0\1\u02f1\6\0\1\u02b5\63\0\3\u02f2\1\0\4\u02f2"+ -+ "\3\0\2\u02f2\2\0\10\u02f2\7\0\32\u02f2\1\0\3\u02f2"+ -+ "\6\0\1\u02f2\2\0\2\u02f2\2\0\3\u02b8\1\0\4\u02b8"+ -+ "\3\0\2\u02b8\2\0\1\u02b8\1\u02f3\6\u02b8\7\0\32\u02b8"+ -+ "\1\0\3\u02b8\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u027d"+ -+ "\1\0\3\u027d\1\u02ba\3\0\2\u027d\2\0\1\u027d\1\u02ba"+ -+ "\4\u027d\1\u02ba\1\u027d\7\0\32\u027d\1\0\3\u027d\6\0"+ -+ "\1\u027d\2\0\2\u027d\41\0\1\u02f4\20\0\1\u02f5\67\0"+ -+ "\1\u02f6\114\0\1\u02f7\103\0\1\u02f8\112\0\1\u02f9\107\0"+ -+ "\1\u02fa\107\0\1\u02fb\4\0\1\u02fc\103\0\1\u02fd\4\0"+ -+ "\1\u02fe\1\0\1\u02ff\50\0\1\u0300\32\0\1\u0301\17\0"+ -+ "\1\u0302\35\0\1\u0303\35\0\1\u0304\110\0\1\u0305\6\0"+ -+ "\1\u0306\100\0\1\u0307\7\0\1\u0308\103\0\1\u0309\4\0"+ -+ "\1\u030a\142\0\1\u030b\110\0\1\u030c\66\0\1\u030d\25\0"+ -+ "\3\u028b\1\u030e\1\u030f\1\u028b\1\u0310\1\u0311\1\u028b\2\357"+ -+ "\1\76\13\u028b\1\357\34\u028b\1\u030e\1\u028b\1\u0311\1\u030e"+ -+ "\21\u028b\3\357\1\u0289\3\357\1\u0289\3\357\1\76\15\357"+ -+ "\1\u012e\1\u012f\1\u0255\1\233\1\357\1\233\25\357\1\u0289"+ -+ "\1\357\2\u0289\25\357\1\u0312\1\357\1\u0313\4\357\1\76"+ -+ "\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357\1\233\53\357"+ -+ "\3\u0314\3\357\1\u0314\3\357\1\76\15\357\1\u012e\1\u012f"+ -+ "\1\u0255\1\233\1\357\1\233\7\357\2\u0314\3\357\1\u0314"+ -+ "\1\357\1\u0314\1\357\1\u0314\2\357\1\u0314\1\357\4\u0314"+ -+ "\2\357\1\u0314\1\357\1\u0314\17\357\1\u02cd\3\357\1\u02cd"+ -+ "\3\357\1\76\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357"+ -+ "\1\233\25\357\1\u02cd\1\357\2\u02cd\21\357\4\u016f\1\u0170"+ -+ "\4\u016f\2\357\1\76\13\u016f\1\357\3\u016f\1\357\55\u016f"+ -+ "\1\u016d\3\u0315\3\u016d\1\u0315\1\u016d\2\u01a6\1\u01a7\13\u016d"+ -+ "\1\u01a6\1\u01a8\15\u016d\2\u0315\3\u016d\1\u0315\1\u016d\1\u0315"+ -+ "\1\u016d\1\u0315\2\u016d\1\u0315\1\u016d\4\u0315\2\u016d\1\u0315"+ -+ "\1\u016d\1\u0315\14\u016d\3\u0294\1\u0316\1\u0317\1\u0294\1\u0318"+ -+ "\1\u0319\1\u0294\3\0\13\u0294\1\0\34\u0294\1\u0316\1\u0294"+ -+ "\1\u0319\1\u0316\21\u0294\3\76\1\u0292\3\76\1\u0292\21\76"+ -+ "\1\227\1\230\1\u025b\1\0\1\76\1\0\25\76\1\u0292"+ -+ "\1\76\2\u0292\25\76\1\u031a\1\76\1\u031b\22\76\1\227"+ -+ "\1\230\1\u025b\1\0\1\76\1\0\53\76\3\u031c\3\76"+ -+ "\1\u031c\21\76\1\227\1\230\1\u025b\1\0\1\76\1\0"+ -+ "\7\76\2\u031c\3\76\1\u031c\1\76\1\u031c\1\76\1\u031c"+ -+ "\2\76\1\u031c\1\76\4\u031c\2\76\1\u031c\1\76\1\u031c"+ -+ "\17\76\1\u02d4\3\76\1\u02d4\21\76\1\227\1\230\1\u025b"+ -+ "\1\0\1\76\1\0\25\76\1\u02d4\1\76\2\u02d4\21\76"+ -+ "\4\235\1\236\4\235\3\0\13\235\1\0\3\235\1\76"+ -+ "\55\235\1\232\3\u031d\3\232\1\u031d\20\232\1\356\15\232"+ -+ "\2\u031d\3\232\1\u031d\1\232\1\u031d\1\232\1\u031d\2\232"+ -+ "\1\u031d\1\232\4\u031d\2\232\1\u031d\1\232\1\u031d\14\232"+ -+ "\11\u02da\2\u031e\1\u031f\13\u02da\1\u031e\61\u02da\11\256\2\125"+ -+ "\1\126\13\256\1\125\4\256\1\u0320\54\256\11\u02de\3\0"+ -+ "\13\u02de\1\0\62\u02de\3\u02df\1\u02de\3\u02df\1\u0321\3\0"+ -+ "\2\u029b\6\u02de\3\u02df\1\u0322\7\u02de\32\u02df\1\u02de\3\u02df"+ -+ "\6\u02de\1\u02df\2\u02de\2\u02df\2\u02de\3\u02e0\1\u02de\3\u02e0"+ -+ "\1\u02de\3\0\10\u02de\3\u02e0\1\147\7\u02de\32\u02e0\1\u02de"+ -+ "\3\u02e0\6\u02de\1\u02e0\2\u02de\2\u02e0\1\u02de\13\u02e1\1\0"+ -+ "\75\u02e1\1\0\3\u02e2\1\0\4\u02e2\3\0\2\u02e2\2\0"+ -+ "\1\u02e2\1\u0323\6\u02e2\7\0\32\u02e2\1\0\3\u02e2\6\0"+ -+ "\1\u02e2\2\0\2\u02e2\2\0\1\u02e2\1\u0324\1\u02e2\1\0"+ -+ "\2\u0324\1\u02e2\1\u02e3\3\0\2\u02e2\2\0\1\u02e2\1\u0323"+ -+ "\2\u02e2\1\u0324\1\u02e2\1\u02e3\1\u02e2\7\0\25\u0324\4\u02e2"+ -+ "\1\u0324\1\0\3\u0324\6\0\1\u0324\2\0\2\u0324\2\0"+ -+ "\3\u02e4\1\0\4\u02e4\3\0\2\u02e4\2\0\1\u02e4\1\u0325"+ -+ "\6\u02e4\7\0\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0"+ -+ "\2\u02e4\1\0\10\u02a4\1\u02e5\3\0\2\u026e\10\u02a4\1\u02e5"+ -+ "\1\0\61\u02a4\1\0\3\u02e6\1\0\3\u02e6\1\u0326\3\0"+ -+ "\2\u0327\6\0\4\u02e6\7\0\32\u02e6\1\0\3\u02e6\6\0"+ -+ "\1\u02e6\2\0\2\u02e6\7\0\1\u0328\153\0\1\u0329\40\0"+ -+ "\3\147\1\0\1\147\1\u032a\1\147\14\0\4\147\7\0"+ -+ "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ -+ "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u032b"+ -+ "\17\147\1\0\3\147\6\0\1\147\2\0\2\147\11\0"+ -+ "\1\u02eb\15\0\1\u02eb\62\0\2\u032c\1\u032d\2\u032c\2\u032d"+ -+ "\1\u032c\1\u02ec\3\0\10\u032c\1\u032d\1\u032c\1\u02ec\1\0"+ -+ "\7\u032c\25\u032d\4\u032c\1\u032d\1\u032c\3\u032d\6\u032c\1\u032d"+ -+ "\2\u032c\2\u032d\2\u032c\1\u032e\1\u032d\1\u032e\1\u032c\2\u032d"+ -+ "\1\u032e\1\u02ec\3\0\10\u032c\1\u032d\1\u032e\1\u02ed\1\147"+ -+ "\7\u032c\25\u032d\4\u032e\1\u032d\1\u032c\3\u032d\6\u032c\1\u032d"+ -+ "\2\u032c\2\u032d\1\u032c\11\u02ee\3\0\13\u02ee\1\0\62\u02ee"+ -+ "\3\u02ef\1\u02ee\3\u02ef\1\u032f\3\0\1\u02af\7\u02ee\3\u02ef"+ -+ "\1\u0330\7\u02ee\32\u02ef\1\u02ee\3\u02ef\6\u02ee\1\u02ef\2\u02ee"+ -+ "\2\u02ef\2\u02ee\3\u02f0\1\u02ee\3\u02f0\1\u02ee\3\0\10\u02ee"+ -+ "\3\u02f0\1\147\7\u02ee\32\u02f0\1\u02ee\3\u02f0\6\u02ee\1\u02f0"+ -+ "\2\u02ee\2\u02f0\1\u02ee\10\0\1\u0331\5\0\1\u02b5\7\0"+ -+ "\1\u0331\63\0\3\u02f2\1\0\4\u02f2\3\0\2\u02f2\2\0"+ -+ "\1\u02f2\1\u0332\6\u02f2\7\0\32\u02f2\1\0\3\u02f2\6\0"+ -+ "\1\u02f2\2\0\2\u02f2\2\0\1\u02b8\1\u0333\1\u02b8\1\0"+ -+ "\2\u0333\1\u02b8\1\u02f3\3\0\2\u02b8\2\0\1\u02b8\1\u02f3"+ -+ "\2\u02b8\1\u0333\1\u02b8\1\u02f3\1\u02b8\7\0\25\u0333\4\u02b8"+ -+ "\1\u0333\1\0\3\u0333\6\0\1\u0333\2\0\2\u0333\54\0"+ -+ "\1\u0334\116\0\1\u0335\66\0\1\u0336\111\0\1\u0337\111\0"+ -+ "\1\u0338\111\0\1\u0339\123\0\1\u033a\4\0\1\u033b\66\0"+ -+ "\1\u033c\113\0\1\u033d\105\0\1\u033e\115\0\1\u033f\104\0"+ -+ "\1\u0340\112\0\1\u0341\120\0\1\u0342\110\0\1\u0343\100\0"+ -+ "\1\u0344\105\0\1\u0345\15\0\1\u0346\114\0\1\u0347\67\0"+ -+ "\1\u0348\106\0\1\u0349\114\0\1\u034a\122\0\1\u034b\107\0"+ -+ "\1\u034c\53\0\1\u034d\110\0\1\u034e\130\0\1\u034f\51\0"+ -+ "\3\u012f\1\u028b\1\u016e\2\u012f\1\u028b\1\u012f\2\357\1\76"+ -+ "\13\u012f\1\357\2\u012f\1\357\1\u0254\30\u012f\1\u028b\1\u012f"+ -+ "\2\u028b\25\u012f\1\u0350\1\u012f\1\u0351\2\u012f\2\357\1\76"+ -+ "\13\u012f\1\357\2\u012f\1\357\1\u0254\56\u012f\3\u0352\1\u016e"+ -+ "\2\u012f\1\u0352\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f"+ -+ "\1\357\1\u0254\12\u012f\2\u0352\3\u012f\1\u0352\1\u012f\1\u0352"+ -+ "\1\u012f\1\u0352\2\u012f\1\u0352\1\u012f\4\u0352\2\u012f\1\u0352"+ -+ "\1\u012f\1\u0352\17\u012f\1\u030e\1\u016e\2\u012f\1\u030e\1\u012f"+ -+ "\2\357\1\76\13\u012f\1\357\2\u012f\1\357\1\u0254\30\u012f"+ -+ "\1\u030e\1\u012f\2\u030e\21\u012f\4\357\1\u0312\1\357\1\u0313"+ -+ "\4\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233\1\357"+ -+ "\1\233\53\357\3\u0314\3\357\1\u0314\3\357\1\76\15\357"+ -+ "\1\u012e\1\u012f\1\u0130\1\233\1\357\1\233\7\357\2\u0314"+ -+ "\3\357\1\u0314\1\357\1\u0314\1\357\1\u0314\2\357\1\u0314"+ -+ "\1\357\4\u0314\2\357\1\u0314\1\357\1\u0314\15\357\3\u0353"+ -+ "\3\357\1\u0353\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130"+ -+ "\1\233\1\357\1\233\7\357\2\u0353\3\357\1\u0353\1\357"+ -+ "\1\u0353\1\357\1\u0353\2\357\1\u0353\1\357\4\u0353\2\357"+ -+ "\1\u0353\1\357\1\u0353\14\357\1\u016d\3\u021d\3\u016d\1\u021d"+ -+ "\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\15\u016d\2\u021d"+ -+ "\3\u016d\1\u021d\1\u016d\1\u021d\1\u016d\1\u021d\2\u016d\1\u021d"+ -+ "\1\u016d\4\u021d\2\u016d\1\u021d\1\u016d\1\u021d\14\u016d\3\230"+ -+ "\1\u0294\1\234\2\230\1\u0294\1\230\3\0\13\230\1\0"+ -+ "\2\230\1\76\1\u025a\30\230\1\u0294\1\230\2\u0294\25\230"+ -+ "\1\u0354\1\230\1\u0355\2\230\3\0\13\230\1\0\2\230"+ -+ "\1\76\1\u025a\56\230\3\u0356\1\234\2\230\1\u0356\1\230"+ -+ "\3\0\13\230\1\0\2\230\1\76\1\u025a\12\230\2\u0356"+ -+ "\3\230\1\u0356\1\230\1\u0356\1\230\1\u0356\2\230\1\u0356"+ -+ "\1\230\4\u0356\2\230\1\u0356\1\230\1\u0356\17\230\1\u0316"+ -+ "\1\234\2\230\1\u0316\1\230\3\0\13\230\1\0\2\230"+ -+ "\1\76\1\u025a\30\230\1\u0316\1\230\2\u0316\21\230\4\76"+ -+ "\1\u031a\1\76\1\u031b\22\76\1\227\1\230\1\231\1\0"+ -+ "\1\76\1\0\53\76\3\u031c\3\76\1\u031c\21\76\1\227"+ -+ "\1\230\1\231\1\0\1\76\1\0\7\76\2\u031c\3\76"+ -+ "\1\u031c\1\76\1\u031c\1\76\1\u031c\2\76\1\u031c\1\76"+ -+ "\4\u031c\2\76\1\u031c\1\76\1\u031c\15\76\3\u0357\3\76"+ -+ "\1\u0357\21\76\1\227\1\230\1\231\1\0\1\76\1\0"+ -+ "\7\76\2\u0357\3\76\1\u0357\1\76\1\u0357\1\76\1\u0357"+ -+ "\2\76\1\u0357\1\76\4\u0357\2\76\1\u0357\1\76\1\u0357"+ -+ "\14\76\1\232\3\u0224\3\232\1\u0224\20\232\1\356\15\232"+ -+ "\2\u0224\3\232\1\u0224\1\232\1\u0224\1\232\1\u0224\2\232"+ -+ "\1\u0224\1\232\4\u0224\2\232\1\u0224\1\232\1\u0224\14\232"+ -+ "\11\u0320\2\u0358\1\u0359\13\u0320\1\u0358\61\u0320\10\u02de\1\u0321"+ -+ "\3\0\2\u029b\10\u02de\1\u0321\1\0\61\u02de\1\0\3\u0322"+ -+ "\1\0\3\u0322\1\u035a\3\0\2\u035b\6\0\4\u0322\7\0"+ -+ "\32\u0322\1\0\3\u0322\6\0\1\u0322\2\0\2\u0322\2\0"+ -+ "\1\u02e2\1\u0324\1\u02e2\1\0\2\u0324\1\u02e2\1\u0323\3\0"+ -+ "\2\u02e2\1\u01fc\1\0\1\u02e2\1\u0323\2\u02e2\1\u0324\1\u02e2"+ -+ "\1\u0323\1\u02e2\7\0\25\u0324\4\u02e2\1\u0324\1\0\3\u0324"+ -+ "\6\0\1\u0324\2\0\2\u0324\2\0\3\u0324\1\0\3\u0324"+ -+ "\1\u035c\3\0\1\u02e3\1\u02e2\1\u01fc\1\0\1\u02e2\1\u0323"+ -+ "\2\u02e2\4\u0324\7\0\32\u0324\1\0\3\u0324\6\0\1\u0324"+ -+ "\2\0\2\u0324\2\0\3\u02e4\1\0\3\u02e4\1\u0325\3\0"+ -+ "\2\u02e4\2\0\1\u02e4\1\u0325\4\u02e4\1\u0325\1\u02e4\7\0"+ -+ "\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0\2\u02e4\11\0"+ -+ "\1\u0326\3\0\2\u0327\10\0\1\u0326\64\0\1\u02e6\2\0"+ -+ "\2\u02e6\1\0\1\u0327\13\0\1\u02e6\1\0\1\u0327\10\0"+ -+ "\25\u02e6\4\0\1\u02e6\1\0\3\u02e6\6\0\1\u02e6\2\0"+ -+ "\2\u02e6\47\0\1\u035d\116\0\1\u035e\35\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\7\147\1\u035f\22\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ -+ "\3\147\14\0\4\147\7\0\15\147\1\u0360\14\147\1\0"+ -+ "\3\147\6\0\1\147\2\0\2\147\1\0\11\u032c\3\0"+ -+ "\13\u032c\1\0\62\u032c\3\u032d\1\u032c\3\u032d\1\u0361\3\0"+ -+ "\2\u02ec\6\u032c\3\u032d\1\u0362\7\u032c\32\u032d\1\u032c\3\u032d"+ -+ "\6\u032c\1\u032d\2\u032c\2\u032d\2\u032c\3\u032e\1\u032c\3\u032e"+ -+ "\1\u032c\3\0\10\u032c\3\u032e\1\147\7\u032c\32\u032e\1\u032c"+ -+ "\3\u032e\6\u032c\1\u032e\2\u032c\2\u032e\1\u032c\10\u02ee\1\u032f"+ -+ "\3\0\1\u02af\11\u02ee\1\u032f\1\0\61\u02ee\1\0\3\u0330"+ -+ "\1\0\3\u0330\1\u0363\3\0\1\u0364\7\0\4\u0330\7\0"+ -+ "\32\u0330\1\0\3\u0330\6\0\1\u0330\2\0\2\u0330\2\0"+ -+ "\3\u02f2\1\0\3\u02f2\1\u0365\3\0\2\u02f2\1\u02b5\1\0"+ -+ "\1\u02f2\1\u0332\4\u02f2\1\u0365\1\u02f2\7\0\32\u02f2\1\0"+ -+ "\3\u02f2\6\0\1\u02f2\2\0\2\u02f2\2\0\3\u0333\1\0"+ -+ "\3\u0333\1\u0366\3\0\1\u02f3\1\u02b8\1\u02b5\1\0\1\u0367"+ -+ "\1\u02f3\2\u02b8\2\u0333\1\u0368\1\u0333\7\0\32\u0333\1\0"+ -+ "\3\u0333\6\0\1\u0333\2\0\2\u0333\55\0\1\u0369\102\0"+ -+ "\1\u036a\103\0\1\u036b\155\0\1\u036c\53\0\1\u036d\105\0"+ -+ "\1\u036e\113\0\1\u036f\145\0\1\u0370\55\0\1\u0371\113\0"+ -+ "\1\u0372\100\0\1\u0373\110\0\1\u0374\103\0\1\u0375\112\0"+ -+ "\1\u0376\110\0\1\u0377\122\0\1\u0378\76\0\1\u0379\105\0"+ -+ "\1\u037a\1\u037b\126\0\1\u037c\70\0\1\u037d\113\0\1\u037e"+ -+ "\120\0\1\u037f\111\0\1\u0380\74\0\1\u0381\113\0\1\u0382"+ -+ "\107\0\1\u0383\47\0\4\u012f\1\u0384\1\u012f\1\u0351\2\u012f"+ -+ "\2\357\1\76\13\u012f\1\357\62\u012f\3\u0352\1\u016e\2\u012f"+ -+ "\1\u0352\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ -+ "\13\u012f\2\u0352\3\u012f\1\u0352\1\u012f\1\u0352\1\u012f\1\u0352"+ -+ "\2\u012f\1\u0352\1\u012f\4\u0352\2\u012f\1\u0352\1\u012f\1\u0352"+ -+ "\15\u012f\3\u0385\1\u016e\2\u012f\1\u0385\1\u012f\2\357\1\76"+ -+ "\13\u012f\1\357\2\u012f\1\357\13\u012f\2\u0385\3\u012f\1\u0385"+ -+ "\1\u012f\1\u0385\1\u012f\1\u0385\2\u012f\1\u0385\1\u012f\4\u0385"+ -+ "\2\u012f\1\u0385\1\u012f\1\u0385\14\u012f\1\357\3\u0386\3\357"+ -+ "\1\u0386\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ -+ "\1\357\1\233\7\357\2\u0386\3\357\1\u0386\1\357\1\u0386"+ -+ "\1\357\1\u0386\2\357\1\u0386\1\357\4\u0386\2\357\1\u0386"+ -+ "\1\357\1\u0386\14\357\4\230\1\u0387\1\230\1\u0355\2\230"+ -+ "\3\0\13\230\1\0\62\230\3\u0356\1\234\2\230\1\u0356"+ -+ "\1\230\3\0\13\230\1\0\2\230\1\76\13\230\2\u0356"+ -+ "\3\230\1\u0356\1\230\1\u0356\1\230\1\u0356\2\230\1\u0356"+ -+ "\1\230\4\u0356\2\230\1\u0356\1\230\1\u0356\15\230\3\u0388"+ -+ "\1\234\2\230\1\u0388\1\230\3\0\13\230\1\0\2\230"+ -+ "\1\76\13\230\2\u0388\3\230\1\u0388\1\230\1\u0388\1\230"+ -+ "\1\u0388\2\230\1\u0388\1\230\4\u0388\2\230\1\u0388\1\230"+ -+ "\1\u0388\14\230\1\76\3\u0389\3\76\1\u0389\21\76\1\227"+ -+ "\1\230\1\231\1\0\1\76\1\0\7\76\2\u0389\3\76"+ -+ "\1\u0389\1\76\1\u0389\1\76\1\u0389\2\76\1\u0389\1\76"+ -+ "\4\u0389\2\76\1\u0389\1\76\1\u0389\14\76\10\0\1\u035a"+ -+ "\3\0\2\u035b\10\0\1\u035a\64\0\1\u0322\2\0\2\u0322"+ -+ "\1\0\1\u035b\13\0\1\u0322\1\0\1\u035b\10\0\25\u0322"+ -+ "\4\0\1\u0322\1\0\3\u0322\6\0\1\u0322\2\0\2\u0322"+ -+ "\2\0\3\u02e2\1\0\3\u02e2\1\u035c\3\0\1\u02e3\1\u02e2"+ -+ "\1\u01fc\1\0\1\u02e2\1\u0323\4\u02e2\1\u035c\1\u02e2\7\0"+ -+ "\32\u02e2\1\0\3\u02e2\6\0\1\u02e2\2\0\2\u02e2\47\0"+ -+ "\1\u038a\43\0\3\147\1\0\3\147\14\0\4\147\7\0"+ -+ "\7\147\1\u038b\22\147\1\0\3\147\6\0\1\147\2\0"+ -+ "\2\147\1\0\10\u032c\1\u0361\3\0\2\u02ec\10\u032c\1\u0361"+ -+ "\1\0\61\u032c\1\0\3\u0362\1\0\3\u0362\1\u038c\3\0"+ -+ "\2\u038d\6\0\4\u0362\7\0\32\u0362\1\0\3\u0362\6\0"+ -+ "\1\u0362\2\0\2\u0362\11\0\1\u0363\3\0\1\u0364\11\0"+ -+ "\1\u0363\64\0\1\u0330\2\0\2\u0330\1\0\1\u0364\13\0"+ -+ "\1\u0330\1\0\1\u0364\10\0\25\u0330\4\0\1\u0330\1\0"+ -+ "\3\u0330\6\0\1\u0330\2\0\2\u0330\2\0\3\u02b8\1\0"+ -+ "\3\u02b8\1\u0366\3\0\1\u02f3\1\u02b8\1\u02b5\1\0\1\u0367"+ -+ "\1\u02f3\4\u02b8\1\u0366\1\u02b8\7\0\32\u02b8\1\0\3\u02b8"+ -+ "\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u038e\1\0\4\u038e"+ -+ "\3\0\2\u038e\2\0\1\u038e\1\u038f\6\u038e\7\0\32\u038e"+ -+ "\1\0\3\u038e\6\0\1\u038e\2\0\2\u038e\55\0\1\u0390"+ -+ "\77\0\1\u0391\104\0\1\u0392\125\0\1\u0393\102\0\1\u0394"+ -+ "\105\0\1\u0395\111\0\1\u0396\125\0\1\u0397\100\0\1\u0398"+ -+ "\112\0\1\u0399\143\0\1\u039a\45\0\1\u039b\113\0\1\u039c"+ -+ "\106\0\1\u039d\105\0\1\u039e\115\0\1\u039f\110\0\1\u03a0"+ -+ "\110\0\1\u03a1\105\0\1\u03a2\104\0\1\u03a3\120\0\1\u03a4"+ -+ "\147\0\1\u03a5\55\0\1\u03a6\120\0\1\u03a7\103\0\1\u03a8"+ -+ "\140\0\1\u03a9\107\0\1\u03aa\3\0\4\u012f\1\u0350\1\u012f"+ -+ "\1\u0351\2\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ -+ "\57\u012f\3\u03ab\1\u016e\2\u012f\1\u03ab\1\u012f\2\357\1\76"+ -+ "\13\u012f\1\357\2\u012f\1\357\13\u012f\2\u03ab\3\u012f\1\u03ab"+ -+ "\1\u012f\1\u03ab\1\u012f\1\u03ab\2\u012f\1\u03ab\1\u012f\4\u03ab"+ -+ "\2\u012f\1\u03ab\1\u012f\1\u03ab\14\u012f\1\357\3\u0289\3\357"+ -+ "\1\u0289\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ -+ "\1\357\1\233\7\357\2\u0289\3\357\1\u0289\1\357\1\u0289"+ -+ "\1\357\1\u0289\2\357\1\u0289\1\357\4\u0289\2\357\1\u0289"+ -+ "\1\357\1\u0289\14\357\4\230\1\u0354\1\230\1\u0355\2\230"+ -+ "\3\0\13\230\1\0\2\230\1\76\57\230\3\u03ac\1\234"+ -+ "\2\230\1\u03ac\1\230\3\0\13\230\1\0\2\230\1\76"+ -+ "\13\230\2\u03ac\3\230\1\u03ac\1\230\1\u03ac\1\230\1\u03ac"+ -+ "\2\230\1\u03ac\1\230\4\u03ac\2\230\1\u03ac\1\230\1\u03ac"+ -+ "\14\230\1\76\3\u0292\3\76\1\u0292\21\76\1\227\1\230"+ -+ "\1\231\1\0\1\76\1\0\7\76\2\u0292\3\76\1\u0292"+ -+ "\1\76\1\u0292\1\76\1\u0292\2\76\1\u0292\1\76\4\u0292"+ -+ "\2\76\1\u0292\1\76\1\u0292\14\76\10\0\1\u038c\3\0"+ -+ "\2\u038d\10\0\1\u038c\64\0\1\u0362\2\0\2\u0362\1\0"+ -+ "\1\u038d\13\0\1\u0362\1\0\1\u038d\10\0\25\u0362\4\0"+ -+ "\1\u0362\1\0\3\u0362\6\0\1\u0362\2\0\2\u0362\2\0"+ -+ "\3\u038e\1\0\4\u038e\3\0\2\u038e\2\0\1\u038e\1\u03ad"+ -+ "\6\u038e\7\0\32\u038e\1\0\3\u038e\6\0\1\u038e\2\0"+ -+ "\2\u038e\2\0\1\u038e\1\u03ae\1\u038e\1\0\2\u03ae\1\u038e"+ -+ "\1\u038f\3\0\2\u038e\2\0\1\u038e\1\u03ad\2\u038e\1\u03ae"+ -+ "\1\u038e\1\u038f\1\u038e\7\0\25\u03ae\4\u038e\1\u03ae\1\0"+ -+ "\3\u03ae\6\0\1\u03ae\2\0\2\u03ae\40\0\1\u03af\126\0"+ -+ "\1\u03b0\106\0\1\u03b1\116\0\1\u03b2\104\0\1\u03b3\141\0"+ -+ "\1\u03b4\56\0\1\u03b5\42\0\1\u03b6\210\0\1\u03b7\43\0"+ -+ "\1\u03b8\123\0\1\u03b9\111\0\1\u03ba\76\0\1\u03bb\130\0"+ -+ "\1\u03bc\133\0\1\u03bd\110\0\1\u03be\42\0\1\u03bf\125\0"+ -+ "\1\u03c0\77\0\1\u03c1\104\0\1\u03c2\107\0\1\u03c3\125\0"+ -+ "\1\u03c4\75\0\1\u03c5\112\0\1\u03c6\120\0\1\u03c7\116\0"+ -+ "\1\u03c8\46\0\1\u03c9\71\0\1\u012f\3\u028b\1\u016e\2\u012f"+ -+ "\1\u028b\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ -+ "\13\u012f\2\u028b\3\u012f\1\u028b\1\u012f\1\u028b\1\u012f\1\u028b"+ -+ "\2\u012f\1\u028b\1\u012f\4\u028b\2\u012f\1\u028b\1\u012f\1\u028b"+ -+ "\14\u012f\1\230\3\u0294\1\234\2\230\1\u0294\1\230\3\0"+ -+ "\13\230\1\0\2\230\1\76\13\230\2\u0294\3\230\1\u0294"+ -+ "\1\230\1\u0294\1\230\1\u0294\2\230\1\u0294\1\230\4\u0294"+ -+ "\2\230\1\u0294\1\230\1\u0294\14\230\1\0\1\u038e\1\u03ae"+ -+ "\1\u038e\1\0\2\u03ae\1\u038e\1\u03ca\3\0\2\u038e\1\u02b5"+ -+ "\1\0\1\u038e\1\u03ad\2\u038e\1\u03ae\1\u038e\1\u03ca\1\u038e"+ -+ "\7\0\25\u03ae\4\u038e\1\u03ae\1\0\3\u03ae\6\0\1\u03ae"+ -+ "\2\0\2\u03ae\2\0\3\u03ae\1\0\3\u03ae\1\u03cb\3\0"+ -+ "\1\u038f\1\u038e\1\u02b5\1\0\1\u038e\1\u03ad\2\u038e\2\u03ae"+ -+ "\1\u03cc\1\u03ae\7\0\32\u03ae\1\0\3\u03ae\6\0\1\u03ae"+ -+ "\2\0\2\u03ae\64\0\1\u03cd\100\0\1\u03ce\106\0\1\u03cf"+ -+ "\112\0\1\u03d0\110\0\1\u03d1\75\0\1\u03d2\10\0\1\u03d3"+ -+ "\2\0\1\u03d4\4\0\1\u03d5\66\0\1\u03d6\111\0\1\u03d7"+ -+ "\157\0\1\u03d8\106\0\1\u03d9\51\0\1\u03da\115\0\1\u03db"+ -+ "\143\0\1\u03dc\55\0\1\u03dd\116\0\1\u03de\103\0\1\u03df"+ -+ "\111\0\1\u03e0\74\0\1\u03e1\120\0\1\u03e2\76\0\1\u03e3"+ -+ "\117\0\1\u03e4\112\0\1\u03e5\106\0\1\u03e6\115\0\1\u03e7"+ -+ "\106\0\1\u03e8\45\0\1\u03e9\103\0\3\u038e\1\0\3\u038e"+ -+ "\1\u03cb\3\0\1\u038f\1\u038e\1\u02b5\1\0\1\u038e\1\u03ad"+ -+ "\4\u038e\1\u03cb\1\u038e\7\0\32\u038e\1\0\3\u038e\6\0"+ -+ "\1\u038e\2\0\2\u038e\41\0\1\u03ea\124\0\1\u03eb\142\0"+ -+ "\1\u03ec\57\0\1\u03ed\107\0\1\u03ee\42\0\1\u03ef\150\0"+ -+ "\1\u03f0\112\0\1\u03f1\46\0\1\u03f2\142\0\1\u03f3\125\0"+ -+ "\1\u03f4\41\0\1\u03f5\121\0\1\u03f6\152\0\1\u03f7\103\0"+ -+ "\1\u03f8\74\0\1\u03f9\111\0\1\u03fa\55\0\1\u03fb\150\0"+ -+ "\1\u03fc\112\0\1\u03fd\104\0\1\u03fe\151\0\1\u03ff\43\0"+ -+ "\1\u0400\113\0\1\u0401\123\0\1\u0402\140\0\1\u0403\63\0"+ -+ "\1\u0404\135\0\1\u0405\42\0\1\u0406\116\0\1\u0407\110\0"+ -+ "\1\u0408\151\0\1\u0409\40\0\1\u040a\117\0\1\u040b\120\0"+ -+ "\1\u040c\73\0\1\u040d\125\0\1\u040e\72\0\1\u040f\133\0"+ -+ "\1\u0410\66\0\1\u0411\113\0\1\u0412\117\0\1\u0413\103\0"+ -+ "\1\u0414\50\0\1\u0415\150\0\1\u0416\102\0\1\u0417\131\0"+ -+ "\1\u0418\135\0\1\u0419\45\0\1\u041a\64\0\1\u041b\154\0"+ -+ "\1\u041c\133\0\1\u041d\61\0\1\u041e\37\0\1\u041f\144\0"+ -+ "\1\u0420\130\0\1\u0421\103\0\1\u0422\115\0\1\u0423\134\0"+ -+ "\1\u0424\10\0\1\u0425\142\0\1\u0426\156\0\1\u0427\61\0"+ -+ "\1\u0428\72\0\1\u0429\126\0\1\u042a\106\0\1\u042b\141\0"+ -+ "\1\u042c\10\0\1\u042d\143\0\1\u042e\112\0\1\u042f\153\0"+ -+ "\1\u0430\60\0\1\u0431\137\0\1\u0432\60\0\1\u0433\106\0"+ -+ "\1\u0434\111\0\1\u0435\142\0\1\u0436\110\0\1\u0437\53\0"+ -+ "\1\u0438\2\0\1\u0439\100\0\1\u043a\120\0\1\u043b\142\0"+ -+ "\1\u043c\41\0\1\u043d\112\0\1\u043e\154\0\1\u043f\54\0"+ -+ "\1\u0440\103\0\1\u0441\127\0\1\u0442\76\0\1\u0443\105\0"+ -+ "\1\u0444\110\0\1\u0445\106\0\1\u0446\105\0\1\u0447\125\0"+ -+ "\1\u0448\105\0\1\u0449\103\0\1\u044a\115\0\1\u044b\106\0"+ -+ "\1\u044c\116\0\1\u044d\50\0\1\u044e\132\0\1\u044f\112\0"+ -+ "\1\u0450\115\0\1\u0451\121\0\1\u0452\103\0\1\u0453\102\0"+ -+ "\1\u0454\112\0\1\u0455\111\0\1\u0456\105\0\1\u0457\116\0"+ -+ "\1\u0458\117\0\1\u0459\33\0\1\u045a\121\0\1\u045b\137\0"+ -+ "\1\u045c\103\0\1\u045d\155\0\1\u045e\50\0\1\u045f\105\0"+ -+ "\1\u0460\110\0\1\u0461\116\0\1\u0462\45\0\1\u0463\155\0"+ -+ "\1\u0464\76\0\1\u0465\155\0\1\u0466\43\0\1\u0467\115\0"+ -+ "\1\u0468\110\0\1\u0469\50\0\1\u046a\155\0\1\u046b\113\0"+ -+ "\1\u046c\40\0\1\u046d\163\0\1\u046e\70\0\1\u046f\125\0"+ -+ "\1\u0470\137\0\1\u0471\110\0\1\u0472\51\0\1\u0473\101\0"+ -+ "\1\u0474\124\0\1\u0475\76\0\1\u0476\115\0\1\u0477\120\0"+ -+ "\1\u0478\73\0\1\u0479\154\0\1\u047a\110\0\1\u047b\110\0"+ -+ "\1\u047c\56\0\1\u047d\100\0\1\u047e\104\0\1\u047f\132\0"+ -+ "\1\u0480\73\0\1\u0481\105\0\1\u0482\112\0\1\u0483\120\0"+ -+ "\1\u0484\76\0\1\u0485\126\0\1\u0486\71\0\1\u0487\123\0"+ -+ "\1\u0488\76\0\1\u0489\126\0\1\u048a\50\0\1\u048b\110\0"+ -+ "\1\u048c\152\0\1\u048d\70\0\1\u048e\110\0\1\u048f\110\0"+ -+ "\1\u0490\155\0\1\u0491\55\0\1\u0492\76\0\1\u0493\66\0"+ -+ "\1\u0494\110\0\1\u0495\110\0\1\u0496\132\0\1\u0497\137\0"+ -+ "\1\u0498\64\0\1\u0499\52\0\1\u049a\145\0\1\u049b\106\0"+ -+ "\1\u049c\154\0\1\u049d\44\0\1\u049e\113\0\1\u049f\110\0"+ -+ "\1\u04a0\121\0\1\u04a1\110\0\1\u04a2\101\0\1\u04a3\106\0"+ -+ "\1\u04a4\117\0\1\u04a5\143\0\1\u04a6\41\0\1\u04a7\117\0"+ -+ "\1\u04a8\123\0\1\u04a9\72\0\1\u04aa\113\0\1\u04ab\101\0"+ -+ "\1\u04ac\156\0\1\u04ad\43\0\1\u04ae\110\0\1\u04af\155\0"+ -+ "\1\u04b0\51\0\1\u04b1\61\0\1\u04b2\130\0\1\u04b3\114\0"+ -+ "\1\u04b4\116\0\1\u04b5\100\0\1\u04b6\106\0\1\u04b7\114\0"+ -+ "\1\u04b8\116\0\1\u04b9\102\0\1\u04ba\105\0\1\u04bb\114\0"+ -+ "\1\u04bc\107\0\1\u04bd\53\0\1\u04be\172\0\1\u04bf\63\0"+ -+ "\1\u04c0\111\0\1\u04c1\63\0\1\u04c2\176\0\1\u04c3\60\0"+ -+ "\1\u04c4\52\0\1\u04c5\134\0\1\u04c6\111\0\1\u04c7\151\0"+ -+ "\1\u04c8\110\0\1\u04c9\11\0\1\u04ca\142\0\1\u04cb\155\0"+ -+ "\1\u04cc\110\0\1\u04cd\56\0\1\u04ce\43\0\1\u04cf\142\0"+ -+ "\1\u04d0\155\0\1\u04d1\43\0\1\u04d2\155\0\1\u04d3\110\0"+ -+ "\1\u04d4\43\0\1\u04d5\67\0\1\u04d6\132\0\1\u04d7\154\0"+ -+ "\1\u04d8\43\0\1\u04d9\67\0\1\u04da\110\0\1\u04db\144\0"+ -+ "\1\u04dc\120\0\1\u04dd\44\0\1\u04de\110\0\1\u04df\132\0"+ -+ "\1\u04e0\125\0\1\u04e1\137\0\1\u04e2\22\0\1\u04e3\146\0"+ -+ "\1\u04e4\52\0\1\u04e5\110\0\1\u04e6\176\0\1\u04e7\11\0"+ -+ "\1\u04e8\121\0\1\u04e9\176\0\1\u04ea\44\0\1\u04eb\155\0"+ -+ "\1\u04ec\46\0\1\u04ed\123\0\1\u04ee\50\0\1\u04ef\132\0"+ -+ "\1\u04f0\66\0\1\u04f1\144\0\1\u04f2\54\0\1\u04f3\130\0"+ -+ "\1\u04f4\127\0\1\u04f5\75\0\1\u04f6\113\0\1\u04f7\50\0"+ -+ "\1\u04f8\143\0\1\u04f9\113\0\1\u04fa\117\0\1\u04fb\142\0"+ -+ "\1\u04fc\46\0\1\u04fd\120\0\1\u04fe\74\0\1\u04ff\111\0"+ -+ "\1\u0500\113\0\1\u0501\64\0\1\u0502\176\0\1\u0503\44\0"+ -+ "\1\u0504\113\0\1\u0505\151\0\1\u0506\73\0\1\u0507\37\0"+ -+ "\1\u0508\130\0\1\u0509\111\0\1\u050a\67\0\1\u050b\176\0"+ -+ "\1\u050c\47\0\1\u050d\151\0\1\u050e\22\0\1\u050f\131\0"+ -+ "\1\u0510\67\0\1\u0511\176\0\1\u0512\22\0\1\u0513\71\0"; - - private static int [] zzUnpackTrans() { -- int [] result = new int[48777]; -+ int [] result = new int[82490]; - int offset = 0; - offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); - return result; -@@ -1518,28 +1783,34 @@ - "\3\0\6\1\1\0\1\11\1\0\1\1\6\0\2\11"+ - "\1\0\1\1\4\0\1\11\1\0\1\1\1\11\1\1"+ - "\1\11\3\0\42\1\3\0\2\1\1\0\1\11\1\1"+ -- "\14\0\1\11\1\1\3\0\46\1\2\11\1\0\2\1"+ -- "\1\0\1\1\13\0\1\1\5\0\11\1\1\0\31\1"+ -- "\1\11\2\1\7\0\2\1\10\0\1\1\1\11\3\0"+ -- "\12\1\1\0\17\1\1\0\7\1\6\0\2\1\3\0"+ -+ "\15\0\1\11\1\1\3\0\46\1\2\11\1\0\2\1"+ -+ "\1\0\1\1\14\0\1\1\5\0\11\1\1\0\31\1"+ -+ "\1\11\2\1\10\0\2\1\10\0\1\1\1\11\3\0"+ -+ "\12\1\1\0\17\1\1\0\7\1\7\0\2\1\3\0"+ - "\1\1\6\0\1\1\1\11\4\0\13\1\4\0\22\1"+ -- "\1\11\6\0\1\1\6\0\1\1\13\0\10\1\3\0"+ -- "\15\1\1\0\2\1\1\0\5\1\4\0\2\11\2\1"+ -+ "\1\11\7\0\1\1\6\0\1\1\13\0\10\1\3\0"+ -+ "\15\1\1\0\2\1\1\0\5\1\5\0\2\11\2\1"+ - "\4\0\2\1\7\0\1\1\1\11\1\0\12\1\1\0"+ -- "\1\1\1\0\7\1\2\0\1\1\1\0\2\1\2\0"+ -+ "\1\1\1\0\7\1\2\0\1\1\1\0\2\1\3\0"+ - "\1\11\2\0\1\1\2\0\2\1\4\0\1\1\2\0"+ - "\2\1\7\0\4\1\1\0\1\1\1\0\1\1\1\0"+ - "\3\1\2\0\11\1\1\0\1\1\3\0\1\1\1\0"+ -- "\2\1\3\0\1\11\1\0\4\1\3\0\4\1\3\0"+ -+ "\2\1\20\0\1\11\1\0\4\1\3\0\4\1\3\0"+ - "\1\1\1\11\1\0\4\1\3\0\2\1\2\0\10\1"+ -- "\12\0\3\1\5\0\3\1\1\0\1\1\1\11\1\0"+ -- "\6\1\3\0\10\1\2\0\2\11\4\0\1\1\3\0"+ -+ "\41\0\3\1\5\0\3\1\1\0\1\1\1\11\1\0"+ -+ "\6\1\3\0\10\1\33\0\2\11\4\0\1\1\3\0"+ - "\2\1\1\11\1\1\1\0\1\1\1\11\1\0\5\1"+ -- "\1\0\2\1\1\0\1\1\3\0\1\1\2\0\1\1"+ -- "\1\11\2\1\10\0\1\11\3\1"; -+ "\1\0\2\1\1\0\1\1\35\0\1\1\2\0\1\1"+ -+ "\1\11\2\1\74\0\1\11\3\1\51\0\1\11\44\0"+ -+ "\1\11\62\0\1\11\14\0\1\11\57\0\2\11\7\0"+ -+ "\3\11\33\0\1\11\17\0\1\11\2\0\1\11\20\0"+ -+ "\1\11\3\0\2\11\2\0\2\11\3\0\1\11\1\0"+ -+ "\2\11\2\0\1\11\5\0\1\11\1\0\1\11\1\0"+ -+ "\1\11\16\0\1\11\5\0\1\11\2\0\1\11\3\0"+ -+ "\1\11\1\0\1\11\1\0\1\11"; - - private static int [] zzUnpackAttribute() { -- int [] result = new int[826]; -+ int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; -@@ -1603,6 +1874,8 @@ - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - -+ /** denotes if the user-EOF-code has already been executed */ -+ private boolean zzEOFDone; - - /** the stack of open (nested) input streams to read from */ - private java.util.Stack zzStreams = new java.util.Stack(); -@@ -1621,6 +1894,7 @@ - int yycolumn; - char [] zzBuffer; - boolean zzAtEOF; -+ boolean zzEOFDone; - - /** sets all values stored in this class */ - ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead, -@@ -1633,14 +1907,12 @@ - this.zzMarkedPos = zzMarkedPos; - this.zzBuffer = zzBuffer; - this.zzAtEOF = zzAtEOF; -+ this.zzEOFDone = zzEOFDone; - this.yyline = yyline; - this.yycolumn = yycolumn; - } - } - -- /** denotes if the user-EOF-code has already been executed */ -- private boolean zzEOFDone; -- - /* user code: */ - int balance = 0; - int commentbalance = 0; -@@ -1924,6 +2196,7 @@ - zzCurrentPos = s.zzCurrentPos; - zzMarkedPos = s.zzMarkedPos ; - zzAtEOF = s.zzAtEOF; -+ zzEOFDone = s.zzEOFDone; - yyline = s.yyline; - yycolumn = s.yycolumn; - } -@@ -1955,6 +2228,7 @@ - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; -+ zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yychar = yycolumn = 0; -@@ -2229,11 +2503,19 @@ - case 118: - { cupDebug = true; - } -- case 147: break; -+ case 177: break; -+ case 175: -+ { return symbol(UNICODE_FINAL_QUOTE_PUNCTUATION); -+ } -+ case 178: break; -+ case 168: -+ { return symbol(UNICODE_DASH_PUNCTUATION); -+ } -+ case 179: break; - case 122: - { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); - } -- case 148: break; -+ case 180: break; - case 113: - { File f = new File(yytext().substring(9).trim()); - if ( !f.canRead() ) -@@ -2251,146 +2533,166 @@ - throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); - } - } -- case 149: break; -+ case 181: break; - case 88: - { return symbol(FULL); - } -- case 150: break; -+ case 182: break; -+ case 158: -+ { return symbol(UNICODE_LINE_SEPARATOR); -+ } -+ case 183: break; - case 92: - { return symbol(ASCII); - } -- case 151: break; -+ case 184: break; - case 21: - { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); - } -- case 152: break; -+ case 185: break; - case 142: - { return symbol(UPPERCLASS); - } -- case 153: break; -+ case 186: break; - case 34: - { return symbol(COMMA); - } -- case 154: break; -+ case 187: break; - case 61: - { return symbol(CHAR,new Character('\f')); - } -- case 155: break; -+ case 188: break; - case 111: - { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); - } -- case 156: break; -+ case 189: break; -+ case 153: -+ { return symbol(UNICODE_OTHER_NUMBER); -+ } -+ case 190: break; - case 104: - { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); - } -- case 157: break; -+ case 191: break; - case 143: - { return symbol(LOWERCLASS); - } -- case 158: break; -+ case 192: break; -+ case 176: -+ { return symbol(UNICODE_INITIAL_QUOTE_PUNCTUATION); -+ } -+ case 193: break; - case 72: - { string.append('\r'); - } -- case 159: break; -+ case 194: break; - case 43: - { return symbol(HAT); - } -- case 160: break; -+ case 195: break; - case 48: - { yybegin(MACROS); ctorArgs.add(yytext().trim()); - } -- case 161: break; -+ case 196: break; - case 1: - { return symbol(EOF); - } -- case 162: break; -+ case 197: break; - case 59: - { return symbol(CHAR,new Character('\t')); - } -- case 163: break; -+ case 198: break; - case 145: - { eofclose = false; - } -- case 164: break; -+ case 199: break; - case 103: - { isPublic = true; - } -- case 165: break; -+ case 200: break; -+ case 164: -+ { return symbol(UNICODE_UPPERCASE_LETTER); -+ } -+ case 201: break; - case 112: - { actionText.setLength(0); yybegin(JAVA_CODE); - Symbol s = symbol_countUpdate(EOFRULE, null); - action_line = s.left+1; - return s; - } -- case 166: break; -+ case 202: break; - case 40: - { balance++; return symbol(OPENCLASS); - } -- case 167: break; -+ case 203: break; -+ case 147: -+ { return symbol(UNICODE_FORMAT); -+ } -+ case 204: break; - case 11: - { yybegin(REGEXP); - } -- case 168: break; -+ case 205: break; - case 12: - { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); - } -- case 169: break; -+ case 206: break; - case 68: - { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); - } -- case 170: break; -+ case 207: break; - case 62: - { return symbol(CHAR,new Character('\b')); - } -- case 171: break; -+ case 208: break; - case 39: - { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); - } -- case 172: break; -+ case 209: break; - case 5: - { states.insert(yytext(),inclusive_states); - } -- case 173: break; -+ case 210: break; - case 70: - { string.append('\n'); - } -- case 174: break; -+ case 211: break; - case 10: - { yybegin(REGEXP); return symbol(EQUALS); - } -- case 175: break; -+ case 212: break; - case 146: - { return symbol(JLETTERDIGITCLASS); - } -- case 176: break; -+ case 213: break; - case 19: - { return symbol(STAR); - } -- case 177: break; -+ case 214: break; - case 42: - { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); - } -- case 178: break; -+ case 215: break; - case 116: - { isAbstract = true; - } -- case 179: break; -+ case 216: break; - case 75: - { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); - } -- case 180: break; -+ case 217: break; - case 114: - { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); - } -- case 181: break; -+ case 218: break; - case 109: - { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); - } -- case 182: break; -+ case 219: break; - case 93: - { packed = false; useRowMap = true; - } -- case 183: break; -+ case 220: break; - case 87: - { cupCompatible = true; - isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner"); -@@ -2402,250 +2704,298 @@ - eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);"; - if (!Options.jlex) eofclose = true; - } -- case 184: break; -+ case 221: break; -+ case 171: -+ { return symbol(UNICODE_PARAGRAPH_SEPARATOR); -+ } -+ case 222: break; - case 30: - { bolUsed = true; return symbol(HAT); - } -- case 185: break; -+ case 223: break; - case 4: - { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); - } -- case 186: break; -+ case 224: break; - case 35: - { yybegin(REGEXP); return symbol(MORETHAN); - } -- case 187: break; -+ case 225: break; - case 100: - { packed = false; useRowMap = false; - } -- case 188: break; -+ case 226: break; - case 119: - { caseless = true; - } -- case 189: break; -+ case 227: break; - case 38: - { yybegin(nextState); return symbol(STRING, string.toString()); - } -- case 190: break; -+ case 228: break; - case 76: - { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); - } -- case 191: break; -+ case 229: break; - case 13: - { return symbol_countUpdate(RBRACE, null); - } -- case 192: break; -+ case 230: break; - case 139: - { scanErrorException = yytext().substring(11).trim(); - } -- case 193: break; -+ case 231: break; - case 141: - { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); - } -- case 194: break; -+ case 232: break; - case 84: - { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); - } -- case 195: break; -+ case 233: break; - case 2: - { /* ignore */ - } -- case 196: break; -+ case 234: break; -+ case 150: -+ { return symbol(UNICODE_UNASSIGNED); -+ } -+ case 235: break; -+ case 156: -+ { return symbol(UNICODE_LETTER_NUMBER); -+ } -+ case 236: break; - case 127: - { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); - } -- case 197: break; -+ case 237: break; - case 47: - { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); - } -- case 198: break; -+ case 238: break; -+ case 161: -+ { return symbol(UNICODE_CURRENCY_SYMBOL); -+ } -+ case 239: break; - case 108: - { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); - } -- case 199: break; -+ case 240: break; - case 31: - { actionText.append(yytext()); - } -- case 200: break; -+ case 241: break; - case 83: - { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); - } -- case 201: break; -+ case 242: break; -+ case 174: -+ { return symbol(UNICODE_COMBINING_SPACING_MARK); -+ } -+ case 243: break; - case 107: - { notUnix = true; - } -- case 202: break; -+ case 244: break; - case 89: - { lineCount = true; - } -- case 203: break; -+ case 245: break; - case 136: - { initThrow = concExc(initThrow,yytext().substring(11).trim()); - } -- case 204: break; -+ case 246: break; - case 131: - { standalone = true; isInteger = true; - } -- case 205: break; -+ case 247: break; - case 52: - { nextState = MACROS; yybegin(COMMENT); - } -- case 206: break; -+ case 248: break; - case 25: - { return symbol(TILDE); - } -- case 207: break; -+ case 249: break; - case 37: - { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); - } -- case 208: break; -+ case 250: break; - case 110: - { className = yytext().substring(7).trim(); - } -- case 209: break; -+ case 251: break; - case 9: - { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); - } -- case 210: break; -+ case 252: break; -+ case 162: -+ { return symbol(UNICODE_MODIFIER_LETTER); -+ } -+ case 253: break; - case 55: - { nextState = REGEXPSTART; yybegin(COMMENT); - } -- case 211: break; -+ case 254: break; -+ case 173: -+ { return symbol(UNICODE_CONNECTOR_PUNCTUATION); -+ } -+ case 255: break; - case 16: - { return symbol(POINT); - } -- case 212: break; -+ case 256: break; - case 73: - { string.append('\f'); - } -- case 213: break; -+ case 257: break; - case 65: - { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); - } -- case 214: break; -+ case 258: break; - case 80: - { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); - } -- case 215: break; -+ case 259: break; - case 140: - { initThrow = concExc(initThrow,string); yybegin(MACROS); - } -- case 216: break; -+ case 260: break; - case 135: - { eofThrow = concExc(eofThrow,string); yybegin(MACROS); - } -- case 217: break; -+ case 261: break; - case 71: - { string.append('\t'); - } -- case 218: break; -+ case 262: break; - case 67: - { string.append(yytext().charAt(1)); - } -- case 219: break; -+ case 263: break; - case 7: - { yybegin(MACROS); - } -- case 220: break; -+ case 264: break; - case 98: - { eofCode = conc(eofCode,string); yybegin(MACROS); - } -- case 221: break; -+ case 265: break; - case 56: - { return symbol(CHAR, new Character(yytext().charAt(1))); - } -- case 222: break; -+ case 266: break; -+ case 154: -+ { return symbol(UNICODE_OTHER_LETTER); -+ } -+ case 267: break; - case 28: - { return symbol(PLUS); - } -- case 223: break; -+ case 268: break; - case 101: - { columnCount = true; - } -- case 224: break; -+ case 269: break; - case 124: - { isExtending = yytext().substring(9).trim(); - } -- case 225: break; -+ case 270: break; - case 123: - { eofVal = string.toString(); yybegin(MACROS); - } -- case 226: break; -+ case 271: break; - case 36: - { string.append(yytext()); - } -- case 227: break; -+ case 272: break; - case 97: - { return symbol(UNICODE); - } -- case 228: break; -+ case 273: break; -+ case 152: -+ { return symbol(UNICODE_PRIVATE_USE); -+ } -+ case 274: break; -+ case 163: -+ { return symbol(UNICODE_MODIFIER_SYMBOL); -+ } -+ case 275: break; - case 74: - { string.append('\b'); - } -- case 229: break; -+ case 276: break; - case 24: - { return symbol(BANG); - } -- case 230: break; -+ case 277: break; - case 132: - { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); - } -- case 231: break; -+ case 278: break; - case 91: - { packed = true; useRowMap = true; - } -- case 232: break; -+ case 279: break; - case 26: - { return symbol(OPENBRACKET); - } -- case 233: break; -+ case 280: break; -+ case 155: -+ { return symbol(UNICODE_OTHER_SYMBOL); -+ } -+ case 281: break; - case 60: - { return symbol(CHAR,new Character('\r')); - } -- case 234: break; -+ case 282: break; - case 94: - { isFinal = true; - } -- case 235: break; -+ case 283: break; - case 27: - { return symbol(CLOSEBRACKET); - } -- case 236: break; -+ case 284: break; - case 86: - { isInteger = true; - } -- case 237: break; -+ case 285: break; -+ case 166: -+ { return symbol(UNICODE_TITLECASE_LETTER); -+ } -+ case 286: break; - case 20: - { return symbol(LOOKAHEAD); - } -- case 238: break; -+ case 287: break; - case 51: - { commentbalance++; - } -- case 239: break; -+ case 288: break; - case 49: - { t.start(); - yybegin(MACROS); - macroDefinition = true; - return symbol(USERCODE,userCode); - } -- case 240: break; -+ case 289: break; - case 44: - { return symbol(DASH); - } -- case 241: break; -+ case 290: break; - case 138: - { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); - } -- case 242: break; -+ case 291: break; - case 96: - { debugOption = true; - } -- case 243: break; -+ case 292: break; - case 64: - { nextState = REGEXP; yybegin(COMMENT); - } -- case 244: break; -+ case 293: break; - case 32: - { if (balance > 0) { - balance--; -@@ -2658,135 +3008,171 @@ - return symbol(ACTION, a); - } - } -- case 245: break; -+ case 294: break; -+ case 157: -+ { return symbol(UNICODE_ENCLOSING_MARK); -+ } -+ case 295: break; - case 29: - { return symbol(DOLLAR); - } -- case 246: break; -+ case 296: break; -+ case 169: -+ { return symbol(UNICODE_OTHER_PUNCTUATION); -+ } -+ case 297: break; - case 17: - { yybegin(CHARCLASS); return symbol(OPENCLASS); - } -- case 247: break; -+ case 298: break; - case 105: - { initCode = conc(initCode,string); yybegin(MACROS); - } -- case 248: break; -+ case 299: break; - case 69: - { string.append('\"'); - } -- case 249: break; -+ case 300: break; - case 137: - { isImplementing = concExc(isImplementing, yytext().substring(12).trim()); - } -- case 250: break; -+ case 301: break; - case 126: - { return symbol(LETTERCLASS); - } -- case 251: break; -+ case 302: break; -+ case 151: -+ { return symbol(UNICODE_MATH_SYMBOL); -+ } -+ case 303: break; - case 102: - { isInteger = true; - if (eofVal == null) - eofVal = "return 0;"; - eofclose = true; - } -- case 252: break; -+ case 304: break; - case 41: - { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); - } -- case 253: break; -+ case 305: break; - case 77: - { string.setLength(0); yybegin(COPY); - } -- case 254: break; -+ case 306: break; - case 8: - { return symbol(IDENT, yytext()); - } -- case 255: break; -+ case 307: break; - case 121: - { return symbol(DIGITCLASS); - } -- case 256: break; -+ case 308: break; - case 144: - { lexThrow = concExc(lexThrow,string); yybegin(MACROS); - } -- case 257: break; -+ case 309: break; - case 53: - { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); - } -- case 258: break; -+ case 310: break; - case 23: - { return symbol(BAR); - } -- case 259: break; -+ case 311: break; -+ case 148: -+ { return symbol(UNICODE_CONTROL); -+ } -+ case 312: break; - case 45: - { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); - } -- case 260: break; -+ case 313: break; - case 117: - { cupSymbol = yytext().substring(8).trim(); - if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); - } -- case 261: break; -+ case 314: break; - case 58: - { return symbol(CHAR,new Character('\n')); - } -- case 262: break; -+ case 315: break; - case 95: - { isYYEOF = true; - } -- case 263: break; -+ case 316: break; - case 14: - { return symbol(CHAR, new Character(yytext().charAt(0))); - } -- case 264: break; -+ case 317: break; - case 99: - { tokenType = yytext().substring(6).trim(); - } -- case 265: break; -+ case 318: break; -+ case 160: -+ { return symbol(UNICODE_SPACE_SEPARATOR); -+ } -+ case 319: break; - case 33: - { balance++; actionText.append('{'); - } -- case 266: break; -+ case 320: break; - case 128: - { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); - } -- case 267: break; -+ case 321: break; - case 63: - { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); - } -- case 268: break; -+ case 322: break; - case 81: - { return symbol_countUpdate(MACROUSE, makeMacroIdent()); - } -- case 269: break; -+ case 323: break; -+ case 170: -+ { return symbol(UNICODE_START_PUNCTUATION); -+ } -+ case 324: break; -+ case 149: -+ { return symbol(UNICODE_SURROGATE); -+ } -+ case 325: break; - case 15: - { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); - } -- case 270: break; -+ case 326: break; - case 125: - { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); - } -- case 271: break; -+ case 327: break; -+ case 167: -+ { return symbol(UNICODE_LOWERCASE_LETTER); -+ } -+ case 328: break; - case 90: - { charCount = true; - } -- case 272: break; -+ case 329: break; -+ case 165: -+ { return symbol(UNICODE_NON_SPACING_MARK); -+ } -+ case 330: break; - case 130: - { visibility = "private"; Skeleton.makePrivate(); - } -- case 273: break; -+ case 331: break; - case 134: - { return symbol(JLETTERCLASS); - } -- case 274: break; -+ case 332: break; - case 22: - { yybegin(REGEXPSTART); return symbol(LBRACE); - } -- case 275: break; -+ case 333: break; - case 115: - { eofclose = true; - } -- case 276: break; -+ case 334: break; - case 66: - // lookahead expression with fixed lookahead length - yypushback(1); -@@ -2799,7 +3185,7 @@ - return symbol(NOACTION); - } - } -- case 277: break; -+ case 335: break; - case 82: - // lookahead expression with fixed lookahead length - yypushback(2); -@@ -2812,66 +3198,74 @@ - return symbol(NOACTION); - } - } -- case 278: break; -+ case 336: break; - case 46: - { yybegin(REGEXP); return symbol(RBRACE); - } -- case 279: break; -+ case 337: break; - case 78: - { inclusive_states = false; yybegin(STATELIST); - } -- case 280: break; -+ case 338: break; - case 120: - { bufferSize = Integer.parseInt(yytext().substring(8).trim()); - } -- case 281: break; -+ case 339: break; - case 106: - { isIntWrap = true; - } -- case 282: break; -+ case 340: break; - case 133: - { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); - } -- case 283: break; -+ case 341: break; - case 3: - { userCode.append(yytext()); - } -- case 284: break; -+ case 342: break; -+ case 159: -+ { return symbol(UNICODE_END_PUNCTUATION); -+ } -+ case 343: break; - case 54: - { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); - } -- case 285: break; -+ case 344: break; - case 129: - { functionName = yytext().substring(10).trim(); - } -- case 286: break; -+ case 345: break; - case 85: - { classCode = conc(classCode,string); yybegin(MACROS); - } -- case 287: break; -+ case 346: break; - case 18: - { return symbol(QUESTION); - } -- case 288: break; -+ case 347: break; - case 50: - { if (commentbalance > 0) - commentbalance--; - else - yybegin(nextState); - } -- case 289: break; -+ case 348: break; - case 79: - { inclusive_states = true; yybegin(STATELIST); - } -- case 290: break; -+ case 349: break; - case 57: - { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); - } -- case 291: break; -+ case 350: break; -+ case 172: -+ { return symbol(UNICODE_DECIMAL_DIGIT_NUMBER); -+ } -+ case 351: break; - case 6: - { - } -- case 292: break; -+ case 352: break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; -@@ -2880,7 +3274,7 @@ - case STRING_CONTENT: { - throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); - } -- case 827: break; -+ case 1300: break; - case MACROS: { - if ( yymoreStreams() ) { - file = (File) files.pop(); -@@ -2889,35 +3283,35 @@ - else - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } -- case 828: break; -+ case 1301: break; - case STATELIST: { - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } -- case 829: break; -+ case 1302: break; - case CHARCLASS: { - throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); - } -- case 830: break; -+ case 1303: break; - case JAVA_CODE: { - throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); - } -- case 831: break; -+ case 1304: break; - case REPEATEXP: { - throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); - } -- case 832: break; -+ case 1305: break; - case COMMENT: { - throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); - } -- case 833: break; -+ case 1306: break; - case STATES: { - throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); - } -- case 834: break; -+ case 1307: break; - case COPY: { - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } -- case 835: break; -+ case 1308: break; - default: - { - if ( yymoreStreams() ) { -Index: jflex/src/JFlex/LexScan.flex -=================================================================== ---- jflex/src/JFlex/LexScan.flex (revision 433) -+++ jflex/src/JFlex/LexScan.flex Tue Dec 01 08:06:38 EST 2009 -@@ -463,6 +463,36 @@ - {WSPNL}*"[:digit:]" { return symbol(DIGITCLASS); } - {WSPNL}*"[:uppercase:]" { return symbol(UPPERCLASS); } - {WSPNL}*"[:lowercase:]" { return symbol(LOWERCLASS); } -+ {WSPNL}*"[:unicode_unassigned:]" { return symbol(UNICODE_UNASSIGNED); } -+ {WSPNL}*"[:unicode_uppercase_letter:]" { return symbol(UNICODE_UPPERCASE_LETTER); } -+ {WSPNL}*"[:unicode_lowercase_letter:]" { return symbol(UNICODE_LOWERCASE_LETTER); } -+ {WSPNL}*"[:unicode_titlecase_letter:]" { return symbol(UNICODE_TITLECASE_LETTER); } -+ {WSPNL}*"[:unicode_modifier_letter:]" { return symbol(UNICODE_MODIFIER_LETTER); } -+ {WSPNL}*"[:unicode_other_letter:]" { return symbol(UNICODE_OTHER_LETTER); } -+ {WSPNL}*"[:unicode_non_spacing_mark:]" { return symbol(UNICODE_NON_SPACING_MARK); } -+ {WSPNL}*"[:unicode_enclosing_mark:]" { return symbol(UNICODE_ENCLOSING_MARK); } -+ {WSPNL}*"[:unicode_combining_spacing_mark:]" { return symbol(UNICODE_COMBINING_SPACING_MARK); } -+ {WSPNL}*"[:unicode_decimal_digit_number:]" { return symbol(UNICODE_DECIMAL_DIGIT_NUMBER); } -+ {WSPNL}*"[:unicode_letter_number:]" { return symbol(UNICODE_LETTER_NUMBER); } -+ {WSPNL}*"[:unicode_other_number:]" { return symbol(UNICODE_OTHER_NUMBER); } -+ {WSPNL}*"[:unicode_space_separator:]" { return symbol(UNICODE_SPACE_SEPARATOR); } -+ {WSPNL}*"[:unicode_line_separator:]" { return symbol(UNICODE_LINE_SEPARATOR); } -+ {WSPNL}*"[:unicode_paragraph_separator:]" { return symbol(UNICODE_PARAGRAPH_SEPARATOR); } -+ {WSPNL}*"[:unicode_control:]" { return symbol(UNICODE_CONTROL); } -+ {WSPNL}*"[:unicode_format:]" { return symbol(UNICODE_FORMAT); } -+ {WSPNL}*"[:unicode_private_use:]" { return symbol(UNICODE_PRIVATE_USE); } -+ {WSPNL}*"[:unicode_surrogate:]" { return symbol(UNICODE_SURROGATE); } -+ {WSPNL}*"[:unicode_dash_punctuation:]" { return symbol(UNICODE_DASH_PUNCTUATION); } -+ {WSPNL}*"[:unicode_start_punctuation:]" { return symbol(UNICODE_START_PUNCTUATION); } -+ {WSPNL}*"[:unicode_end_punctuation:]" { return symbol(UNICODE_END_PUNCTUATION); } -+ {WSPNL}*"[:unicode_connector_punctuation:]" { return symbol(UNICODE_CONNECTOR_PUNCTUATION); } -+ {WSPNL}*"[:unicode_other_punctuation:]" { return symbol(UNICODE_OTHER_PUNCTUATION); } -+ {WSPNL}*"[:unicode_math_symbol:]" { return symbol(UNICODE_MATH_SYMBOL); } -+ {WSPNL}*"[:unicode_currency_symbol:]" { return symbol(UNICODE_CURRENCY_SYMBOL); } -+ {WSPNL}*"[:unicode_modifier_symbol:]" { return symbol(UNICODE_MODIFIER_SYMBOL); } -+ {WSPNL}*"[:unicode_other_symbol:]" { return symbol(UNICODE_OTHER_SYMBOL); } -+ {WSPNL}*"[:unicode_initial_quote_punctuation:]" { return symbol(UNICODE_INITIAL_QUOTE_PUNCTUATION); } -+ {WSPNL}*"[:unicode_final_quote_punctuation:]" { return symbol(UNICODE_FINAL_QUOTE_PUNCTUATION); } - } - - . { return symbol(CHAR, new Character(yytext().charAt(0))); } -Index: jflex/src/JFlex/LexParse.cup -=================================================================== ---- jflex/src/JFlex/LexParse.cup (revision 433) -+++ jflex/src/JFlex/LexParse.cup Tue Dec 01 08:13:35 EST 2009 -@@ -77,6 +77,96 @@ - case sym.LOWERCLASS: - return Character.isLowerCase(c); - -+ case sym.UNICODE_UNASSIGNED: -+ return Character.getType(c) == Character.UNASSIGNED; -+ -+ case sym.UNICODE_UPPERCASE_LETTER: -+ return Character.getType(c) == Character.UPPERCASE_LETTER; -+ -+ case sym.UNICODE_LOWERCASE_LETTER: -+ return Character.getType(c) == Character.LOWERCASE_LETTER; -+ -+ case sym.UNICODE_TITLECASE_LETTER: -+ return Character.getType(c) == Character.TITLECASE_LETTER; -+ -+ case sym.UNICODE_MODIFIER_LETTER: -+ return Character.getType(c) == Character.MODIFIER_LETTER; -+ -+ case sym.UNICODE_OTHER_LETTER: -+ return Character.getType(c) == Character.OTHER_LETTER; -+ -+ case sym.UNICODE_NON_SPACING_MARK: -+ return Character.getType(c) == Character.NON_SPACING_MARK; -+ -+ case sym.UNICODE_ENCLOSING_MARK: -+ return Character.getType(c) == Character.ENCLOSING_MARK; -+ -+ case sym.UNICODE_COMBINING_SPACING_MARK: -+ return Character.getType(c) == Character.COMBINING_SPACING_MARK; -+ -+ case sym.UNICODE_DECIMAL_DIGIT_NUMBER: -+ return Character.getType(c) == Character.DECIMAL_DIGIT_NUMBER; -+ -+ case sym.UNICODE_LETTER_NUMBER: -+ return Character.getType(c) == Character.LETTER_NUMBER; -+ -+ case sym.UNICODE_OTHER_NUMBER: -+ return Character.getType(c) == Character.OTHER_NUMBER; -+ -+ case sym.UNICODE_SPACE_SEPARATOR: -+ return Character.getType(c) == Character.SPACE_SEPARATOR; -+ -+ case sym.UNICODE_LINE_SEPARATOR: -+ return Character.getType(c) == Character.LINE_SEPARATOR; -+ -+ case sym.UNICODE_PARAGRAPH_SEPARATOR: -+ return Character.getType(c) == Character.PARAGRAPH_SEPARATOR; -+ -+ case sym.UNICODE_CONTROL: -+ return Character.getType(c) == Character.CONTROL; -+ -+ case sym.UNICODE_FORMAT: -+ return Character.getType(c) == Character.FORMAT; -+ -+ case sym.UNICODE_PRIVATE_USE: -+ return Character.getType(c) == Character.PRIVATE_USE; -+ -+ case sym.UNICODE_SURROGATE: -+ return Character.getType(c) == Character.SURROGATE; -+ -+ case sym.UNICODE_DASH_PUNCTUATION: -+ return Character.getType(c) == Character.DASH_PUNCTUATION; -+ -+ case sym.UNICODE_START_PUNCTUATION: -+ return Character.getType(c) == Character.START_PUNCTUATION; -+ -+ case sym.UNICODE_END_PUNCTUATION: -+ return Character.getType(c) == Character.END_PUNCTUATION; -+ -+ case sym.UNICODE_CONNECTOR_PUNCTUATION: -+ return Character.getType(c) == Character.CONNECTOR_PUNCTUATION; -+ -+ case sym.UNICODE_OTHER_PUNCTUATION: -+ return Character.getType(c) == Character.OTHER_PUNCTUATION; -+ -+ case sym.UNICODE_MATH_SYMBOL: -+ return Character.getType(c) == Character.MATH_SYMBOL; -+ -+ case sym.UNICODE_CURRENCY_SYMBOL: -+ return Character.getType(c) == Character.CURRENCY_SYMBOL; -+ -+ case sym.UNICODE_MODIFIER_SYMBOL: -+ return Character.getType(c) == Character.MODIFIER_SYMBOL; -+ -+ case sym.UNICODE_OTHER_SYMBOL: -+ return Character.getType(c) == Character.OTHER_SYMBOL; -+ -+ case sym.UNICODE_INITIAL_QUOTE_PUNCTUATION: -+ return Character.getType(c) == Character.INITIAL_QUOTE_PUNCTUATION; -+ -+ case sym.UNICODE_FINAL_QUOTE_PUNCTUATION: -+ return Character.getType(c) == Character.FINAL_QUOTE_PUNCTUATION; -+ - default: return false; - } - } -@@ -222,8 +312,17 @@ - MORETHAN, LBRACE, RBRACE, ASCII, FULL, UNICODE, REGEXPEND; - - terminal JLETTERCLASS, JLETTERDIGITCLASS, LETTERCLASS, DIGITCLASS, -- UPPERCLASS, LOWERCLASS, EOFRULE, NOACTION, LOOKAHEAD; -+ UPPERCLASS, LOWERCLASS, EOFRULE, NOACTION, LOOKAHEAD, -- -+ -+ UNICODE_UNASSIGNED, UNICODE_UPPERCASE_LETTER, UNICODE_LOWERCASE_LETTER, UNICODE_TITLECASE_LETTER, -+ UNICODE_MODIFIER_LETTER, UNICODE_OTHER_LETTER, UNICODE_NON_SPACING_MARK, UNICODE_ENCLOSING_MARK, -+ UNICODE_COMBINING_SPACING_MARK, UNICODE_DECIMAL_DIGIT_NUMBER, UNICODE_LETTER_NUMBER, UNICODE_OTHER_NUMBER, -+ UNICODE_SPACE_SEPARATOR, UNICODE_LINE_SEPARATOR, UNICODE_PARAGRAPH_SEPARATOR, UNICODE_CONTROL, UNICODE_FORMAT, -+ UNICODE_PRIVATE_USE, UNICODE_SURROGATE, UNICODE_DASH_PUNCTUATION, UNICODE_START_PUNCTUATION, -+ UNICODE_END_PUNCTUATION, UNICODE_CONNECTOR_PUNCTUATION, UNICODE_OTHER_PUNCTUATION, UNICODE_MATH_SYMBOL, -+ UNICODE_CURRENCY_SYMBOL, UNICODE_MODIFIER_SYMBOL, UNICODE_OTHER_SYMBOL, UNICODE_INITIAL_QUOTE_PUNCTUATION, -+ UNICODE_FINAL_QUOTE_PUNCTUATION; -+ - terminal Action ACTION; - terminal String IDENT, USERCODE; - terminal Integer REPEAT; -@@ -645,4 +744,64 @@ - {: RESULT = makePreClass(sym.UPPERCLASS); :} - | LOWERCLASS - {: RESULT = makePreClass(sym.LOWERCLASS); :} -+ | UNICODE_UNASSIGNED -+ {: RESULT = makePreClass(sym.UNICODE_UNASSIGNED); :} -+ | UNICODE_UPPERCASE_LETTER -+ {: RESULT = makePreClass(sym.UNICODE_UPPERCASE_LETTER); :} -+ | UNICODE_LOWERCASE_LETTER -+ {: RESULT = makePreClass(sym.UNICODE_LOWERCASE_LETTER); :} -+ | UNICODE_TITLECASE_LETTER -+ {: RESULT = makePreClass(sym.UNICODE_TITLECASE_LETTER); :} -+ | UNICODE_MODIFIER_LETTER -+ {: RESULT = makePreClass(sym.UNICODE_MODIFIER_LETTER); :} -+ | UNICODE_OTHER_LETTER -+ {: RESULT = makePreClass(sym.UNICODE_OTHER_LETTER); :} -+ | UNICODE_NON_SPACING_MARK -+ {: RESULT = makePreClass(sym.UNICODE_NON_SPACING_MARK); :} -+ | UNICODE_ENCLOSING_MARK -+ {: RESULT = makePreClass(sym.UNICODE_ENCLOSING_MARK); :} -+ | UNICODE_COMBINING_SPACING_MARK -+ {: RESULT = makePreClass(sym.UNICODE_COMBINING_SPACING_MARK); :} -+ | UNICODE_DECIMAL_DIGIT_NUMBER -+ {: RESULT = makePreClass(sym.UNICODE_DECIMAL_DIGIT_NUMBER); :} -+ | UNICODE_LETTER_NUMBER -+ {: RESULT = makePreClass(sym.UNICODE_LETTER_NUMBER); :} -+ | UNICODE_OTHER_NUMBER -+ {: RESULT = makePreClass(sym.UNICODE_OTHER_NUMBER); :} -+ | UNICODE_SPACE_SEPARATOR -+ {: RESULT = makePreClass(sym.UNICODE_SPACE_SEPARATOR); :} -+ | UNICODE_LINE_SEPARATOR -+ {: RESULT = makePreClass(sym.UNICODE_LINE_SEPARATOR); :} -+ | UNICODE_PARAGRAPH_SEPARATOR -+ {: RESULT = makePreClass(sym.UNICODE_PARAGRAPH_SEPARATOR); :} -+ | UNICODE_CONTROL -+ {: RESULT = makePreClass(sym.UNICODE_CONTROL); :} -+ | UNICODE_FORMAT -+ {: RESULT = makePreClass(sym.UNICODE_FORMAT); :} -+ | UNICODE_PRIVATE_USE -+ {: RESULT = makePreClass(sym.UNICODE_PRIVATE_USE); :} -+ | UNICODE_SURROGATE -+ {: RESULT = makePreClass(sym.UNICODE_SURROGATE); :} -+ | UNICODE_DASH_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_DASH_PUNCTUATION); :} -+ | UNICODE_START_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_START_PUNCTUATION); :} -+ | UNICODE_END_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_END_PUNCTUATION); :} -+ | UNICODE_CONNECTOR_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_CONNECTOR_PUNCTUATION); :} -+ | UNICODE_OTHER_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_OTHER_PUNCTUATION); :} -+ | UNICODE_MATH_SYMBOL -+ {: RESULT = makePreClass(sym.UNICODE_MATH_SYMBOL); :} -+ | UNICODE_CURRENCY_SYMBOL -+ {: RESULT = makePreClass(sym.UNICODE_CURRENCY_SYMBOL); :} -+ | UNICODE_MODIFIER_SYMBOL -+ {: RESULT = makePreClass(sym.UNICODE_MODIFIER_SYMBOL); :} -+ | UNICODE_OTHER_SYMBOL -+ {: RESULT = makePreClass(sym.UNICODE_OTHER_SYMBOL); :} -+ | UNICODE_INITIAL_QUOTE_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_INITIAL_QUOTE_PUNCTUATION); :} -+ | UNICODE_FINAL_QUOTE_PUNCTUATION -+ {: RESULT = makePreClass(sym.UNICODE_FINAL_QUOTE_PUNCTUATION); :} - ; -Index: jflex/src/JFlex/sym.java -=================================================================== ---- jflex/src/JFlex/sym.java (revision 370) -+++ jflex/src/JFlex/sym.java Tue Dec 01 08:13:39 EST 2009 -@@ -1,7 +1,7 @@ - - //---------------------------------------------------- --// The following code was generated by CUP v0.10k --// Tue May 27 20:22:19 EST 2008 -+// The following code was generated by CUP v0.11a beta 20060608 -+// Tue Dec 01 08:13:38 EST 2009 - //---------------------------------------------------- - - package JFlex; -@@ -10,52 +10,82 @@ - public interface sym { - /* terminals */ - public static final int DELIMITER = 9; -- public static final int EOFRULE = 26; -- public static final int STRING_I = 46; -- public static final int CHAR = 40; -- public static final int CONCAT = 45; -- public static final int MACROUSE = 42; -- public static final int LOWERCLASS = 25; -- public static final int EQUALS = 10; -- public static final int CCLASSNOT = 44; -- public static final int REPEAT = 32; -- public static final int TILDE = 39; -- public static final int CHAR_I = 47; -- public static final int STAR = 33; -- public static final int BAR = 35; -+ public static final int UNICODE_SPACE_SEPARATOR = 41; -+ public static final int UNICODE_OTHER_LETTER = 34; -+ public static final int USERCODE = 61; -+ public static final int UNICODE_ENCLOSING_MARK = 36; -+ public static final int REGEXPEND = 19; -+ public static final int CCLASSNOT = 74; -+ public static final int UNICODE = 18; -+ public static final int UNICODE_CURRENCY_SYMBOL = 54; -+ public static final int UNICODE_LETTER_NUMBER = 39; -+ public static final int UNICODE_START_PUNCTUATION = 49; -+ public static final int UNICODE_OTHER_SYMBOL = 56; -+ public static final int UNICODE_COMBINING_SPACING_MARK = 37; -+ public static final int UNICODE_FINAL_QUOTE_PUNCTUATION = 58; -+ public static final int UNICODE_UNASSIGNED = 29; -+ public static final int COMMA = 11; -+ public static final int RBRACE = 15; -+ public static final int UNICODE_UPPERCASE_LETTER = 30; -+ public static final int UNICODE_INITIAL_QUOTE_PUNCTUATION = 57; -+ public static final int LBRACE = 14; -+ public static final int UNICODE_SURROGATE = 47; -+ public static final int ACTION = 59; -+ public static final int CHAR_I = 77; -+ public static final int UNICODE_DECIMAL_DIGIT_NUMBER = 38; -+ public static final int CLOSECLASS = 7; -+ public static final int TILDE = 69; -+ public static final int UNICODE_NON_SPACING_MARK = 35; -+ public static final int DOLLAR = 5; -+ public static final int UNICODE_END_PUNCTUATION = 50; - public static final int FULL = 17; -- public static final int LOOKAHEAD = 28; - public static final int LESSTHAN = 12; -- public static final int BANG = 38; -- public static final int COMMA = 11; -+ public static final int UNICODE_DASH_PUNCTUATION = 48; -+ public static final int CLOSEBRACKET = 3; -+ public static final int PLUS = 64; -+ public static final int QUESTION = 66; -+ public static final int CHAR = 70; -+ public static final int NOACTION = 27; -+ public static final int STAR = 63; -+ public static final int UNICODE_CONNECTOR_PUNCTUATION = 51; -+ public static final int CONCAT = 75; -+ public static final int ASCII = 16; -+ public static final int MORETHAN = 13; -+ public static final int OPENCLASS = 6; -+ public static final int POINT = 67; - public static final int JLETTERDIGITCLASS = 21; -- public static final int PLUS = 34; -- public static final int USERCODE = 31; -+ public static final int EOFRULE = 26; - public static final int EOF = 0; -- public static final int error = 1; -- public static final int DASH = 8; -- public static final int CLOSEBRACKET = 3; -- public static final int HAT = 4; -+ public static final int UNICODE_MODIFIER_LETTER = 33; -+ public static final int BANG = 68; -+ public static final int UPPERCLASS = 24; - public static final int JLETTERCLASS = 20; -- public static final int IDENT = 30; -- public static final int ACTION = 29; -- public static final int CLOSECLASS = 7; -- public static final int DIGITCLASS = 23; -- public static final int LBRACE = 14; -- public static final int REGEXPEND = 19; -- public static final int OPENCLASS = 6; -+ public static final int REPEAT = 62; -+ public static final int LOOKAHEAD = 28; -+ public static final int UNICODE_OTHER_NUMBER = 40; -+ public static final int UNICODE_PRIVATE_USE = 46; -+ public static final int UNICODE_MATH_SYMBOL = 53; - public static final int OPENBRACKET = 2; -- public static final int POINT = 37; -+ public static final int HAT = 4; -+ public static final int IDENT = 60; -+ public static final int error = 1; -+ public static final int UNICODE_PARAGRAPH_SEPARATOR = 43; -+ public static final int LOWERCLASS = 25; -+ public static final int STRING_I = 76; -+ public static final int UNICODE_MODIFIER_SYMBOL = 55; -+ public static final int UNICODE_CONTROL = 44; -+ public static final int UNICODE_OTHER_PUNCTUATION = 52; -+ public static final int DIGITCLASS = 23; -+ public static final int UNICODE_FORMAT = 45; -+ public static final int UNICODE_TITLECASE_LETTER = 32; -+ public static final int DASH = 8; -+ public static final int MACROUSE = 72; -+ public static final int STRING = 71; -+ public static final int CCLASS = 73; -+ public static final int UNICODE_LOWERCASE_LETTER = 31; - public static final int LETTERCLASS = 22; -- public static final int MORETHAN = 13; -- public static final int DOLLAR = 5; -- public static final int RBRACE = 15; -- public static final int STRING = 41; -- public static final int QUESTION = 36; -- public static final int UPPERCLASS = 24; -- public static final int NOACTION = 27; -- public static final int CCLASS = 43; -- public static final int ASCII = 16; -- public static final int UNICODE = 18; -+ public static final int BAR = 65; -+ public static final int UNICODE_LINE_SEPARATOR = 42; -+ public static final int EQUALS = 10; - } - -Index: tex/manual.tex -=================================================================== ---- tex/manual.tex (revision 431) -+++ tex/manual.tex Tue Dec 01 08:11:42 EST 2009 -@@ -1318,7 +1318,37 @@ - | '[:letter:]' - | '[:digit:]' - | '[:uppercase:]' -- | '[:lowercase:]' -+ | '[:lowercase:]' -+ | '[:unicode_unassigned:]' -+ | '[:unicode_uppercase_letter:]' -+ | '[:unicode_lowercase_letter:]' -+ | '[:unicode_titlecase_letter:]' -+ | '[:unicode_modifier_letter:]' -+ | '[:unicode_other_letter:]' -+ | '[:unicode_non_spacing_mark:]' -+ | '[:unicode_enclosing_mark:]' -+ | '[:unicode_combining_spacing_mark:]' -+ | '[:unicode_decimal_digit_number:]' -+ | '[:unicode_letter_number:]' -+ | '[:unicode_other_number:]' -+ | '[:unicode_space_separator:]' -+ | '[:unicode_line_separator:]' -+ | '[:unicode_paragraph_separator:]' -+ | '[:unicode_control:]' -+ | '[:unicode_format:]' -+ | '[:unicode_private_use:]' -+ | '[:unicode_surrogate:]' -+ | '[:unicode_dash_punctuation:]' -+ | '[:unicode_start_punctuation:]' -+ | '[:unicode_end_punctuation:]' -+ | '[:unicode_connector_punctuation:]' -+ | '[:unicode_other_punctuation:]' -+ | '[:unicode_math_symbol:]' -+ | '[:unicode_currency_symbol:]' -+ | '[:unicode_modifier_symbol:]' -+ | '[:unicode_other_symbol:]' -+ | '[:unicode_initial_quote_punctuation:]' -+ | '[:unicode_final_quote_punctuation:]' - | '.' - \end{verbatim} - %$ -@@ -1467,6 +1497,7 @@ - [:digit:] isDigit() - [:uppercase:] isUpperCase() - [:lowercase:] isLowerCase() -+[:unicode_math_symbol:] getType() == Character.MATH_SYMBOL - \end{verbatim} - - They are especially useful when working with the unicode character set. diff --git a/tools/lexer/jflex-1.4/lib/JFlex.jar b/tools/lexer/jflex-1.4/lib/JFlex.jar deleted file mode 100644 index e83294a7b6f0bf1ac491d7882469492792bbdab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187789 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ⅆ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 SgdpDVPaK?|&6VKGA^!ttMW12- diff --git a/tools/lexer/jflex-1.4/lib/jflex-mode.el b/tools/lexer/jflex-1.4/lib/jflex-mode.el deleted file mode 100644 index 2af59477d38b..000000000000 --- a/tools/lexer/jflex-1.4/lib/jflex-mode.el +++ /dev/null @@ -1,114 +0,0 @@ -; -*- Mode: Emacs-Lisp; -*- - -;;; jflex-mode - -;;; author: Gerwin Klein -;;; $Revision$, $Date$ - -(require 'derived) -(require 'font-lock) - -(define-derived-mode jflex-mode java-mode "JFlex" - "Major mode for editing JFlex files" - - ;; set the indentation - (setq c-basic-offset 2) - - (c-set-offset 'knr-argdecl-intro 0) - (c-set-offset 'topmost-intro-cont 0) - - ;; remove auto and hungry anything - (c-toggle-auto-hungry-state -1) - (c-toggle-auto-state -1) - (c-toggle-hungry-state -1) - - (use-local-map jflex-mode-map) - - ;; get rid of that damn electric-brace - (define-key jflex-mode-map "{" 'self-insert-command) - (define-key jflex-mode-map "}" 'self-insert-command) - - (define-key jflex-mode-map [tab] 'jflex-indent-command) - - ) - -(defalias 'jflex-indent-command 'c-indent-command) - -(defconst jflex-font-lock-keywords - (append - '( - ("^%%" . font-lock-reference-face) - "^%{" - "^%init{" - "^%initthrow{" - "^%eof{" - "^%eofthrow{" - "^%yylexthrow{" - "^%eofval{" - "^%}" - "^%init}" - "^%initthrow}" - "^%eof}" - "^%eofthrow}" - "^%yylexthrow}" - "^%eofval}" - "^%standalone" - "^%scanerror" - "^%switch" - "^%states" ; fixme: state identifiers - "^%state" - "^%s" - "^%xstates" - "^%xstate" - "^%x" - "^%char" - "^%line" - "^%column" - "^%byaccj" - "^%cupsym" - "^%cupdebug" - "^%cup" - "^%eofclose" - "^%class" - "^%function" - "^%type" - "^%integer" - "^%intwrap" - "^%int" - "^%yyeof" - "^%notunix" - "^%7bit" - "^%full" - "^%8bit" - "^%unicode" - "^%16bit" - "^%caseless" - "^%ignorecase" - "^%implements" - "^%extends" - "^%public" - "^%apiprivate" - "^%final" - "^%abstract" - "^%debug" - "^%table" - "^%pack" - "^%include" - "^%buffer" - "^%initthrow" - "^%eofthrow" - "^%yylexthrow" - "^%throws" - ("%[%{}0-9a-zA-Z]+" . font-lock-warning-face) ; errors - ("{[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*}" . font-lock-variable-name-face) ; macro uses - "<>" ; special <> symbol - ("<[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\(,[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\)*>" . font-lock-type-face) ; lex state list - ) - java-font-lock-keywords-2) - "JFlex keywords for font-lock mode") - -(put 'jflex-mode 'font-lock-defaults - '(jflex-font-lock-keywords - nil nil ((?_ . "w")) beginning-of-defun)) - -(provide 'jflex-mode) diff --git a/tools/lexer/jflex-1.4/lib/jflex.vim b/tools/lexer/jflex-1.4/lib/jflex.vim deleted file mode 100644 index c612ea0ec744..000000000000 --- a/tools/lexer/jflex-1.4/lib/jflex.vim +++ /dev/null @@ -1,149 +0,0 @@ -" Vim syntax file -" Language: JFlex -" Maintainer: Gerwin Klein -" Last Change: $Revision$, $Date$ - -" Thanks to Michael Brailsford for help and suggestions - -" Quit when a syntax file was already loaded {{{ -if exists("b:current_syntax") - finish -endif -"}}} - -" Include java syntax {{{ -if version >= 600 - runtime! syntax/java.vim - unlet b:current_syntax -else - so $VIMRUNTIME/syntax/java.vim -endif -"}}} - -syn cluster jflexOptions contains=jflexOption,jflexCodeInclude,jflexComment,jflexMacroIdent,jflexMacroRegExp,jflexOptionError -syn cluster jflexRules contains=jflexRule,jflexComment,jflexActionCode,jflexRuleStates,jflexRegExp - -" java code section -syn region jflexStart start="/\*\|//\|import\|package\|class"me=s end="^%%"me=e-2 contains=@javaTop nextgroup=jflexOptionReg - -" %% -" options -syn region jflexOptionReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexOptions nextgroup=jflexRulesReg - -syn match jflexOptionError "%\i*" contained - -syn match jflexOption "^\(%s\|%x\)" contained -syn match jflexOption "^%state" contained -syn match jflexOption "^%states" contained -syn match jflexOption "^%xstate" contained -syn match jflexOption "^%xstates" contained -syn match jflexOption "^%char" contained -syn match jflexOption "^%line" contained -syn match jflexOption "^%column" contained -syn match jflexOption "^%byaccj" contained -syn match jflexOption "^%cup" contained -syn match jflexOption "^%cupsym" contained -syn match jflexOption "^%cupdebug" contained -syn match jflexOption "^%eofclose" contained -syn match jflexOption "^%class" contained -syn match jflexOption "^%function" contained -syn match jflexOption "^%type" contained -syn match jflexOption "^%integer" contained -syn match jflexOption "^%int" contained -syn match jflexOption "^%intwrap" contained -syn match jflexOption "^%yyeof" contained -syn match jflexOption "^%notunix" contained -syn match jflexOption "^%7bit" contained -syn match jflexOption "^%8bit" contained -syn match jflexOption "^%full" contained -syn match jflexOption "^%16bit" contained -syn match jflexOption "^%unicode" contained -syn match jflexOption "^%caseless" contained -syn match jflexOption "^%ignorecase" contained -syn match jflexOption "^%implements" contained -syn match jflexOption "^%extends" contained -syn match jflexOption "^%public" contained -syn match jflexOption "^%apiprivate" contained -syn match jflexOption "^%final" contained -syn match jflexOption "^%abstract" contained -syn match jflexOption "^%debug" contained -syn match jflexOption "^%standalone" contained -syn match jflexOption "^%switch" contained -syn match jflexOption "^%table" contained -syn match jflexOption "^%pack" contained -syn match jflexOption "^%include" contained -syn match jflexOption "^%buffer" contained -syn match jflexOption "^%initthrow" contained -syn match jflexOption "^%eofthrow" contained -syn match jflexOption "^%yylexthrow" contained -syn match jflexOption "^%throws" contained -syn match jflexOption "^%scannerror" contained - -syn match jflexMacroIdent "\I\i*\s*="me=e-1 contained nextgroup=jflexMacroRegExp - -syn region jflexMacroRegExp matchgroup=jflexOperator start="=" end="^\(%\|\I\|\i\|/\)"me=e-1 contains=NONE contained - -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%{" end="^%}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%init{" end="^%init}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%initthrow{" end="^%initthrow}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eof{" end="^%eof}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofthrow{" end="^%eofthrow}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%yylexthrow{" end="^%yylexthrow}" contains=@javaTop contained -syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofval{" end="^%eofval}" contains=@javaTop contained - -" rules (end pattern shouldn't occur, if it does anyway we just stay in jflexRulesReg) -syn region jflexRulesReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexRules - -" at first everything but strings is a regexp -syn match jflexRegExp "\([^\" \t]\|\\\"\)\+" contained - -" take out comments -syn match jflexComment "//.*" contained -syn region jflexComment start="/\*" end="\*/" contained contains=jflexComment - -" lex states -syn match jflexRuleStates "<\s*\I\i*\(\s*,\s*\I\i*\)*\s*>" contained skipnl skipwhite nextgroup=jflexStateGroup - -" action code (only after states braces and macro use) -syn region jflexActionCode matchgroup=Delimiter start="{" end="}" contained contains=@javaTop,jflexJavaBraces - -" macro use -syn match jflexRegExp "{\s*\I\i*\s*}" contained - -" state braces (only active after ) -syn region jflexStateGroup matchgroup=jflexRuleStates start="{$" start="{\s" end="}" contained contains=@jflexRules - -" string -syn region jflexRegExp matchgroup=String start=+"+ skip=+\\\\\|\\"+ end=+"+ contained - -" not to be confused with a state -syn match jflexRegExp "<>" contained - -" escape sequence -syn match jflexRegExp "\\." contained - - -" keep braces in actions balanced -syn region jflexJavaBraces start="{" end="}" contained contains=@javaTop,jflexJavaBraces - - -" syncing -syn sync clear -syn sync minlines=10 -syn sync match jflexSync grouphere jflexOptionReg "^%[a-z]" -syn sync match jflexSync grouphere jflexRulesReg "^<" - - -" highlighting -hi link jflexOption Special -hi link jflexMacroIdent Ident -hi link jflexMacroRegExp Macro -hi link jflexOptionError Error -hi link jflexComment Comment -hi link jflexOperator Operator -hi link jflexRuleStates Special -hi link jflexRegExp Function -hi jflexSectionSep guifg=yellow ctermfg=yellow guibg=blue ctermbg=blue gui=bold cterm=bold -hi link jflexCodeIncludeMark jflexSectionSep - -let b:current_syntax="jflex" diff --git a/tools/lexer/jflex-1.4/src/JFlex/Action.java b/tools/lexer/jflex-1.4/src/JFlex/Action.java deleted file mode 100644 index b84d6b9fced7..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Action.java +++ /dev/null @@ -1,261 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Encapsulates an action in the specification. - * - * It stores the Java code as String together with a priority (line number in the specification). - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class Action { - - /** A normal action */ - public final static int NORMAL = 0; - /** Action of a lookahead expression r1/r2 with fixed length r1 */ - public final static int FIXED_BASE = 1; - /** Action of a lookahead expression r1/r2 with fixed length r2 */ - public final static int FIXED_LOOK = 2; - /** Action of a lookahead expression r1/r2 with a finite choice of - * fixed lengths in r2 */ - public final static int FINITE_CHOICE = 3; - /** Action of a general lookahead expression */ - public final static int GENERAL_LOOK = 4; - /** Action of the 2nd forward pass for lookahead */ - public final static int FORWARD_ACTION = 5; - /** Action of the backward pass for lookahead */ - public final static int BACKWARD_ACTION = 6; - - /** - * The Java code this Action represents - */ - String content; - - /** - * The priority (i.e. line number in the specification) of this Action. - */ - int priority; - - /** - * Which kind of action this is. - * (normal, a/b with fixed length a, fixed length b, etc) - */ - private int kind = NORMAL; - - /** The length of the lookahead (if fixed) */ - private int len; - - /** The entry state of the corresponding forward DFA (if general lookahead) */ - private int entryState; - - /** - * Creates a new Action object with specified content and line number. - * - * @param content java code - * @param priority line number - */ - public Action(String content, int priority) { - this.content = content.trim(); - this.priority = priority; - } - - /** - * Creates a new Action object of the specified kind. Only - * accepts FORWARD_ACTION or BACKWARD_ACTION. - * - * @param kind the kind of action - * - * @see #FORWARD_ACTION - * @see #BACKWARD_ACTION - */ - public Action(int kind) { - if (kind != FORWARD_ACTION && kind != BACKWARD_ACTION) - throw new GeneratorException(); - this.content = ""; - this.priority = Integer.MAX_VALUE; - this.kind = kind; - } - - /** - * Compares the priority value of this Action with the specified action. - * - * @param other the other Action to compare this Action with. - * - * @return this Action if it has higher priority - the specified one, if not. - */ - public Action getHigherPriority(Action other) { - if (other == null) return this; - - // the smaller the number the higher the priority - if (other.priority > this.priority) - return this; - else - return other; - } - - - /** - * Returns the String representation of this object. - * - * @return string representation of the action - */ - public String toString() { - return "Action (priority "+priority+", lookahead "+kind+") :" + - Out.NL+content; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - - /** - * Returns true iff the parameter is an - * Action with the same content as this one. - * - * @param a the object to compare this Action with - * @return true if the action strings are equal - */ - public boolean isEquiv(Action a) { - return this == a || - (this.content.equals(a.content) && - this.kind == a.kind && - this.len == a.len && - this.entryState == a.entryState); - } - - - /** - * Calculate hash value. - * - * @return a hash value for this Action - */ - public int hashCode() { - return content.hashCode(); - } - - - /** - * Test for equality to another object. - * - * This action equals another object if the other - * object is an equivalent action. - * - * @param o the other object. - * - * @see Action#isEquiv(Action) - */ - public boolean equals(Object o) { - if (o instanceof Action) - return isEquiv((Action) o); - else - return false; - } - - /** - * Return true iff this is action belongs to a general lookahead rule. - * - * @return true if this actions belongs to a general lookahead rule. - */ - public boolean isGenLookAction() { - return kind == GENERAL_LOOK; - } - - /** - * Return true if code for this is action should be emitted, false - * if it is a BACK/FORWARD lookahead action. - * - * @return true if code should be emitted for this action. - */ - public boolean isEmittable() { - return kind != BACKWARD_ACTION && kind != FORWARD_ACTION; - } - - /** - * Return kind of lookahead. - */ - public int lookAhead() { - return kind; - } - - /** - * Sets the lookahead kind and data for this action - * - * @param kind which kind of lookahead it is - * @param data the length for fixed length look aheads. - * - */ - public void setLookAction(int kind, int data) { - this.kind = kind; - this.len = data; - } - - /** - * The length of the lookahead or base if this is a fixed length - * lookahead action. - */ - public int getLookLength() { - return len; - } - - /** - * Return the corresponding entry state for the forward DFA (if this - * is a general lookahead expression) - * - * @return the forward DFA entry state (+1 is the backward DFA) - */ - public int getEntryState() { - return entryState; - } - - /** - * Set the corresponding entry state for the forward DFA of this action - * (if this is a general lookahead expression) - * - * @param the entry state for the forward DFA of this action - */ - public void setEntryState(int entryState) { - this.entryState = entryState; - } - - public Action copyChoice(int length) { - Action a = new Action(this.content, this.priority); - a.setLookAction(FINITE_CHOICE, length); - return a; - } - - /** - * String representation of the lookahead kind of this action. - * - * @return the string representation - */ - public String lookString() { - switch (kind) { - case NORMAL: return ""; - case BACKWARD_ACTION: return "LOOK_BACK"; - case FIXED_BASE: return "FIXED_BASE"; - case FIXED_LOOK: return "FIXED_LOOK"; - case FINITE_CHOICE: return "FINITE_CHOICE"; - case FORWARD_ACTION: return "LOOK_FORWARD"; - case GENERAL_LOOK: return "LOOK_ACTION"; - default: return "unknown lookahead type"; - } - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/CharClassException.java b/tools/lexer/jflex-1.4/src/JFlex/CharClassException.java deleted file mode 100644 index 2c2a19b67ea0..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CharClassException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - - -/** - * This Exception is used in class CharClasses. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class CharClassException extends RuntimeException { - - /** - * Creates a new CharClassException without message - */ - public CharClassException() { - } - - - /** - * Creates a new CharClassException with the specified message - * - * @param message the error description presented to the user. - */ - public CharClassException(String message) { - super(message); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/CharClassInterval.java b/tools/lexer/jflex-1.4/src/JFlex/CharClassInterval.java deleted file mode 100644 index 2fe6c803715d..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CharClassInterval.java +++ /dev/null @@ -1,73 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -/** - * Stores an interval of characters together with the character class - * - * A character belongs to an interval, if its Unicode value is greater than or equal - * to the Unicode value of start and smaller than or euqal to the Unicode - * value of end. - * - * All characters of the interval must belong to the same character class. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class CharClassInterval { - - /** - * The first character of the interval - */ - int start; - - /** - * The last character of the interval - */ - int end; - - /** - * The code of the class all characters of this interval belong to. - */ - int charClass; - - - /** - * Creates a new CharClassInterval from start to end - * that belongs to character class charClass. - * - * @param start The first character of the interval - * @param end The last character of the interval - * @param charClass The code of the class all characters of this interval belong to. - */ - public CharClassInterval(int start, int end, int charClass) { - this.start = start; - this.end = end; - this.charClass = charClass; - } - - /** - * returns string representation of this class interval - */ - public String toString() { - return "["+start+"-"+end+"="+charClass+"]"; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/CharClasses.java b/tools/lexer/jflex-1.4/src/JFlex/CharClasses.java deleted file mode 100644 index fcda11bfe804..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CharClasses.java +++ /dev/null @@ -1,388 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - - -/** - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class CharClasses { - - /** debug flag (for char classes only) */ - private static final boolean DEBUG = false; - - /** the largest character that can be used in char classes */ - public static final char maxChar = '\uFFFF'; - - /** the char classes */ - private Vector /* of IntCharSet */ classes; - - /** the largest character actually used in a specification */ - private char maxCharUsed; - - /** - * Constructs a new CharClass object that provides space for - * classes of characters from 0 to maxCharCode. - * - * Initially all characters are in class 0. - * - * @param maxCharCode the last character code to be - * considered. (127 for 7bit Lexers, - * 255 for 8bit Lexers and 0xFFFF - * for Unicode Lexers). - */ - public CharClasses(int maxCharCode) { - if (maxCharCode < 0 || maxCharCode > 0xFFFF) - throw new IllegalArgumentException(); - - maxCharUsed = (char) maxCharCode; - - classes = new Vector(); - classes.addElement(new IntCharSet(new Interval((char) 0, maxChar))); - } - - - /** - * Returns the greatest Unicode value of the current input character set. - */ - public char getMaxCharCode() { - return maxCharUsed; - } - - - /** - * Sets the largest Unicode value of the current input character set. - * - * @param charCode the largest character code, used for the scanner - * (i.e. %7bit, %8bit, %16bit etc.) - */ - public void setMaxCharCode(int charCode) { - if (charCode < 0 || charCode > 0xFFFF) - throw new IllegalArgumentException(); - - maxCharUsed = (char) charCode; - } - - - /** - * Returns the current number of character classes. - */ - public int getNumClasses() { - return classes.size(); - } - - - - /** - * Updates the current partition, so that the specified set of characters - * gets a new character class. - * - * Characters that are elements of set are not in the same - * equivalence class with characters that are not elements of set. - * - * @param set the set of characters to distinguish from the rest - * @param caseless if true upper/lower/title case are considered equivalent - */ - public void makeClass(IntCharSet set, boolean caseless) { - if (caseless) set = set.getCaseless(); - - if ( DEBUG ) { - Out.dump("makeClass("+set+")"); - dump(); - } - - int oldSize = classes.size(); - for (int i = 0; i < oldSize; i++) { - IntCharSet x = (IntCharSet) classes.elementAt(i); - - if (x.equals(set)) return; - - IntCharSet and = x.and(set); - - if ( and.containsElements() ) { - if ( x.equals(and) ) { - set.sub(and); - continue; - } - else if ( set.equals(and) ) { - x.sub(and); - classes.addElement(and); - if (DEBUG) { - Out.dump("makeClass(..) finished"); - dump(); - } - return; - } - - set.sub(and); - x.sub(and); - classes.addElement(and); - } - } - - if (DEBUG) { - Out.dump("makeClass(..) finished"); - dump(); - } - } - - - /** - * Returns the code of the character class the specified character belongs to. - */ - public int getClassCode(char letter) { - int i = -1; - while (true) { - IntCharSet x = (IntCharSet) classes.elementAt(++i); - if ( x.contains(letter) ) return i; - } - } - - /** - * Dump charclasses to the dump output stream - */ - public void dump() { - Out.dump(toString()); - } - - - /** - * Return a string representation of one char class - * - * @param theClass the index of the class to - */ - public String toString(int theClass) { - return classes.elementAt(theClass).toString(); - } - - - /** - * Return a string representation of the char classes - * stored in this class. - * - * Enumerates the classes by index. - */ - public String toString() { - StringBuffer result = new StringBuffer("CharClasses:"); - - result.append(Out.NL); - - for (int i = 0; i < classes.size(); i++) - result.append("class "+i+":"+Out.NL+classes.elementAt(i)+Out.NL); - - return result.toString(); - } - - - /** - * Creates a new character class for the single character singleChar. - * - * @param caseless if true upper/lower/title case are considered equivalent - */ - public void makeClass(char singleChar, boolean caseless) { - makeClass(new IntCharSet(singleChar), caseless); - } - - - /** - * Creates a new character class for each character of the specified String. - * - * @param caseless if true upper/lower/title case are considered equivalent - */ - public void makeClass(String str, boolean caseless) { - for (int i = 0; i < str.length(); i++) makeClass(str.charAt(i), caseless); - } - - - /** - * Updates the current partition, so that the specified set of characters - * gets a new character class. - * - * Characters that are elements of the set v are not in the same - * equivalence class with characters that are not elements of the set v. - * - * @param v a Vector of Interval objects. - * This Vector represents a set of characters. The set of characters is - * the union of all intervals in the Vector. - * - * @param caseless if true upper/lower/title case are considered equivalent - */ - public void makeClass(Vector /* Interval */ v, boolean caseless) { - makeClass(new IntCharSet(v), caseless); - } - - - /** - * Updates the current partition, so that the set of all characters not contained in the specified - * set of characters gets a new character class. - * - * Characters that are elements of the set v are not in the same - * equivalence class with characters that are not elements of the set v. - * - * This method is equivalent to makeClass(v) - * - * @param v a Vector of Interval objects. - * This Vector represents a set of characters. The set of characters is - * the union of all intervals in the Vector. - * - * @param caseless if true upper/lower/title case are considered equivalent - */ - public void makeClassNot(Vector v, boolean caseless) { - makeClass(new IntCharSet(v), caseless); - } - - - /** - * Returns an array that contains the character class codes of all characters - * in the specified set of input characters. - */ - private int [] getClassCodes(IntCharSet set, boolean negate) { - - if (DEBUG) { - Out.dump("getting class codes for "+set); - if (negate) - Out.dump("[negated]"); - } - - int size = classes.size(); - - // [fixme: optimize] - int temp [] = new int [size]; - int length = 0; - - for (int i = 0; i < size; i++) { - IntCharSet x = (IntCharSet) classes.elementAt(i); - if ( negate ) { - if ( !set.and(x).containsElements() ) { - temp[length++] = i; - if (DEBUG) Out.dump("code "+i); - } - } - else { - if ( set.and(x).containsElements() ) { - temp[length++] = i; - if (DEBUG) Out.dump("code "+i); - } - } - } - - int result [] = new int [length]; - System.arraycopy(temp, 0, result, 0, length); - - return result; - } - - - /** - * Returns an array that contains the character class codes of all characters - * in the specified set of input characters. - * - * @param intervallVec a Vector of Intervals, the set of characters to get - * the class codes for - * - * @return an array with the class codes for intervallVec - */ - public int [] getClassCodes(Vector /* Interval */ intervallVec) { - return getClassCodes(new IntCharSet(intervallVec), false); - } - - - /** - * Returns an array that contains the character class codes of all characters - * that are not in the specified set of input characters. - * - * @param intervallVec a Vector of Intervals, the complement of the - * set of characters to get the class codes for - * - * @return an array with the class codes for the complement of intervallVec - */ - public int [] getNotClassCodes(Vector /* Interval */ intervallVec) { - return getClassCodes(new IntCharSet(intervallVec), true); - } - - - /** - * Check consistency of the stored classes [debug]. - * - * all classes must be disjoint, checks if all characters - * have a class assigned. - */ - public void check() { - for (int i = 0; i < classes.size(); i++) - for (int j = i+1; j < classes.size(); j++) { - IntCharSet x = (IntCharSet) classes.elementAt(i); - IntCharSet y = (IntCharSet) classes.elementAt(j); - if ( x.and(y).containsElements() ) { - System.out.println("Error: non disjoint char classes "+i+" and "+j); - System.out.println("class "+i+": "+x); - System.out.println("class "+j+": "+y); - } - } - - // check if each character has a classcode - // (= if getClassCode terminates) - for (char c = 0; c < maxChar; c++) { - getClassCode(c); - if (c % 100 == 0) System.out.print("."); - } - - getClassCode(maxChar); - } - - - /** - * Returns an array of all CharClassIntervalls in this - * char class collection. - * - * The array is ordered by char code, i.e. - * result[i+1].start = result[i].end+1 - * - * Each CharClassInterval contains the number of the - * char class it belongs to. - */ - public CharClassInterval [] getIntervals() { - int i, c; - int size = classes.size(); - int numIntervalls = 0; - - for (i = 0; i < size; i++) - numIntervalls+= ((IntCharSet) classes.elementAt(i)).numIntervalls(); - - CharClassInterval [] result = new CharClassInterval[numIntervalls]; - - i = 0; - c = 0; - while (i < numIntervalls) { - int code = getClassCode((char) c); - IntCharSet set = (IntCharSet) classes.elementAt(code); - Interval iv = set.getNext(); - - result[i++] = new CharClassInterval(iv.start, iv.end, code); - c = iv.end+1; - } - - return result; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/CharSet.java b/tools/lexer/jflex-1.4/src/JFlex/CharSet.java deleted file mode 100644 index f79102fe016e..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CharSet.java +++ /dev/null @@ -1,112 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class CharSet { - - final static int BITS = 6; // the number of bits to shift (2^6 = 64) - final static int MOD = (1<> BITS)+1]; - add(character); - } - - - public void add(int character) { - resize(character); - - if ( (bits[character >> BITS] & (1L << (character & MOD))) == 0) numElements++; - - bits[character >> BITS] |= (1L << (character & MOD)); - } - - - private int nbits2size (int nbits) { - return ((nbits >> BITS) + 1); - } - - - private void resize(int nbits) { - int needed = nbits2size(nbits); - - if (needed < bits.length) return; - - long newbits[] = new long[Math.max(bits.length*2,needed)]; - System.arraycopy(bits, 0, newbits, 0, bits.length); - - bits = newbits; - } - - - public boolean isElement(int character) { - int index = character >> BITS; - if (index >= bits.length) return false; - return (bits[index] & (1L << (character & MOD))) != 0; - } - - - public CharSetEnumerator characters() { - return new CharSetEnumerator(this); - } - - - public boolean containsElements() { - return numElements > 0; - } - - public int size() { - return numElements; - } - - public String toString() { - CharSetEnumerator set = characters(); - - StringBuffer result = new StringBuffer("{"); - - if ( set.hasMoreElements() ) result.append(""+set.nextElement()); - - while ( set.hasMoreElements() ) { - int i = set.nextElement(); - result.append( ", "+i); - } - - result.append("}"); - - return result.toString(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/CharSetEnumerator.java b/tools/lexer/jflex-1.4/src/JFlex/CharSetEnumerator.java deleted file mode 100644 index af5fab6624af..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CharSetEnumerator.java +++ /dev/null @@ -1,88 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Enumerator for the elements of a CharSet. - * - * Does not implement java.util.Enumeration, but supports the same protocol. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class CharSetEnumerator { - - private int index; - private int offset; - private long mask = 1; - - private CharSet set; - - public CharSetEnumerator(CharSet characters) { - set = characters; - - while (index < set.bits.length && set.bits[index] == 0) - index++; - - if (index >= set.bits.length) return; - - while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) { - mask<<= 1; - offset++; - } - } - - private void advance() { - do { - offset++; - mask<<= 1; - } while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)); - - if (offset > CharSet.MOD) { - do - index++; - while (index < set.bits.length && set.bits[index] == 0); - - if (index >= set.bits.length) return; - - offset = 0; - mask = 1; - - while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) { - mask<<= 1; - offset++; - } - } - } - - public boolean hasMoreElements() { - return index < set.bits.length; - } - - public int nextElement() { - int x = (index << CharSet.BITS) + offset; - advance(); - return x; - } - -} - diff --git a/tools/lexer/jflex-1.4/src/JFlex/CountEmitter.java b/tools/lexer/jflex-1.4/src/JFlex/CountEmitter.java deleted file mode 100644 index f4ac80507b10..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/CountEmitter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * jflex 1.4 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -/** - * An emitter for an array encoded as count/value pairs in a string. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class CountEmitter extends PackEmitter { - /** number of entries in expanded array */ - private int numEntries; - - /** translate all values by this amount */ - private int translate = 0; - - - /** - * Create a count/value emitter for a specific field. - * - * @param name name of the generated array - */ - protected CountEmitter(String name) { - super(name); - } - - /** - * Emits count/value unpacking code for the generated array. - * - * @see JFlex.PackEmitter#emitUnPack() - */ - public void emitUnpack() { - // close last string chunk: - println("\";"); - - nl(); - println(" private static int [] zzUnpack"+name+"() {"); - println(" int [] result = new int["+numEntries+"];"); - println(" int offset = 0;"); - - for (int i = 0; i < chunks; i++) { - println(" offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);"); - } - - println(" return result;"); - println(" }"); - nl(); - - println(" private static int zzUnpack"+name+"(String packed, int offset, int [] result) {"); - println(" int i = 0; /* index in packed string */"); - println(" int j = offset; /* index in unpacked array */"); - println(" int l = packed.length();"); - println(" while (i < l) {"); - println(" int count = packed.charAt(i++);"); - println(" int value = packed.charAt(i++);"); - if (translate == 1) { - println(" value--;"); - } - else if (translate != 0) { - println(" value-= "+translate); - } - println(" do result[j++] = value; while (--count > 0);"); - println(" }"); - println(" return j;"); - println(" }"); - } - - /** - * Translate all values by given amount. - * - * Use to move value interval from [0, 0xFFFF] to something different. - * - * @param i amount the value will be translated by. - * Example: i = 1 allows values in [-1, 0xFFFE]. - */ - public void setValTranslation(int i) { - this.translate = i; - } - - /** - * Emit one count/value pair. - * - * Automatically translates value by the translate value. - * - * @param count - * @param value - * - * @see CountEmitter#setValTranslation(int) - */ - public void emit(int count, int value) { - numEntries+= count; - breaks(); - emitUC(count); - emitUC(value+translate); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/DFA.java b/tools/lexer/jflex-1.4/src/JFlex/DFA.java deleted file mode 100644 index 5ebd55947bf5..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/DFA.java +++ /dev/null @@ -1,929 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -import java.io.*; -import java.util.*; - - -/** - * DFA representation in JFlex. - * Contains minimization algorithm. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class DFA { - - /** - * The initial number of states - */ - private static final int STATES = 500; - - /** - * The code for "no target state" in the transition table. - */ - public static final int NO_TARGET = -1; - - /** - * table[current_state][character] is the next state for current_state - * with input character, NO_TARGET if there is no transition for - * this input in current_state - */ - int [][] table; - - - /** - * isFinal[state] == true <=> the state state is - * a final state. - */ - boolean [] isFinal; - - - /** - * action[state] is the action that is to be carried out in - * state state, null if there is no action. - */ - Action [] action; - - /** - * entryState[i] is the start-state of lexical state i or - * lookahead DFA i - */ - int entryState []; - - /** - * The number of states in this DFA - */ - int numStates; - - /** - * The current maximum number of input characters - */ - int numInput; - - /** - * The number of lexical states (2*numLexStates <= entryState.length) - */ - int numLexStates; - - /** - * all actions that are used in this DFA - */ - Hashtable usedActions = new Hashtable(); - - /** True iff this DFA contains general lookahead */ - boolean lookaheadUsed; - - public DFA(int numEntryStates, int numInp, int numLexStates) { - numInput = numInp; - - int statesNeeded = Math.max(numEntryStates, STATES); - - table = new int [statesNeeded] [numInput]; - action = new Action [statesNeeded]; - isFinal = new boolean [statesNeeded]; - entryState = new int [numEntryStates]; - numStates = 0; - - this.numLexStates = numLexStates; - - for (int i = 0; i < statesNeeded; i++) { - for (char j = 0; j < numInput; j++) - table [i][j] = NO_TARGET; - } - } - - - public void setEntryState(int eState, int trueState) { - entryState[eState] = trueState; - } - - private void ensureStateCapacity(int newNumStates) { - int oldLength = isFinal.length; - - if ( newNumStates < oldLength ) return; - - int newLength = oldLength*2; - while ( newLength <= newNumStates ) newLength*= 2; - - boolean [] newFinal = new boolean [newLength]; - boolean [] newPushback = new boolean [newLength]; - Action [] newAction = new Action [newLength]; - int [] [] newTable = new int [newLength] [numInput]; - - System.arraycopy(isFinal,0,newFinal,0,numStates); - System.arraycopy(action,0,newAction,0,numStates); - System.arraycopy(table,0,newTable,0,oldLength); - - int i,j; - - for (i = oldLength; i < newLength; i++) { - for (j = 0; j < numInput; j++) { - newTable[i][j] = NO_TARGET; - } - } - - isFinal = newFinal; - action = newAction; - table = newTable; - } - - - public void setAction(int state, Action stateAction) { - action[state] = stateAction; - if (stateAction != null) { - usedActions.put(stateAction,stateAction); - lookaheadUsed |= stateAction.isGenLookAction(); - } - } - - public void setFinal(int state, boolean isFinalState) { - isFinal[state] = isFinalState; - } - - public void addTransition(int start, char input, int dest) { - int max = Math.max(start,dest)+1; - ensureStateCapacity(max); - if (max > numStates) numStates = max; - - // Out.debug("Adding DFA transition ("+start+", "+(int)input+", "+dest+")"); - - table[start][input] = dest; - } - - - public String toString() { - StringBuffer result = new StringBuffer(); - - for (int i=0; i < numStates; i++) { - result.append("State "); - if ( isFinal[i] ) { - result.append("[FINAL"); - String l = action[i].lookString(); - if (!l.equals("")) { - result.append(", "); - result.append(l); - } - result.append("] "); - } - result.append(i+":"+Out.NL); - - for (char j=0; j < numInput; j++) { - if ( table[i][j] >= 0 ) - result.append(" with "+(int)j+" in "+table[i][j]+Out.NL); - } - } - - return result.toString(); - } - - - public void writeDot(File file) { - try { - PrintWriter writer = new PrintWriter(new FileWriter(file)); - writer.println(dotFormat()); - writer.close(); - } - catch (IOException e) { - Out.error(ErrorMessages.FILE_WRITE, file); - throw new GeneratorException(); - } - } - - - public String dotFormat() { - StringBuffer result = new StringBuffer(); - - result.append("digraph DFA {"+Out.NL); - result.append("rankdir = LR"+Out.NL); - - for (int i=0; i < numStates; i++) { - if ( isFinal[i] ) { - result.append(i); - result.append(" [shape = doublecircle]"); - result.append(Out.NL); - } - } - - for (int i=0; i < numStates; i++) { - for (int input = 0; input < numInput; input++) { - if ( table[i][input] >= 0 ) { - result.append(i+" -> "+table[i][input]); - result.append(" [label=\"["+input+"]\"]"+Out.NL); - // result.append(" [label=\"["+classes.toString(input)+"]\"]\n"); - } - } - } - - result.append("}"+Out.NL); - - return result.toString(); - } - - - /** - * Check that all actions can actually be matched in this DFA. - */ - public void checkActions(LexScan scanner, LexParse parser) { - EOFActions eofActions = parser.getEOFActions(); - Enumeration l = scanner.actions.elements(); - - while (l.hasMoreElements()) { - Action a = (Action) l.nextElement(); - if ( !a.equals(usedActions.get(a)) && !eofActions.isEOFAction(a) ) { - Out.warning(scanner.file, ErrorMessages.NEVER_MATCH, a.priority-1, -1); - } - } - } - - - /** - * Implementation of Hopcroft's O(n log n) minimization algorithm, follows - * description by D. Gries. - * - * Time: O(n log n) - * Space: O(c n), size < 4*(5*c*n + 13*n + 3*c) byte - */ - public void minimize() { - Out.print(numStates+" states before minimization, "); - - if (numStates == 0) { - Out.error(ErrorMessages.ZERO_STATES); - throw new GeneratorException(); - } - - if (Options.no_minimize) { - Out.println("minimization skipped."); - return; - } - - // the algorithm needs the DFA to be total, so we add an error state 0, - // and translate the rest of the states by +1 - final int n = numStates+1; - - // block information: - // [0..n-1] stores which block a state belongs to, - // [n..2*n-1] stores how many elements each block has - int [] block = new int[2*n]; - - // implements a doubly linked list of states (these are the actual blocks) - int [] b_forward = new int[2*n]; - int [] b_backward = new int[2*n]; - - // the last of the blocks currently in use (in [n..2*n-1]) - // (end of list marker, points to the last used block) - int lastBlock = n; // at first we start with one empty block - final int b0 = n; // the first block - - // the circular doubly linked list L of pairs (B_i, c) - // (B_i, c) in L iff l_forward[(B_i-n)*numInput+c] > 0 // numeric value of block 0 = n! - int [] l_forward = new int[n*numInput+1]; - int [] l_backward = new int[n*numInput+1]; - int anchorL = n*numInput; // list anchor - - // inverse of the transition table - // if t = inv_delta[s][c] then { inv_delta_set[t], inv_delta_set[t+1], .. inv_delta_set[k] } - // is the set of states, with inv_delta_set[k] = -1 and inv_delta_set[j] >= 0 for t <= j < k - int [] [] inv_delta = new int[n][numInput]; - int [] inv_delta_set = new int [2*n*numInput]; - - // twin stores two things: - // twin[0]..twin[numSplit-1] is the list of blocks that have been split - // twin[B_i] is the twin of block B_i - int [] twin = new int[2*n]; - int numSplit; - - // SD[B_i] is the the number of states s in B_i with delta(s,a) in B_j - // if SD[B_i] == block[B_i], there is no need to split - int [] SD = new int[2*n]; // [only SD[n..2*n-1] is used] - - - // for fixed (B_j,a), the D[0]..D[numD-1] are the inv_delta(B_j,a) - int [] D = new int[n]; - int numD; - - - // initialize inverse of transition table - int lastDelta = 0; - int [] inv_lists = new int[n]; // holds a set of lists of states - int [] inv_list_last = new int[n]; // the last element - for (int c = 0; c < numInput; c++) { - // clear "head" and "last element" pointers - for (int s = 0; s < n; s++) { - inv_list_last[s] = -1; - inv_delta[s][c] = -1; - } - - // the error state has a transition for each character into itself - inv_delta[0][c] = 0; - inv_list_last[0] = 0; - - // accumulate states of inverse delta into lists (inv_delta serves as head of list) - for (int s = 1; s < n; s++) { - int t = table[s-1][c]+1; - - if (inv_list_last[t] == -1) { // if there are no elements in the list yet - inv_delta[t][c] = s; // mark t as first and last element - inv_list_last[t] = s; - } - else { - inv_lists[inv_list_last[t]] = s; // link t into chain - inv_list_last[t] = s; // and mark as last element - } - } - - // now move them to inv_delta_set in sequential order, - // and update inv_delta accordingly - for (int s = 0; s < n; s++) { - int i = inv_delta[s][c]; inv_delta[s][c] = lastDelta; - int j = inv_list_last[s]; - boolean go_on = (i != -1); - while (go_on) { - go_on = (i != j); - inv_delta_set[lastDelta++] = i; - i = inv_lists[i]; - } - inv_delta_set[lastDelta++] = -1; - } - } // of initialize inv_delta - - // printInvDelta(inv_delta, inv_delta_set); - - // initialize blocks - - // make b0 = {0} where 0 = the additional error state - b_forward[b0] = 0; - b_backward[b0] = 0; - b_forward[0] = b0; - b_backward[0] = b0; - block[0] = b0; - block[b0] = 1; - - for (int s = 1; s < n; s++) { - // System.out.println("Checking state ["+(s-1)+"]"); - // search the blocks if it fits in somewhere - // (fit in = same pushback behavior, same finalness, same lookahead behavior, same action) - int b = b0+1; // no state can be equivalent to the error state - boolean found = false; - while (!found && b <= lastBlock) { - // get some state out of the current block - int t = b_forward[b]; - // System.out.println(" picking state ["+(t-1)+"]"); - - // check, if s could be equivalent with t - if (isFinal[s-1]) { - found = isFinal[t-1] && action[s-1].isEquiv(action[t-1]); - } - else { - found = !isFinal[t-1]; - } - - if (found) { // found -> add state s to block b - // System.out.println("Found! Adding to block "+(b-b0)); - // update block information - block[s] = b; - block[b]++; - - // chain in the new element - int last = b_backward[b]; - b_forward[last] = s; - b_forward[s] = b; - b_backward[b] = s; - b_backward[s] = last; - } - - b++; - } - - if (!found) { // fits in nowhere -> create new block - // System.out.println("not found, lastBlock = "+lastBlock); - - // update block information - block[s] = b; - block[b]++; - - // chain in the new element - b_forward[b] = s; - b_forward[s] = b; - b_backward[b] = s; - b_backward[s] = b; - - lastBlock++; - } - } // of initialize blocks - - // printBlocks(block,b_forward,b_backward,lastBlock); - - // initialize worklist L - // first, find the largest block B_max, then, all other (B_i,c) go into the list - int B_max = b0; - int B_i; - for (B_i = b0+1; B_i <= lastBlock; B_i++) - if (block[B_max] < block[B_i]) B_max = B_i; - - // L = empty - l_forward[anchorL] = anchorL; - l_backward[anchorL] = anchorL; - - // set up the first list element - if (B_max == b0) B_i = b0+1; else B_i = b0; // there must be at least two blocks - - int index = (B_i-b0)*numInput; // (B_i, 0) - while (index < (B_i+1-b0)*numInput) { - int last = l_backward[anchorL]; - l_forward[last] = index; - l_forward[index] = anchorL; - l_backward[index] = last; - l_backward[anchorL] = index; - index++; - } - - // now do the rest of L - while (B_i <= lastBlock) { - if (B_i != B_max) { - index = (B_i-b0)*numInput; - while (index < (B_i+1-b0)*numInput) { - int last = l_backward[anchorL]; - l_forward[last] = index; - l_forward[index] = anchorL; - l_backward[index] = last; - l_backward[anchorL] = index; - index++; - } - } - B_i++; - } - // end of setup L - - // start of "real" algorithm - // int step = 0; - // System.out.println("max_steps = "+(n*numInput)); - // while L not empty - while (l_forward[anchorL] != anchorL) { - // System.out.println("step : "+(step++)); - // printL(l_forward, l_backward, anchorL); - - // pick and delete (B_j, a) in L: - - // pick - int B_j_a = l_forward[anchorL]; - // delete - l_forward[anchorL] = l_forward[B_j_a]; - l_backward[l_forward[anchorL]] = anchorL; - l_forward[B_j_a] = 0; - // take B_j_a = (B_j-b0)*numInput+c apart into (B_j, a) - int B_j = b0 + B_j_a / numInput; - int a = B_j_a % numInput; - - // printL(l_forward, l_backward, anchorL); - - // System.out.println("picked ("+B_j+","+a+")"); - // printL(l_forward, l_backward, anchorL); - - // determine splittings of all blocks wrt (B_j, a) - // i.e. D = inv_delta(B_j,a) - numD = 0; - int s = b_forward[B_j]; - while (s != B_j) { - // System.out.println("splitting wrt. state "+s); - int t = inv_delta[s][a]; - // System.out.println("inv_delta chunk "+t); - while (inv_delta_set[t] != -1) { - // System.out.println("D+= state "+inv_delta_set[t]); - D[numD++] = inv_delta_set[t++]; - } - s = b_forward[s]; - } - - // clear the twin list - numSplit = 0; - - // System.out.println("splitting blocks according to D"); - - // clear SD and twins (only those B_i that occur in D) - for (int indexD = 0; indexD < numD; indexD++) { // for each s in D - s = D[indexD]; - B_i = block[s]; - SD[B_i] = -1; - twin[B_i] = 0; - } - - // count how many states of each B_i occurring in D go with a into B_j - // Actually we only check, if *all* t in B_i go with a into B_j. - // In this case SD[B_i] == block[B_i] will hold. - for (int indexD = 0; indexD < numD; indexD++) { // for each s in D - s = D[indexD]; - B_i = block[s]; - - // only count, if we haven't checked this block already - if (SD[B_i] < 0) { - SD[B_i] = 0; - int t = b_forward[B_i]; - while (t != B_i && (t != 0 || block[0] == B_j) && - (t == 0 || block[table[t-1][a]+1] == B_j)) { - SD[B_i]++; - t = b_forward[t]; - } - } - } - - // split each block according to D - for (int indexD = 0; indexD < numD; indexD++) { // for each s in D - s = D[indexD]; - B_i = block[s]; - - // System.out.println("checking if block "+(B_i-b0)+" must be split because of state "+s); - - if (SD[B_i] != block[B_i]) { - // System.out.println("state "+(s-1)+" must be moved"); - int B_k = twin[B_i]; - if (B_k == 0) { - // no twin for B_i yet -> generate new block B_k, make it B_i's twin - B_k = ++lastBlock; - // System.out.println("creating block "+(B_k-n)); - // printBlocks(block,b_forward,b_backward,lastBlock-1); - b_forward[B_k] = B_k; - b_backward[B_k] = B_k; - - twin[B_i] = B_k; - - // mark B_i as split - twin[numSplit++] = B_i; - } - // move s from B_i to B_k - - // remove s from B_i - b_forward[b_backward[s]] = b_forward[s]; - b_backward[b_forward[s]] = b_backward[s]; - - // add s to B_k - int last = b_backward[B_k]; - b_forward[last] = s; - b_forward[s] = B_k; - b_backward[s] = last; - b_backward[B_k] = s; - - block[s] = B_k; - block[B_k]++; - block[B_i]--; - - SD[B_i]--; // there is now one state less in B_i that goes with a into B_j - // printBlocks(block, b_forward, b_backward, lastBlock); - // System.out.println("finished move"); - } - } // of block splitting - - // printBlocks(block, b_forward, b_backward, lastBlock); - - // System.out.println("updating L"); - - // update L - for (int indexTwin = 0; indexTwin < numSplit; indexTwin++) { - B_i = twin[indexTwin]; - int B_k = twin[B_i]; - for (int c = 0; c < numInput; c++) { - int B_i_c = (B_i-b0)*numInput+c; - int B_k_c = (B_k-b0)*numInput+c; - if (l_forward[B_i_c] > 0) { - // (B_i,c) already in L --> put (B_k,c) in L - int last = l_backward[anchorL]; - l_backward[anchorL] = B_k_c; - l_forward[last] = B_k_c; - l_backward[B_k_c] = last; - l_forward[B_k_c] = anchorL; - } - else { - // put the smaller block in L - if (block[B_i] <= block[B_k]) { - int last = l_backward[anchorL]; - l_backward[anchorL] = B_i_c; - l_forward[last] = B_i_c; - l_backward[B_i_c] = last; - l_forward[B_i_c] = anchorL; - } - else { - int last = l_backward[anchorL]; - l_backward[anchorL] = B_k_c; - l_forward[last] = B_k_c; - l_backward[B_k_c] = last; - l_forward[B_k_c] = anchorL; - } - } - } - } - } - - // System.out.println("Result"); - // printBlocks(block,b_forward,b_backward,lastBlock); - - /* - System.out.println("Old minimization:"); - boolean [] [] equiv = old_minimize(); - - boolean error = false; - for (int i = 1; i < equiv.length; i++) { - for (int j = 0; j < equiv[i].length; j++) { - if (equiv[i][j] != (block[i+1] == block[j+1])) { - System.out.println("error: equiv["+i+"]["+j+"] = "+equiv[i][j]+ - ", block["+i+"] = "+block[i+1]+", block["+j+"] = "+block[j]); - error = true; - } - } - } - - if (error) System.exit(1); - System.out.println("check"); - */ - - // transform the transition table - - // trans[i] is the state j that will replace state i, i.e. - // states i and j are equivalent - int trans [] = new int [numStates]; - - // kill[i] is true iff state i is redundant and can be removed - boolean kill [] = new boolean [numStates]; - - // move[i] is the amount line i has to be moved in the transition table - // (because states j < i have been removed) - int move [] = new int [numStates]; - - // fill arrays trans[] and kill[] (in O(n)) - for (int b = b0+1; b <= lastBlock; b++) { // b0 contains the error state - // get the state with smallest value in current block - int s = b_forward[b]; - int min_s = s; // there are no empty blocks! - for (; s != b; s = b_forward[s]) - if (min_s > s) min_s = s; - // now fill trans[] and kill[] for this block - // (and translate states back to partial DFA) - min_s--; - for (s = b_forward[b]-1; s != b-1; s = b_forward[s+1]-1) { - trans[s] = min_s; - kill[s] = s != min_s; - } - } - - // fill array move[] (in O(n)) - int amount = 0; - for (int i = 0; i < numStates; i++) { - if ( kill[i] ) - amount++; - else - move[i] = amount; - } - - int i,j; - // j is the index in the new transition table - // the transition table is transformed in place (in O(c n)) - for (i = 0, j = 0; i < numStates; i++) { - - // we only copy lines that have not been removed - if ( !kill[i] ) { - - // translate the target states - for (int c = 0; c < numInput; c++) { - if ( table[i][c] >= 0 ) { - table[j][c] = trans[ table[i][c] ]; - table[j][c]-= move[ table[j][c] ]; - } - else { - table[j][c] = table[i][c]; - } - } - - isFinal[j] = isFinal[i]; - action[j] = action[i]; - - j++; - } - } - - numStates = j; - - // translate lexical states - for (i = 0; i < entryState.length; i++) { - entryState[i] = trans[ entryState[i] ]; - entryState[i]-= move[ entryState[i] ]; - } - - Out.println(numStates+" states in minimized DFA"); - } - - public String toString(int [] a) { - String r = "{"; - int i; - for (i = 0; i < a.length-1; i++) r += a[i]+","; - return r+a[i]+"}"; - } - - public void printBlocks(int [] b, int [] b_f, int [] b_b, int last) { - Out.dump("block : "+toString(b)); - Out.dump("b_forward : "+toString(b_f)); - Out.dump("b_backward: "+toString(b_b)); - Out.dump("lastBlock : "+last); - final int n = numStates+1; - for (int i = n; i <= last; i ++) { - Out.dump("Block "+(i-n)+" (size "+b[i]+"):"); - String line = "{"; - int s = b_f[i]; - while (s != i) { - line = line+(s-1); - int t = s; - s = b_f[s]; - if (s != i) { - line = line+","; - if (b[s] != i) Out.dump("consistency error for state "+(s-1)+" (block "+b[s]+")"); - } - if (b_b[s] != t) Out.dump("consistency error for b_back in state "+(s-1)+" (back = "+b_b[s]+", should be = "+t+")"); - } - Out.dump(line+"}"); - } - } - - public void printL(int [] l_f, int [] l_b, int anchor) { - String l = "L = {"; - int bc = l_f[anchor]; - while (bc != anchor) { - int b = bc / numInput; - int c = bc % numInput; - l+= "("+b+","+c+")"; - int old_bc = bc; - bc = l_f[bc]; - if (bc != anchor) l+= ","; - if (l_b[bc] != old_bc) Out.dump("consistency error for ("+b+","+c+")"); - } - Out.dump(l+"}"); - } - - - /** - * Much simpler, but slower and less memory efficient minimization algorithm. - * - * @return the equivalence relation on states. - */ - public boolean [] [] old_minimize() { - - int i,j; - char c; - - Out.print(numStates+" states before minimization, "); - - if (numStates == 0) { - Out.error(ErrorMessages.ZERO_STATES); - throw new GeneratorException(); - } - - if (Options.no_minimize) { - Out.println("minimization skipped."); - return null; - } - - // equiv[i][j] == true <=> state i and state j are equivalent - boolean [] [] equiv = new boolean [numStates] []; - - // list[i][j] contains all pairs of states that have to be marked "not equivalent" - // if states i and j are recognized to be not equivalent - StatePairList [] [] list = new StatePairList [numStates] []; - - // construct a triangular matrix equiv[i][j] with j < i - // and mark pairs (final state, not final state) as not equivalent - for (i = 1; i < numStates; i++) { - list[i] = new StatePairList[i]; - equiv[i] = new boolean [i]; - for (j = 0; j < i; j++) { - // i and j are equivalent, iff : - // i and j are both final and their actions are equivalent and have same pushback behaviour or - // i and j are both not final - - if ( isFinal[i] && isFinal[j] ) - equiv[i][j] = action[i].isEquiv(action[j]); - else - equiv[i][j] = !isFinal[j] && !isFinal[i]; - } - } - - - for (i = 1; i < numStates; i++) { - - Out.debug("Testing state "+i); - - for (j = 0; j < i; j++) { - - if ( equiv[i][j] ) { - - for (c = 0; c < numInput; c++) { - - if (equiv[i][j]) { - - int p = table[i][c]; - int q = table[j][c]; - if (p < q) { - int t = p; - p = q; - q = t; - } - if ( p >= 0 || q >= 0 ) { - // Out.debug("Testing input '"+c+"' for ("+i+","+j+")"); - // Out.debug("Target states are ("+p+","+q+")"); - if ( p!=q && (p == -1 || q == -1 || !equiv[p][q]) ) { - equiv[i][j] = false; - if (list[i][j] != null) list[i][j].markAll(list,equiv); - } - // printTable(equiv); - } // if (p >= 0) .. - } // if (equiv[i][j] - } // for (char c = 0; c < numInput .. - - // if i and j are still marked equivalent.. - - if ( equiv[i][j] ) { - - // Out.debug("("+i+","+j+") are still marked equivalent"); - - for (c = 0; c < numInput; c++) { - - int p = table[i][c]; - int q = table[j][c]; - if (p < q) { - int t = p; - p = q; - q = t; - } - - if (p != q && p >= 0 && q >= 0) { - if ( list[p][q] == null ) { - list[p][q] = new StatePairList(); - } - list[p][q].addPair(i,j); - } - } - } - else { - // Out.debug("("+i+","+j+") are not equivalent"); - } - - } // of first if (equiv[i][j]) - } // of for j - } // of for i - // } - - // printTable(equiv); - - return equiv; - } - - - public void printInvDelta(int [] [] inv_delta, int [] inv_delta_set) { - Out.dump("Inverse of transition table: "); - for (int s = 0; s < numStates+1; s++) { - Out.dump("State ["+(s-1)+"]"); - for (int c = 0; c < numInput; c++) { - String line = "With <"+c+"> in {"; - int t = inv_delta[s][c]; - while (inv_delta_set[t] != -1) { - line += inv_delta_set[t++]-1; - if (inv_delta_set[t] != -1) line += ","; - } - if (inv_delta_set[inv_delta[s][c]] != -1) - Out.dump(line+"}"); - } - } - } - - public void printTable(boolean [] [] equiv) { - - Out.dump("Equivalence table is : "); - for (int i = 1; i < numStates; i++) { - String line = i+" :"; - for (int j = 0; j < i; j++) { - if (equiv[i][j]) - line+= " E"; - else - line+= " x"; - } - Out.dump(line); - } - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/EOFActions.java b/tools/lexer/jflex-1.4/src/JFlex/EOFActions.java deleted file mode 100644 index 08d20acacdd5..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/EOFActions.java +++ /dev/null @@ -1,94 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - - -/** - * A simple table to store EOF actions for each lexical state. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class EOFActions { - - /** maps lexical states to actions */ - private Hashtable /* Integer -> Action */ actions = new Hashtable(); - private Action defaultAction; - private int numLexStates; - - public void setNumLexStates(int num) { - numLexStates = num; - } - - public void add(Vector stateList, Action action) { - - if (stateList != null && stateList.size() > 0) { - Enumeration states = stateList.elements(); - - while (states.hasMoreElements()) - add( (Integer) states.nextElement(), action ); - } - else { - defaultAction = action.getHigherPriority(defaultAction); - - for (int i = 0; i < numLexStates; i++) { - Integer state = new Integer(i); - if ( actions.get(state) != null ) { - Action oldAction = (Action) actions.get(state); - actions.put(state, oldAction.getHigherPriority(action)); - } - } - } - } - - public void add(Integer state, Action action) { - if ( actions.get(state) == null ) - actions.put(state, action); - else { - Action oldAction = (Action) actions.get(state); - actions.put(state, oldAction.getHigherPriority(action)); - } - } - - public boolean isEOFAction(Object a) { - if (a == defaultAction) return true; - - Enumeration e = actions.elements(); - while ( e.hasMoreElements() ) - if (a == e.nextElement()) return true; - - return false; - } - - public Action getAction(int state) { - return (Action) actions.get(new Integer(state)); - } - - public Action getDefault() { - return defaultAction; - } - - public int numActions() { - return actions.size(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Emitter.java b/tools/lexer/jflex-1.4/src/JFlex/Emitter.java deleted file mode 100644 index c1904253367b..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Emitter.java +++ /dev/null @@ -1,1671 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.io.*; -import java.util.*; -import java.text.*; - -/** - * This class manages the actual code generation, putting - * the scanner together, filling in skeleton sections etc. - * - * Table compression, String packing etc. is also done here. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class Emitter { - - // bit masks for state attributes - static final private int FINAL = 1; - static final private int NOLOOK = 8; - - static final private String date = (new SimpleDateFormat()).format(new Date()); - - private File inputFile; - - private PrintWriter out; - private Skeleton skel; - private LexScan scanner; - private LexParse parser; - private DFA dfa; - - // for switch statement: - // table[i][j] is the set of input characters that leads from state i to state j - private CharSet table[][]; - - private boolean isTransition[]; - - // noTarget[i] is the set of input characters that have no target state in state i - private CharSet noTarget[]; - - // for row killing: - private int numRows; - private int [] rowMap; - private boolean [] rowKilled; - - // for col killing: - private int numCols; - private int [] colMap; - private boolean [] colKilled; - - - /** maps actions to their switch label */ - private Hashtable actionTable = new Hashtable(); - - private CharClassInterval [] intervals; - - private String visibility = "public"; - - public Emitter(File inputFile, LexParse parser, DFA dfa) throws IOException { - - String name = getBaseName(parser.scanner.className) + ".java"; - - File outputFile = normalize(name, inputFile); - - Out.println("Writing code to \""+outputFile+"\""); - - this.out = new PrintWriter(new BufferedWriter(new FileWriter(outputFile))); - this.parser = parser; - this.scanner = parser.scanner; - this.visibility = scanner.visibility; - this.inputFile = inputFile; - this.dfa = dfa; - this.skel = new Skeleton(out); - } - - /** - * Computes base name of the class name. Needs to take into account generics. - * - * @see LexScan#className - * @return the - */ - public static String getBaseName(String className) { - int gen = className.indexOf('<'); - if (gen < 0) { - return className; - } - else { - return className.substring(0, gen); - } - } - - - /** - * Constructs a file in Options.getDir() or in the same directory as - * another file. Makes a backup if the file already exists. - * - * @param name the name (without path) of the file - * @param path the path where to construct the file - * @param input fall back location if path = null - * (expected to be a file in the directory to write to) - */ - public static File normalize(String name, File input) { - File outputFile; - - if ( Options.getDir() == null ) - if ( input == null || input.getParent() == null ) - outputFile = new File(name); - else - outputFile = new File(input.getParent(), name); - else - outputFile = new File(Options.getDir(), name); - - if ( outputFile.exists() && !Options.no_backup ) { - File backup = new File( outputFile.toString()+"~" ); - - if ( backup.exists() ) backup.delete(); - - if ( outputFile.renameTo( backup ) ) - Out.println("Old file \""+outputFile+"\" saved as \""+backup+"\""); - else - Out.println("Couldn't save old file \""+outputFile+"\", overwriting!"); - } - - return outputFile; - } - - private void println() { - out.println(); - } - - private void println(String line) { - out.println(line); - } - - private void println(int i) { - out.println(i); - } - - private void print(String line) { - out.print(line); - } - - private void print(int i) { - out.print(i); - } - - private void print(int i, int tab) { - int exp; - - if (i < 0) - exp = 1; - else - exp = 10; - - while (tab-- > 1) { - if (Math.abs(i) < exp) print(" "); - exp*= 10; - } - - print(i); - } - - private boolean hasGenLookAhead() { - return dfa.lookaheadUsed; - } - - private void emitLookBuffer() { - if (!hasGenLookAhead()) return; - - println(" /** For the backwards DFA of general lookahead statements */"); - println(" private boolean [] zzFin = new boolean [ZZ_BUFFERSIZE+1];"); - println(); - } - - private void emitScanError() { - print(" private void zzScanError(int errorCode)"); - - if (scanner.scanErrorException != null) - print(" throws "+scanner.scanErrorException); - - println(" {"); - - skel.emitNext(); - - if (scanner.scanErrorException == null) - println(" throw new Error(message);"); - else - println(" throw new "+scanner.scanErrorException+"(message);"); - - skel.emitNext(); - - print(" "+visibility+" void yypushback(int number) "); - - if (scanner.scanErrorException == null) - println(" {"); - else - println(" throws "+scanner.scanErrorException+" {"); - } - - private void emitMain() { - if ( !(scanner.standalone || scanner.debugOption || scanner.cupDebug) ) return; - - if ( scanner.cupDebug ) { - println(" /**"); - println(" * Converts an int token code into the name of the"); - println(" * token by reflection on the cup symbol class/interface "+scanner.cupSymbol); - println(" *"); - println(" * This code was contributed by Karl Meissner "); - println(" */"); - println(" private String getTokenName(int token) {"); - println(" try {"); - println(" java.lang.reflect.Field [] classFields = " + scanner.cupSymbol + ".class.getFields();"); - println(" for (int i = 0; i < classFields.length; i++) {"); - println(" if (classFields[i].getInt(null) == token) {"); - println(" return classFields[i].getName();"); - println(" }"); - println(" }"); - println(" } catch (Exception e) {"); - println(" e.printStackTrace(System.err);"); - println(" }"); - println(""); - println(" return \"UNKNOWN TOKEN\";"); - println(" }"); - println(""); - println(" /**"); - println(" * Same as "+scanner.functionName+" but also prints the token to standard out"); - println(" * for debugging."); - println(" *"); - println(" * This code was contributed by Karl Meissner "); - println(" */"); - - print(" "+visibility+" "); - if ( scanner.tokenType == null ) { - if ( scanner.isInteger ) - print( "int" ); - else - if ( scanner.isIntWrap ) - print( "Integer" ); - else - print( "Yytoken" ); - } - else - print( scanner.tokenType ); - - print(" debug_"); - - print(scanner.functionName); - - print("() throws java.io.IOException"); - - if ( scanner.lexThrow != null ) { - print(", "); - print(scanner.lexThrow); - } - - if ( scanner.scanErrorException != null ) { - print(", "); - print(scanner.scanErrorException); - } - - println(" {"); - - println(" java_cup.runtime.Symbol s = "+scanner.functionName+"();"); - print(" System.out.println( "); - if (scanner.lineCount) print("\"line:\" + (yyline+1) + "); - if (scanner.columnCount) print("\" col:\" + (yycolumn+1) + "); - println("\" --\"+ yytext() + \"--\" + getTokenName(s.sym) + \"--\");"); - println(" return s;"); - println(" }"); - println(""); - } - - if ( scanner.standalone ) { - println(" /**"); - println(" * Runs the scanner on input files."); - println(" *"); - println(" * This is a standalone scanner, it will print any unmatched"); - println(" * text to System.out unchanged."); - println(" *"); - println(" * @param argv the command line, contains the filenames to run"); - println(" * the scanner on."); - println(" */"); - } - else { - println(" /**"); - println(" * Runs the scanner on input files."); - println(" *"); - println(" * This main method is the debugging routine for the scanner."); - println(" * It prints debugging information about each returned token to"); - println(" * System.out until the end of file is reached, or an error occured."); - println(" *"); - println(" * @param argv the command line, contains the filenames to run"); - println(" * the scanner on."); - println(" */"); - } - - String className = getBaseName(scanner.className); - - println(" public static void main(String argv[]) {"); - println(" if (argv.length == 0) {"); - println(" System.out.println(\"Usage : java "+className+" \");"); - println(" }"); - println(" else {"); - println(" for (int i = 0; i < argv.length; i++) {"); - println(" "+className+" scanner = null;"); - println(" try {"); - println(" scanner = new "+className+"( new java.io.FileReader(argv[i]) );"); - - if ( scanner.standalone ) { - println(" while ( !scanner.zzAtEOF ) scanner."+scanner.functionName+"();"); - } - else if (scanner.cupDebug ) { - println(" while ( !scanner.zzAtEOF ) scanner.debug_"+scanner.functionName+"();"); - } - else { - println(" do {"); - println(" System.out.println(scanner."+scanner.functionName+"());"); - println(" } while (!scanner.zzAtEOF);"); - println(""); - } - - println(" }"); - println(" catch (java.io.FileNotFoundException e) {"); - println(" System.out.println(\"File not found : \\\"\"+argv[i]+\"\\\"\");"); - println(" }"); - println(" catch (java.io.IOException e) {"); - println(" System.out.println(\"IO error scanning file \\\"\"+argv[i]+\"\\\"\");"); - println(" System.out.println(e);"); - println(" }"); - println(" catch (Exception e) {"); - println(" System.out.println(\"Unexpected exception:\");"); - println(" e.printStackTrace();"); - println(" }"); - println(" }"); - println(" }"); - println(" }"); - println(""); - } - - private String zzBufferLAccess(String idx) { - if (Options.sliceAndCharAt) { - return "(zzBufferArrayL != null ? zzBufferArrayL[" + idx + "] : zzBufferL.charAt("+idx+"))"; - } - if (Options.char_at) { - return "zzBufferL.charAt("+idx+")"; - } - return "zzBufferL[" + idx + "]"; - } - - private String zzBufferLLength() { - if (Options.sliceAndCharAt) { - return "(zzBufferArrayL != null ? zzBufferArrayL.length : zzBufferL.length())"; - } - if (Options.char_at) { - return "zzBufferL.length()"; - } - return "zzBufferL.length"; - } - - private void emitNoMatch() { - println(" zzScanError(ZZ_NO_MATCH);"); - } - - private void emitNextInput() { - println(" if (zzCurrentPosL < zzEndReadL)"); - println(" zzInput = " + zzBufferLAccess("zzCurrentPosL++") + ";"); - println(" else if (zzAtEOF) {"); - println(" zzInput = YYEOF;"); - println(" break zzForAction;"); - println(" }"); - println(" else {"); - println(" // store back cached positions"); - println(" zzCurrentPos = zzCurrentPosL;"); - println(" zzMarkedPos = zzMarkedPosL;"); - println(" boolean eof = zzRefill();"); - println(" // get translated positions and possibly new buffer"); - println(" zzCurrentPosL = zzCurrentPos;"); - println(" zzMarkedPosL = zzMarkedPos;"); - println(" zzBufferL = zzBuffer;"); - println(" zzEndReadL = zzEndRead;"); - println(" if (eof) {"); - println(" zzInput = YYEOF;"); - println(" break zzForAction;"); - println(" }"); - println(" else {"); - println(" zzInput = " + zzBufferLAccess("zzCurrentPosL++") + ";"); - println(" }"); - println(" }"); - } - - private void emitHeader() { - println("/* The following code was generated by JFlex "+Main.version+" on "+date+" */"); - println(""); - } - - private void emitUserCode() { - if ( scanner.userCode.length() > 0 ) - println(scanner.userCode.toString()); - } - - private void emitClassName() { - if (!endsWithJavadoc(scanner.userCode)) { - String path = inputFile.toString(); - // slashify path (avoid backslash u sequence = unicode escape) - if (File.separatorChar != '/') { - path = path.replace(File.separatorChar, '/'); - } - - println("/**"); - println(" * This class is a scanner generated by "); - println(" * JFlex "+Main.version); - println(" * on "+date+" from the specification file"); - println(" * "+path+""); - println(" */"); - } - - if ( scanner.isPublic ) print("public "); - - if ( scanner.isAbstract) print("abstract "); - - if ( scanner.isFinal ) print("final "); - - print("class "); - print(scanner.className); - - if ( scanner.isExtending != null ) { - print(" extends "); - print(scanner.isExtending); - } - - if ( scanner.isImplementing != null ) { - print(" implements "); - print(scanner.isImplementing); - } - - println(" {"); - } - - /** - * Try to find out if user code ends with a javadoc comment - * - * @param buffer the user code - * @return true if it ends with a javadoc comment - */ - public static boolean endsWithJavadoc(StringBuffer usercode) { - String s = usercode.toString().trim(); - - if (!s.endsWith("*/")) return false; - - // find beginning of javadoc comment - int i = s.lastIndexOf("/**"); - if (i < 0) return false; - - // javadoc comment shouldn't contain a comment end - return s.substring(i,s.length()-2).indexOf("*/") < 0; - } - - - private void emitLexicalStates() { - Enumeration stateNames = scanner.states.names(); - - while ( stateNames.hasMoreElements() ) { - String name = (String) stateNames.nextElement(); - - int num = scanner.states.getNumber(name).intValue(); - - println(" "+visibility+" static final int "+name+" = "+2*num+";"); - } - - // can't quite get rid of the indirection, even for non-bol lex states: - // their DFA states might be the same, but their EOF actions might be different - // (see bug #1540228) - println(""); - println(" /**"); - println(" * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l"); - println(" * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l"); - println(" * at the beginning of a line"); - println(" * l is of the form l = 2*k, k a non negative integer"); - println(" */"); - println(" private static final int ZZ_LEXSTATE[] = { "); - - int i, j = 0; - print(" "); - - for (i = 0; i < 2*dfa.numLexStates-1; i++) { - print( dfa.entryState[i], 2 ); - - print(", "); - - if (++j >= 16) { - println(); - print(" "); - j = 0; - } - } - - println( dfa.entryState[i] ); - println(" };"); - } - - private void emitDynamicInit() { - int count = 0; - int value = dfa.table[0][0]; - - println(" /** "); - println(" * The transition table of the DFA"); - println(" */"); - - CountEmitter e = new CountEmitter("Trans"); - e.setValTranslation(+1); // allow vals in [-1, 0xFFFE] - e.emitInit(); - - for (int i = 0; i < dfa.numStates; i++) { - if ( !rowKilled[i] ) { - for (int c = 0; c < dfa.numInput; c++) { - if ( !colKilled[c] ) { - if (dfa.table[i][c] == value) { - count++; - } - else { - e.emit(count, value); - - count = 1; - value = dfa.table[i][c]; - } - } - } - } - } - - e.emit(count, value); - e.emitUnpack(); - - println(e.toString()); - } - - - private void emitCharMapInitFunction() { - - CharClasses cl = parser.getCharClasses(); - - if ( cl.getMaxCharCode() < 256 ) return; - - println(""); - println(" /** "); - println(" * Unpacks the compressed character translation table."); - println(" *"); - println(" * @param packed the packed character translation table"); - println(" * @return the unpacked character translation table"); - println(" */"); - println(" private static char [] zzUnpackCMap(String packed) {"); - println(" char [] map = new char[0x10000];"); - println(" int i = 0; /* index in packed string */"); - println(" int j = 0; /* index in unpacked array */"); - println(" while (i < "+2*intervals.length+") {"); - println(" int count = packed.charAt(i++);"); - println(" char value = packed.charAt(i++);"); - println(" do map[j++] = value; while (--count > 0);"); - println(" }"); - println(" return map;"); - println(" }"); - } - - private void emitZZTrans() { - - int i,c; - int n = 0; - - println(" /** "); - println(" * The transition table of the DFA"); - println(" */"); - println(" private static final int ZZ_TRANS [] = {"); - - print(" "); - for (i = 0; i < dfa.numStates; i++) { - - if ( !rowKilled[i] ) { - for (c = 0; c < dfa.numInput; c++) { - if ( !colKilled[c] ) { - if (n >= 10) { - println(); - print(" "); - n = 0; - } - print( dfa.table[i][c] ); - if (i != dfa.numStates-1 || c != dfa.numInput-1) - print( ", "); - n++; - } - } - } - } - - println(); - println(" };"); - } - - private void emitCharMapArrayUnPacked() { - - CharClasses cl = parser.getCharClasses(); - - println(""); - println(" /** "); - println(" * Translates characters to character classes"); - println(" */"); - println(" private static final char [] ZZ_CMAP = {"); - - int n = 0; // numbers of entries in current line - print(" "); - - int max = cl.getMaxCharCode(); - - // not very efficient, but good enough for <= 255 characters - for (char c = 0; c <= max; c++) { - print(colMap[cl.getClassCode(c)],2); - - if (c < max) { - print(", "); - if ( ++n >= 16 ) { - println(); - print(" "); - n = 0; - } - } - } - - println(); - println(" };"); - println(); - } - - private void emitCharMapArray() { - CharClasses cl = parser.getCharClasses(); - - if ( cl.getMaxCharCode() < 256 ) { - emitCharMapArrayUnPacked(); - return; - } - - // ignores cl.getMaxCharCode(), emits all intervals instead - - intervals = cl.getIntervals(); - - println(""); - println(" /** "); - println(" * Translates characters to character classes"); - println(" */"); - println(" private static final String ZZ_CMAP_PACKED = "); - - int n = 0; // numbers of entries in current line - print(" \""); - - int i = 0; - int count, value; - while ( i < intervals.length ) { - count = intervals[i].end-intervals[i].start+1; - value = colMap[intervals[i].charClass]; - - // count could be >= 0x10000 - while (count > 0xFFFF) { - printUC(0xFFFF); - printUC(value); - count -= 0xFFFF; - n++; - } - - printUC(count); - printUC(value); - - if (i < intervals.length-1) { - if ( ++n >= 10 ) { - println("\"+"); - print(" \""); - n = 0; - } - } - - i++; - } - - println("\";"); - println(); - - println(" /** "); - println(" * Translates characters to character classes"); - println(" */"); - println(" private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);"); - println(); - } - - - /** - * Print number as octal/unicode escaped string character. - * - * @param c the value to print - * @prec 0 <= c <= 0xFFFF - */ - private void printUC(int c) { - if (c > 255) { - out.print("\\u"); - if (c < 0x1000) out.print("0"); - out.print(Integer.toHexString(c)); - } - else { - out.print("\\"); - out.print(Integer.toOctalString(c)); - } - } - - - private void emitRowMapArray() { - println(""); - println(" /** "); - println(" * Translates a state to a row index in the transition table"); - println(" */"); - - HiLowEmitter e = new HiLowEmitter("RowMap"); - e.emitInit(); - for (int i = 0; i < dfa.numStates; i++) { - e.emit(rowMap[i]*numCols); - } - e.emitUnpack(); - println(e.toString()); - } - - - private void emitAttributes() { - println(" /**"); - println(" * ZZ_ATTRIBUTE[aState] contains the attributes of state aState"); - println(" */"); - - CountEmitter e = new CountEmitter("Attribute"); - e.emitInit(); - - int count = 1; - int value = 0; - if ( dfa.isFinal[0] ) value = FINAL; - if ( !isTransition[0] ) value|= NOLOOK; - - for (int i = 1; i < dfa.numStates; i++) { - int attribute = 0; - if ( dfa.isFinal[i] ) attribute = FINAL; - if ( !isTransition[i] ) attribute|= NOLOOK; - - if (value == attribute) { - count++; - } - else { - e.emit(count, value); - count = 1; - value = attribute; - } - } - - e.emit(count, value); - e.emitUnpack(); - - println(e.toString()); - } - - - private void emitClassCode() { - if ( scanner.eofCode != null ) { - println(" /** denotes if the user-EOF-code has already been executed */"); - println(" private boolean zzEOFDone;"); - println(""); - } - - if ( scanner.classCode != null ) { - println(" /* user code: */"); - println(scanner.classCode); - } - } - - private void emitConstructorDecl() { - emitConstructorDecl(true); - - if ((scanner.standalone || scanner.debugOption) && - scanner.ctorArgs.size() > 0) { - Out.warning(ErrorMessages.get(ErrorMessages.CTOR_DEBUG)); - println(); - emitConstructorDecl(false); - } - } - - private void emitConstructorDecl(boolean printCtorArgs) { - println(" /**"); - println(" * Creates a new scanner"); - if (scanner.emitInputStreamCtor) { - println(" * There is also a java.io.InputStream version of this constructor."); - } - println(" *"); - println(" * @param in the java.io.Reader to read input from."); - println(" */"); - String warn = - "// WARNING: this is a default constructor for " + - "debug/standalone only. Has no custom parameters or init code."; - - if (!printCtorArgs) println(warn); - - print(" "); - - if ( scanner.isPublic ) print("public "); - print( getBaseName(scanner.className) ); - print("(java.io.Reader in"); - if (printCtorArgs) emitCtorArgs(); - print(")"); - - if ( scanner.initThrow != null && printCtorArgs) { - print(" throws "); - print( scanner.initThrow ); - } - - println(" {"); - - if ( scanner.initCode != null && printCtorArgs) { - print(" "); - print( scanner.initCode ); - } - - println(" this.zzReader = in;"); - - println(" }"); - println(); - - - if (scanner.emitInputStreamCtor) { - println(" /**"); - println(" * Creates a new scanner."); - println(" * There is also java.io.Reader version of this constructor."); - println(" *"); - println(" * @param in the java.io.Inputstream to read input from."); - println(" */"); - if (!printCtorArgs) println(warn); - - print(" "); - if (scanner.isPublic) print("public "); - print(getBaseName(scanner.className)); - print("(java.io.InputStream in"); - if (printCtorArgs) emitCtorArgs(); - print(")"); - - if (scanner.initThrow != null && printCtorArgs) { - print(" throws "); - print(scanner.initThrow); - } - - println(" {"); - - print(" this(new java.io.InputStreamReader(in)"); - if (printCtorArgs) { - for (int i = 0; i < scanner.ctorArgs.size(); i++) { - print(", " + scanner.ctorArgs.elementAt(i)); - } - } - println(");"); - - println(" }"); - } - } - - private void emitCtorArgs() { - for (int i = 0; i < scanner.ctorArgs.size(); i++) { - print(", "+scanner.ctorTypes.elementAt(i)); - print(" "+scanner.ctorArgs.elementAt(i)); - } - } - - private void emitDoEOF() { - if ( scanner.eofCode == null ) return; - - println(" /**"); - println(" * Contains user EOF-code, which will be executed exactly once,"); - println(" * when the end of file is reached"); - println(" */"); - - print(" private void zzDoEOF()"); - - if ( scanner.eofThrow != null ) { - print(" throws "); - print(scanner.eofThrow); - } - - println(" {"); - - println(" if (!zzEOFDone) {"); - println(" zzEOFDone = true;"); - println(" "+scanner.eofCode ); - println(" }"); - println(" }"); - println(""); - println(""); - } - - private void emitLexFunctHeader() { - - if (scanner.cupCompatible) { - // force public, because we have to implement java_cup.runtime.Symbol - print(" public "); - } - else { - print(" "+visibility+" "); - } - - if ( scanner.tokenType == null ) { - if ( scanner.isInteger ) - print( "int" ); - else - if ( scanner.isIntWrap ) - print( "Integer" ); - else - print( "Yytoken" ); - } - else - print( scanner.tokenType ); - - print(" "); - - print(scanner.functionName); - - print("() throws java.io.IOException"); - - if ( scanner.lexThrow != null ) { - print(", "); - print(scanner.lexThrow); - } - - if ( scanner.scanErrorException != null ) { - print(", "); - print(scanner.scanErrorException); - } - - println(" {"); - - skel.emitNext(); - - if ( scanner.useRowMap ) { - println(" int [] zzTransL = ZZ_TRANS;"); - println(" int [] zzRowMapL = ZZ_ROWMAP;"); - println(" int [] zzAttrL = ZZ_ATTRIBUTE;"); - - } - - skel.emitNext(); - - if ( scanner.charCount ) { - println(" yychar+= zzMarkedPosL-zzStartRead;"); - println(""); - } - - if ( scanner.lineCount || scanner.columnCount ) { - println(" boolean zzR = false;"); - println(" for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;"); - println(" zzCurrentPosL++) {"); - println(" switch (" + zzBufferLAccess("zzCurrentPosL") + ") {"); - println(" case '\\u000B':"); - println(" case '\\u000C':"); - println(" case '\\u0085':"); - println(" case '\\u2028':"); - println(" case '\\u2029':"); - if ( scanner.lineCount ) - println(" yyline++;"); - if ( scanner.columnCount ) - println(" yycolumn = 0;"); - println(" zzR = false;"); - println(" break;"); - println(" case '\\r':"); - if ( scanner.lineCount ) - println(" yyline++;"); - if ( scanner.columnCount ) - println(" yycolumn = 0;"); - println(" zzR = true;"); - println(" break;"); - println(" case '\\n':"); - println(" if (zzR)"); - println(" zzR = false;"); - println(" else {"); - if ( scanner.lineCount ) - println(" yyline++;"); - if ( scanner.columnCount ) - println(" yycolumn = 0;"); - println(" }"); - println(" break;"); - println(" default:"); - println(" zzR = false;"); - if ( scanner.columnCount ) - println(" yycolumn++;"); - println(" }"); - println(" }"); - println(); - - if ( scanner.lineCount ) { - println(" if (zzR) {"); - println(" // peek one character ahead if it is \\n (if we have counted one line too much)"); - println(" boolean zzPeek;"); - println(" if (zzMarkedPosL < zzEndReadL)"); - println(" zzPeek = " + zzBufferLAccess("zzMarkedPosL") + " == '\\n';"); - println(" else if (zzAtEOF)"); - println(" zzPeek = false;"); - println(" else {"); - println(" boolean eof = zzRefill();"); - println(" zzEndReadL = zzEndRead;"); - println(" zzMarkedPosL = zzMarkedPos;"); - println(" zzBufferL = zzBuffer;"); - println(" if (eof) "); - println(" zzPeek = false;"); - println(" else "); - println(" zzPeek = " + zzBufferLAccess("zzMarkedPosL") + " == '\\n';"); - println(" }"); - println(" if (zzPeek) yyline--;"); - println(" }"); - } - } - - if ( scanner.bolUsed ) { - // zzMarkedPos > zzStartRead <=> last match was not empty - // if match was empty, last value of zzAtBOL can be used - // zzStartRead is always >= 0 - println(" if (zzMarkedPosL > zzStartRead) {"); - println(" switch (" + zzBufferLAccess("zzMarkedPosL-1") + ") {"); - println(" case '\\n':"); - println(" case '\\u000B':"); - println(" case '\\u000C':"); - println(" case '\\u0085':"); - println(" case '\\u2028':"); - println(" case '\\u2029':"); - println(" zzAtBOL = true;"); - println(" break;"); - println(" case '\\r': "); - println(" if (zzMarkedPosL < zzEndReadL)"); - println(" zzAtBOL = " + zzBufferLAccess("zzMarkedPosL") + " != '\\n';"); - println(" else if (zzAtEOF)"); - println(" zzAtBOL = false;"); - println(" else {"); - println(" boolean eof = zzRefill();"); - println(" zzMarkedPosL = zzMarkedPos;"); - println(" zzEndReadL = zzEndRead;"); - println(" zzBufferL = zzBuffer;"); - println(" if (eof) "); - println(" zzAtBOL = false;"); - println(" else "); - println(" zzAtBOL = " + zzBufferLAccess("zzMarkedPosL") + " != '\\n';"); - println(" }"); - println(" break;"); - println(" default:"); - println(" zzAtBOL = false;"); - println(" }"); - println(" }"); - } - - skel.emitNext(); - - if (scanner.bolUsed) { - println(" if (zzAtBOL)"); - println(" zzState = ZZ_LEXSTATE[zzLexicalState+1];"); - println(" else"); - println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); - println(); - } - else { - println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); - println(); - } - - skel.emitNext(); - } - - - private void emitGetRowMapNext() { - println(" int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];"); - println(" if (zzNext == "+DFA.NO_TARGET+") break zzForAction;"); - println(" zzState = zzNext;"); - println(); - - println(" int zzAttributes = zzAttrL[zzState];"); - - println(" if ( (zzAttributes & "+FINAL+") == "+FINAL+" ) {"); - - skel.emitNext(); - - println(" if ( (zzAttributes & "+NOLOOK+") == "+NOLOOK+" ) break zzForAction;"); - - skel.emitNext(); - } - - private void emitTransitionTable() { - transformTransitionTable(); - - println(" zzInput = zzCMapL[zzInput];"); - println(); - - println(" boolean zzIsFinal = false;"); - println(" boolean zzNoLookAhead = false;"); - println(); - - println(" zzForNext: { switch (zzState) {"); - - for (int state = 0; state < dfa.numStates; state++) - if (isTransition[state]) emitState(state); - - println(" default:"); - println(" // if this is ever reached, there is a serious bug in JFlex"); - println(" zzScanError(ZZ_UNKNOWN_ERROR);"); - println(" break;"); - println(" } }"); - println(); - - println(" if ( zzIsFinal ) {"); - - skel.emitNext(); - - println(" if ( zzNoLookAhead ) break zzForAction;"); - - skel.emitNext(); - } - - - /** - * Escapes all " ' \ tabs and newlines - */ - private String escapify(String s) { - StringBuffer result = new StringBuffer(s.length()*2); - - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - switch (c) { - case '\'': result.append("\\\'"); break; - case '\"': result.append("\\\""); break; - case '\\': result.append("\\\\"); break; - case '\t': result.append("\\t"); break; - case '\r': if (i+1 == s.length() || s.charAt(i+1) != '\n') result.append("\"+ZZ_NL+\""); - break; - case '\n': result.append("\"+ZZ_NL+\""); break; - default: result.append(c); - } - } - - return result.toString(); - } - - public void emitActionTable() { - int lastAction = 1; - int count = 0; - int value = 0; - - println(" /** "); - println(" * Translates DFA states to action switch labels."); - println(" */"); - CountEmitter e = new CountEmitter("Action"); - e.emitInit(); - - for (int i = 0; i < dfa.numStates; i++) { - int newVal = 0; - if ( dfa.isFinal[i] ) { - Action action = dfa.action[i]; - if (action.isEmittable()) { - Integer stored = (Integer) actionTable.get(action); - if ( stored == null ) { - stored = new Integer(lastAction++); - actionTable.put(action, stored); - } - newVal = stored.intValue(); - } - } - - if (value == newVal) { - count++; - } - else { - if (count > 0) e.emit(count,value); - count = 1; - value = newVal; - } - } - - if (count > 0) e.emit(count,value); - - e.emitUnpack(); - println(e.toString()); - } - - private void emitActions() { - println(" switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {"); - - int i = actionTable.size()+1; - Enumeration actions = actionTable.keys(); - while ( actions.hasMoreElements() ) { - Action action = (Action) actions.nextElement(); - int label = ((Integer) actionTable.get(action)).intValue(); - - println(" case "+label+": "); - - if (action.lookAhead() == Action.FIXED_BASE) { - println(" // lookahead expression with fixed base length"); - println(" zzMarkedPos = zzStartRead + "+action.getLookLength()+";"); - } - - if (action.lookAhead() == Action.FIXED_LOOK || - action.lookAhead() == Action.FINITE_CHOICE) { - println(" // lookahead expression with fixed lookahead length"); - println(" yypushback("+action.getLookLength()+");"); - } - - if (action.lookAhead() == Action.GENERAL_LOOK) { - println(" // general lookahead, find correct zzMarkedPos"); - println(" { int zzFState = "+dfa.entryState[action.getEntryState()]+";"); - println(" int zzFPos = zzStartRead;"); - println(" if (zzFin.length <= " + zzBufferLLength() + ") { zzFin = new boolean[" + zzBufferLLength() + "+1]; }"); - println(" boolean zzFinL[] = zzFin;"); - println(" while (zzFState != -1 && zzFPos < zzMarkedPos) {"); - println(" zzFinL[zzFPos] = ((zzAttrL[zzFState] & 1) == 1);"); - println(" zzInput = " + zzBufferLAccess("zzFPos++") + ";"); - println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); - println(" }"); - println(" if (zzFState != -1) { zzFinL[zzFPos++] = ((zzAttrL[zzFState] & 1) == 1); } "); - println(" while (zzFPos <= zzMarkedPos) {"); - println(" zzFinL[zzFPos++] = false;"); - println(" }"); - println(); - println(" zzFState = "+dfa.entryState[action.getEntryState()+1]+";"); - println(" zzFPos = zzMarkedPos;"); - println(" while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {"); - println(" zzInput = " + zzBufferLAccess("--zzFPos") + ";"); - println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); - println(" };"); - println(" zzMarkedPos = zzFPos;"); - println(" }"); - } - - if ( scanner.debugOption ) { - print(" System.out.println("); - if ( scanner.lineCount ) - print("\"line: \"+(yyline+1)+\" \"+"); - if ( scanner.columnCount ) - print("\"col: \"+(yycolumn+1)+\" \"+"); - println("\"match: --\"+yytext()+\"--\");"); - print(" System.out.println(\"action ["+action.priority+"] { "); - print(escapify(action.content)); - println(" }\");"); - } - - println(" { "+action.content); - println(" }"); - println(" case "+(i++)+": break;"); - } - } - - private void emitEOFVal() { - EOFActions eofActions = parser.getEOFActions(); - - if ( scanner.eofCode != null ) - println(" zzDoEOF();"); - - if ( eofActions.numActions() > 0 ) { - println(" switch (zzLexicalState) {"); - - Enumeration stateNames = scanner.states.names(); - - // record lex states already emitted: - Hashtable used = new Hashtable(); - - // pick a start value for break case labels. - // must be larger than any value of a lex state: - int last = dfa.numStates; - - while ( stateNames.hasMoreElements() ) { - String name = (String) stateNames.nextElement(); - int num = scanner.states.getNumber(name).intValue(); - Action action = eofActions.getAction(num); - - if (action != null) { - println(" case "+name+": {"); - if ( scanner.debugOption ) { - print(" System.out.println("); - if ( scanner.lineCount ) - print("\"line: \"+(yyline+1)+\" \"+"); - if ( scanner.columnCount ) - print("\"col: \"+(yycolumn+1)+\" \"+"); - println("\"match: <>\");"); - print(" System.out.println(\"action ["+action.priority+"] { "); - print(escapify(action.content)); - println(" }\");"); - } - println(" "+action.content); - println(" }"); - println(" case "+(++last)+": break;"); - } - } - - println(" default:"); - } - - Action defaultAction = eofActions.getDefault(); - - if (defaultAction != null) { - println(" {"); - if ( scanner.debugOption ) { - print(" System.out.println("); - if ( scanner.lineCount ) - print("\"line: \"+(yyline+1)+\" \"+"); - if ( scanner.columnCount ) - print("\"col: \"+(yycolumn+1)+\" \"+"); - println("\"match: <>\");"); - print(" System.out.println(\"action ["+defaultAction.priority+"] { "); - print(escapify(defaultAction.content)); - println(" }\");"); - } - println(" " + defaultAction.content); - println(" }"); - } - else if ( scanner.eofVal != null ) - println(" { " + scanner.eofVal + " }"); - else if ( scanner.isInteger ) { - if ( scanner.tokenType != null ) { - Out.error(ErrorMessages.INT_AND_TYPE); - throw new GeneratorException(); - } - println(" return YYEOF;"); - } - else - println(" return null;"); - - if (eofActions.numActions() > 0) - println(" }"); - } - - private void emitState(int state) { - - println(" case "+state+":"); - println(" switch (zzInput) {"); - - int defaultTransition = getDefaultTransition(state); - - for (int next = 0; next < dfa.numStates; next++) { - - if ( next != defaultTransition && table[state][next] != null ) { - emitTransition(state, next); - } - } - - if ( defaultTransition != DFA.NO_TARGET && noTarget[state] != null ) { - emitTransition(state, DFA.NO_TARGET); - } - - emitDefaultTransition(state, defaultTransition); - - println(" }"); - println(""); - } - - private void emitTransition(int state, int nextState) { - - CharSetEnumerator chars; - - if (nextState != DFA.NO_TARGET) - chars = table[state][nextState].characters(); - else - chars = noTarget[state].characters(); - - print(" case "); - print(chars.nextElement()); - print(": "); - - while ( chars.hasMoreElements() ) { - println(); - print(" case "); - print(chars.nextElement()); - print(": "); - } - - if ( nextState != DFA.NO_TARGET ) { - if ( dfa.isFinal[nextState] ) - print("zzIsFinal = true; "); - - if ( !isTransition[nextState] ) - print("zzNoLookAhead = true; "); - - if ( nextState == state ) - println("break zzForNext;"); - else - println("zzState = "+nextState+"; break zzForNext;"); - } - else - println("break zzForAction;"); - } - - private void emitDefaultTransition(int state, int nextState) { - print(" default: "); - - if ( nextState != DFA.NO_TARGET ) { - if ( dfa.isFinal[nextState] ) - print("zzIsFinal = true; "); - - if ( !isTransition[nextState] ) - print("zzNoLookAhead = true; "); - - if ( nextState == state ) - println("break zzForNext;"); - else - println("zzState = "+nextState+"; break zzForNext;"); - } - else - println( "break zzForAction;" ); - } - - private int getDefaultTransition(int state) { - int max = 0; - - for (int i = 0; i < dfa.numStates; i++) { - if ( table[state][max] == null ) - max = i; - else - if ( table[state][i] != null && table[state][max].size() < table[state][i].size() ) - max = i; - } - - if ( table[state][max] == null ) return DFA.NO_TARGET; - if ( noTarget[state] == null ) return max; - - if ( table[state][max].size() < noTarget[state].size() ) - max = DFA.NO_TARGET; - - return max; - } - - // for switch statement: - private void transformTransitionTable() { - - int numInput = parser.getCharClasses().getNumClasses()+1; - - int i; - char j; - - table = new CharSet[dfa.numStates][dfa.numStates]; - noTarget = new CharSet[dfa.numStates]; - - for (i = 0; i < dfa.numStates; i++) - for (j = 0; j < dfa.numInput; j++) { - - int nextState = dfa.table[i][j]; - - if ( nextState == DFA.NO_TARGET ) { - if ( noTarget[i] == null ) - noTarget[i] = new CharSet(numInput, colMap[j]); - else - noTarget[i].add(colMap[j]); - } - else { - if ( table[i][nextState] == null ) - table[i][nextState] = new CharSet(numInput, colMap[j]); - else - table[i][nextState].add(colMap[j]); - } - } - } - - private void findActionStates() { - isTransition = new boolean [dfa.numStates]; - - for (int i = 0; i < dfa.numStates; i++) { - char j = 0; - while ( !isTransition[i] && j < dfa.numInput ) - isTransition[i] = dfa.table[i][j++] != DFA.NO_TARGET; - } - } - - - private void reduceColumns() { - colMap = new int [dfa.numInput]; - colKilled = new boolean [dfa.numInput]; - - int i,j,k; - int translate = 0; - boolean equal; - - numCols = dfa.numInput; - - for (i = 0; i < dfa.numInput; i++) { - - colMap[i] = i-translate; - - for (j = 0; j < i; j++) { - - // test for equality: - k = -1; - equal = true; - while (equal && ++k < dfa.numStates) - equal = dfa.table[k][i] == dfa.table[k][j]; - - if (equal) { - translate++; - colMap[i] = colMap[j]; - colKilled[i] = true; - numCols--; - break; - } // if - } // for j - } // for i - } - - private void reduceRows() { - rowMap = new int [dfa.numStates]; - rowKilled = new boolean [dfa.numStates]; - - int i,j,k; - int translate = 0; - boolean equal; - - numRows = dfa.numStates; - - // i is the state to add to the new table - for (i = 0; i < dfa.numStates; i++) { - - rowMap[i] = i-translate; - - // check if state i can be removed (i.e. already - // exists in entries 0..i-1) - for (j = 0; j < i; j++) { - - // test for equality: - k = -1; - equal = true; - while (equal && ++k < dfa.numInput) - equal = dfa.table[i][k] == dfa.table[j][k]; - - if (equal) { - translate++; - rowMap[i] = rowMap[j]; - rowKilled[i] = true; - numRows--; - break; - } // if - } // for j - } // for i - - } - - - /** - * Set up EOF code section according to scanner.eofcode - */ - private void setupEOFCode() { - if (scanner.eofclose) { - scanner.eofCode = LexScan.conc(scanner.eofCode, " yyclose();"); - scanner.eofThrow = LexScan.concExc(scanner.eofThrow, "java.io.IOException"); - } - } - - - /** - * Main Emitter method. - */ - public void emit() { - - setupEOFCode(); - - if (scanner.functionName == null) - scanner.functionName = "yylex"; - - reduceColumns(); - findActionStates(); - - emitHeader(); - emitUserCode(); - emitClassName(); - - skel.emitNext(); - - println(" private static final int ZZ_BUFFERSIZE = "+scanner.bufferSize+";"); - - if (scanner.debugOption) { - println(" private static final String ZZ_NL = System.getProperty(\"line.separator\");"); - } - - skel.emitNext(); - - emitLexicalStates(); - - emitCharMapArray(); - - emitActionTable(); - - if (scanner.useRowMap) { - reduceRows(); - - emitRowMapArray(); - - if (scanner.packed) - emitDynamicInit(); - else - emitZZTrans(); - } - - skel.emitNext(); - - if (scanner.useRowMap) - emitAttributes(); - - skel.emitNext(); - - emitLookBuffer(); - - emitClassCode(); - - skel.emitNext(); - - emitConstructorDecl(); - - emitCharMapInitFunction(); - - skel.emitNext(); - - emitScanError(); - - skel.emitNext(); - - emitDoEOF(); - - skel.emitNext(); - - emitLexFunctHeader(); - - emitNextInput(); - - if (scanner.useRowMap) - emitGetRowMapNext(); - else - emitTransitionTable(); - - skel.emitNext(); - - emitActions(); - - skel.emitNext(); - - emitEOFVal(); - - skel.emitNext(); - - emitNoMatch(); - - skel.emitNext(); - - emitMain(); - - skel.emitNext(); - - out.close(); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/ErrorMessages.java b/tools/lexer/jflex-1.4/src/JFlex/ErrorMessages.java deleted file mode 100644 index 2e5a85c16a37..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/ErrorMessages.java +++ /dev/null @@ -1,149 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software); you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY); without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program); if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - - -/** - * Central class for all kinds of JFlex messages. - * - * [Is not yet used exclusively, but should] - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class ErrorMessages { - private String key; - - /* not final static, because initializing here seems too early - * for OS/2 JDK 1.1.8. See bug 1065521. - */ - private static ResourceBundle resourceBundle = null; - - private ErrorMessages(String key) { - this.key = key; - } - - public static String get(ErrorMessages msg) { - if (resourceBundle == null) { - resourceBundle = ResourceBundle.getBundle("JFlex.Messages"); - } - try { - return resourceBundle.getString(msg.key); - } catch (MissingResourceException e) { - return '!' + msg.key + '!'; - } - } - - public static String get(ErrorMessages msg, String data) { - Object [] args = { data }; - return MessageFormat.format(get(msg),args); - } - - public static String get(ErrorMessages msg, String data1, String data2) { - Object [] args = { data1, data2 }; - return MessageFormat.format(get(msg),args); - } - - public static String get(ErrorMessages msg, int data) { - Object [] args = { new Integer(data) }; - return MessageFormat.format(get(msg),args); - } - - // typesafe enumeration (generated, do not edit) - public static ErrorMessages UNTERMINATED_STR = new ErrorMessages("UNTERMINATED_STR"); - public static ErrorMessages EOF_WO_ACTION = new ErrorMessages("EOF_WO_ACTION"); - public static ErrorMessages EOF_SINGLERULE = new ErrorMessages("EOF_SINGLERULE"); - public static ErrorMessages UNKNOWN_OPTION = new ErrorMessages("UNKNOWN_OPTION"); - public static ErrorMessages UNEXPECTED_CHAR = new ErrorMessages("UNEXPECTED_CHAR"); - public static ErrorMessages UNEXPECTED_NL = new ErrorMessages("UNEXPECTED_NL"); - public static ErrorMessages LEXSTATE_UNDECL = new ErrorMessages("LEXSTATE_UNDECL"); - public static ErrorMessages STATE_IDENT_EXP = new ErrorMessages("STATE_IDENT_EXP"); - public static ErrorMessages REPEAT_ZERO = new ErrorMessages("REPEAT_ZERO"); - public static ErrorMessages REPEAT_GREATER = new ErrorMessages("REPEAT_GREATER"); - public static ErrorMessages REGEXP_EXPECTED = new ErrorMessages("REGEXP_EXPECTED"); - public static ErrorMessages MACRO_UNDECL = new ErrorMessages("MACRO_UNDECL"); - public static ErrorMessages CHARSET_2_SMALL = new ErrorMessages("CHARSET_2_SMALL"); - public static ErrorMessages CS2SMALL_STRING = new ErrorMessages("CS2SMALL_STRING"); - public static ErrorMessages CS2SMALL_CHAR = new ErrorMessages("CS2SMALL_CHAR"); - public static ErrorMessages CHARCLASS_MACRO = new ErrorMessages("CHARCLASS_MACRO"); - public static ErrorMessages UNKNOWN_SYNTAX = new ErrorMessages("UNKNOWN_SYNTAX"); - public static ErrorMessages SYNTAX_ERROR = new ErrorMessages("SYNTAX_ERROR"); - public static ErrorMessages NOT_AT_BOL = new ErrorMessages("NOT_AT_BOL"); - public static ErrorMessages NO_MATCHING_BR = new ErrorMessages("NO_MATCHING_BR"); - public static ErrorMessages EOF_IN_ACTION = new ErrorMessages("EOF_IN_ACTION"); - public static ErrorMessages EOF_IN_COMMENT = new ErrorMessages("EOF_IN_COMMENT"); - public static ErrorMessages EOF_IN_STRING = new ErrorMessages("EOF_IN_STRING"); - public static ErrorMessages EOF_IN_MACROS = new ErrorMessages("EOF_IN_MACROS"); - public static ErrorMessages EOF_IN_STATES = new ErrorMessages("EOF_IN_STATES"); - public static ErrorMessages EOF_IN_REGEXP = new ErrorMessages("EOF_IN_REGEXP"); - public static ErrorMessages UNEXPECTED_EOF = new ErrorMessages("UNEXPECTED_EOF"); - public static ErrorMessages NO_LEX_SPEC = new ErrorMessages("NO_LEX_SPEC"); - public static ErrorMessages NO_LAST_ACTION = new ErrorMessages("NO_LAST_ACTION"); - public static ErrorMessages NO_DIRECTORY = new ErrorMessages("NO_DIRECTORY"); - public static ErrorMessages NO_SKEL_FILE = new ErrorMessages("NO_SKEL_FILE"); - public static ErrorMessages WRONG_SKELETON = new ErrorMessages("WRONG_SKELETON"); - public static ErrorMessages OUT_OF_MEMORY = new ErrorMessages("OUT_OF_MEMORY"); - public static ErrorMessages QUIL_INITTHROW = new ErrorMessages("QUIL_INITTHROW"); - public static ErrorMessages QUIL_EOFTHROW = new ErrorMessages("QUIL_EOFTHROW"); - public static ErrorMessages QUIL_YYLEXTHROW = new ErrorMessages("QUIL_YYLEXTHROW"); - public static ErrorMessages ZERO_STATES = new ErrorMessages("ZERO_STATES"); - public static ErrorMessages NO_BUFFER_SIZE = new ErrorMessages("NO_BUFFER_SIZE"); - public static ErrorMessages NOT_READABLE = new ErrorMessages("NOT_READABLE"); - public static ErrorMessages FILE_CYCLE = new ErrorMessages("FILE_CYCLE"); - public static ErrorMessages FILE_WRITE = new ErrorMessages("FILE_WRITE"); - public static ErrorMessages QUIL_SCANERROR = new ErrorMessages("QUIL_SCANERROR"); - public static ErrorMessages NEVER_MATCH = new ErrorMessages("NEVER_MATCH"); - public static ErrorMessages QUIL_THROW = new ErrorMessages("QUIL_THROW"); - public static ErrorMessages EOL_IN_CHARCLASS = new ErrorMessages("EOL_IN_CHARCLASS"); - public static ErrorMessages QUIL_CUPSYM = new ErrorMessages("QUIL_CUPSYM"); - public static ErrorMessages CUPSYM_AFTER_CUP = new ErrorMessages("CUPSYM_AFTER_CUP"); - public static ErrorMessages ALREADY_RUNNING = new ErrorMessages("ALREADY_RUNNING"); - public static ErrorMessages CANNOT_READ_SKEL = new ErrorMessages("CANNOT_READ_SKEL"); - public static ErrorMessages READING_SKEL = new ErrorMessages("READING_SKEL"); - public static ErrorMessages SKEL_IO_ERROR = new ErrorMessages("SKEL_IO_ERROR"); - public static ErrorMessages SKEL_IO_ERROR_DEFAULT = new ErrorMessages("SKEL_IO_ERROR_DEFAULT"); - public static ErrorMessages READING = new ErrorMessages("READING"); - public static ErrorMessages CANNOT_OPEN = new ErrorMessages("CANNOT_OPEN"); - public static ErrorMessages NFA_IS = new ErrorMessages("NFA_IS"); - public static ErrorMessages NFA_STATES = new ErrorMessages("NFA_STATES"); - public static ErrorMessages DFA_TOOK = new ErrorMessages("DFA_TOOK"); - public static ErrorMessages DFA_IS = new ErrorMessages("DFA_IS"); - public static ErrorMessages MIN_TOOK = new ErrorMessages("MIN_TOOK"); - public static ErrorMessages MIN_DFA_IS = new ErrorMessages("MIN_DFA_IS"); - public static ErrorMessages WRITE_TOOK = new ErrorMessages("WRITE_TOOK"); - public static ErrorMessages TOTAL_TIME = new ErrorMessages("TOTAL_TIME"); - public static ErrorMessages IO_ERROR = new ErrorMessages("IO_ERROR"); - public static ErrorMessages THIS_IS_JFLEX = new ErrorMessages("THIS_IS_JFLEX"); - public static ErrorMessages UNKNOWN_COMMANDLINE = new ErrorMessages("UNKNOWN_COMMANDLINE"); - public static ErrorMessages MACRO_CYCLE = new ErrorMessages("MACRO_CYCLE"); - public static ErrorMessages MACRO_DEF_MISSING = new ErrorMessages("MACRO_DEF_MISSING"); - public static ErrorMessages PARSING_TOOK = new ErrorMessages("PARSING_TOOK"); - public static ErrorMessages NFA_TOOK = new ErrorMessages("NFA_TOOK"); - public static ErrorMessages LOOKAHEAD_NEEDS_ACTION = new ErrorMessages("LOOKAHEAD_NEEDS_ACTION"); - public static ErrorMessages EMPTY_MATCH = new ErrorMessages("EMPTY_MATCH"); - public static ErrorMessages CTOR_ARG = new ErrorMessages("CTOR_ARG"); - public static ErrorMessages CTOR_DEBUG = new ErrorMessages("CTOR_DEBUG"); - public static ErrorMessages INT_AND_TYPE = new ErrorMessages("INT_AND_TYPE"); -} \ No newline at end of file diff --git a/tools/lexer/jflex-1.4/src/JFlex/GeneratorException.java b/tools/lexer/jflex-1.4/src/JFlex/GeneratorException.java deleted file mode 100644 index c98392ef6d42..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/GeneratorException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Thrown when code generation has to be aborted. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class GeneratorException extends RuntimeException { - - public GeneratorException() { - super("Generation aborted"); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/HiLowEmitter.java b/tools/lexer/jflex-1.4/src/JFlex/HiLowEmitter.java deleted file mode 100644 index 9af8c517334b..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/HiLowEmitter.java +++ /dev/null @@ -1,88 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * jflex * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -/** - * HiLowEmitter - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class HiLowEmitter extends PackEmitter { - - /** number of entries in expanded array */ - private int numEntries; - - /** - * Create new emitter for values in [0, 0xFFFFFFFF] using hi/low encoding. - * - * @param name the name of the generated array - */ - public HiLowEmitter(String name) { - super(name); - } - - /** - * Emits hi/low pair unpacking code for the generated array. - * - * @see JFlex.PackEmitter#emitUnPack() - */ - public void emitUnpack() { - // close last string chunk: - println("\";"); - nl(); - println(" private static int [] zzUnpack"+name+"() {"); - println(" int [] result = new int["+numEntries+"];"); - println(" int offset = 0;"); - - for (int i = 0; i < chunks; i++) { - println(" offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);"); - } - - println(" return result;"); - println(" }"); - - nl(); - println(" private static int zzUnpack"+name+"(String packed, int offset, int [] result) {"); - println(" int i = 0; /* index in packed string */"); - println(" int j = offset; /* index in unpacked array */"); - println(" int l = packed.length();"); - println(" while (i < l) {"); - println(" int high = packed.charAt(i++) << 16;"); - println(" result[j++] = high | packed.charAt(i++);"); - println(" }"); - println(" return j;"); - println(" }"); - } - - /** - * Emit one value using two characters. - * - * @param val the value to emit - * @prec 0 <= val <= 0xFFFFFFFF - */ - public void emit(int val) { - numEntries+= 1; - breaks(); - emitUC(val >> 16); - emitUC(val & 0xFFFF); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/IntCharSet.java b/tools/lexer/jflex-1.4/src/JFlex/IntCharSet.java deleted file mode 100644 index 8f4a13ddef91..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/IntCharSet.java +++ /dev/null @@ -1,411 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - - -/** - * CharSet implemented with intervalls - * - * [fixme: optimizations possible] - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class IntCharSet { - - private final static boolean DEBUG = false; - - /* invariant: all intervals are disjoint, ordered */ - private Vector intervalls; - private int pos; - - public IntCharSet() { - this.intervalls = new Vector(); - } - - public IntCharSet(char c) { - this(new Interval(c,c)); - } - - public IntCharSet(Interval intervall) { - this(); - intervalls.addElement(intervall); - } - - public IntCharSet(Vector /* Interval */ chars) { - int size = chars.size(); - - this.intervalls = new Vector(size); - - for (int i = 0; i < size; i++) - add( (Interval) chars.elementAt(i) ); - } - - - - - /** - * returns the index of the intervall that contains - * the character c, -1 if there is no such intevall - * - * @prec: true - * @post: -1 <= return < intervalls.size() && - * (return > -1 --> intervalls[return].contains(c)) - * - * @param c the character - * @return the index of the enclosing interval, -1 if no such interval - */ - private int indexOf(char c) { - int start = 0; - int end = intervalls.size()-1; - - while (start <= end) { - int check = (start+end) / 2; - Interval i = (Interval) intervalls.elementAt(check); - - if (start == end) - return i.contains(c) ? start : -1; - - if (c < i.start) { - end = check-1; - continue; - } - - if (c > i.end) { - start = check+1; - continue; - } - - return check; - } - - return -1; - } - - public IntCharSet add(IntCharSet set) { - for (int i = 0; i < set.intervalls.size(); i++) - add( (Interval) set.intervalls.elementAt(i) ); - return this; - } - - public void add(Interval intervall) { - - int size = intervalls.size(); - - for (int i = 0; i < size; i++) { - Interval elem = (Interval) intervalls.elementAt(i); - - if ( elem.end+1 < intervall.start ) continue; - - if ( elem.contains(intervall) ) return; - - if ( elem.start > intervall.end+1 ) { - intervalls.insertElementAt(new Interval(intervall), i); - return; - } - - if (intervall.start < elem.start) - elem.start = intervall.start; - - if (intervall.end <= elem.end) - return; - - elem.end = intervall.end; - - i++; - // delete all x with x.contains( intervall.end ) - while (i < size) { - Interval x = (Interval) intervalls.elementAt(i); - if (x.start > elem.end+1) return; - - elem.end = x.end; - intervalls.removeElementAt(i); - size--; - } - return; - } - - intervalls.addElement(new Interval(intervall)); - } - - public void add(char c) { - int size = intervalls.size(); - - for (int i = 0; i < size; i++) { - Interval elem = (Interval) intervalls.elementAt(i); - if (elem.end+1 < c) continue; - - if (elem.contains(c)) return; // already there, nothing to do - - // assert(elem.end+1 >= c && (elem.start > c || elem.end < c)); - - if (elem.start > c+1) { - intervalls.insertElementAt(new Interval(c,c), i); - return; - } - - // assert(elem.end+1 >= c && elem.start <= c+1 && (elem.start > c || elem.end < c)); - - if (c+1 == elem.start) { - elem.start = c; - return; - } - - // assert(elem.end+1 == c); - elem.end = c; - - // merge with next interval if it contains c - if (i+1 >= size) return; - Interval x = (Interval) intervalls.elementAt(i+1); - if (x.start <= c+1) { - elem.end = x.end; - intervalls.removeElementAt(i+1); - } - return; - } - - // end reached but nothing found -> append at end - intervalls.addElement(new Interval(c,c)); - } - - - public boolean contains(char singleChar) { - return indexOf(singleChar) >= 0; - } - - - /** - * o instanceof Interval - */ - public boolean equals(Object o) { - IntCharSet set = (IntCharSet) o; - if ( intervalls.size() != set.intervalls.size() ) return false; - - for (int i = 0; i < intervalls.size(); i++) { - if ( !intervalls.elementAt(i).equals( set.intervalls.elementAt(i)) ) - return false; - } - - return true; - } - - private char min(char a, char b) { - return a <= b ? a : b; - } - - private char max(char a, char b) { - return a >= b ? a : b; - } - - /* intersection */ - public IntCharSet and(IntCharSet set) { - if (DEBUG) { - Out.dump("intersection"); - Out.dump("this : "+this); - Out.dump("other : "+set); - } - - IntCharSet result = new IntCharSet(); - - int i = 0; // index in this.intervalls - int j = 0; // index in set.intervalls - - int size = intervalls.size(); - int setSize = set.intervalls.size(); - - while (i < size && j < setSize) { - Interval x = (Interval) this.intervalls.elementAt(i); - Interval y = (Interval) set.intervalls.elementAt(j); - - if (x.end < y.start) { - i++; - continue; - } - - if (y.end < x.start) { - j++; - continue; - } - - result.intervalls.addElement( - new Interval( - max(x.start, y.start), - min(x.end, y.end) - ) - ); - - if (x.end >= y.end) j++; - if (y.end >= x.end) i++; - } - - if (DEBUG) { - Out.dump("result: "+result); - } - - return result; - } - - /* complement */ - /* prec: this.contains(set), set != null */ - public void sub(IntCharSet set) { - if (DEBUG) { - Out.dump("complement"); - Out.dump("this : "+this); - Out.dump("other : "+set); - } - - int i = 0; // index in this.intervalls - int j = 0; // index in set.intervalls - - int setSize = set.intervalls.size(); - - while (i < intervalls.size() && j < setSize) { - Interval x = (Interval) this.intervalls.elementAt(i); - Interval y = (Interval) set.intervalls.elementAt(j); - - if (DEBUG) { - Out.dump("this : "+this); - Out.dump("this ["+i+"] : "+x); - Out.dump("other ["+j+"] : "+y); - } - - if (x.end < y.start) { - i++; - continue; - } - - if (y.end < x.start) { - j++; - continue; - } - - // x.end >= y.start && y.end >= x.start -> - // x.end <= y.end && x.start >= y.start (prec) - - if ( x.start == y.start && x.end == y.end ) { - intervalls.removeElementAt(i); - j++; - continue; - } - - // x.end <= y.end && x.start >= y.start && - // (x.end < y.end || x.start > y.start) -> - // x.start < x.end - - if ( x.start == y.start ) { - x.start = (char) (y.end+1); - j++; - continue; - } - - if ( x.end == y.end ) { - x.end = (char) (y.start-1); - i++; - j++; - continue; - } - - intervalls.insertElementAt(new Interval(x.start, (char) (y.start-1)), i); - x.start = (char) (y.end+1); - - i++; - j++; - } - - if (DEBUG) { - Out.dump("result: "+this); - } - } - - public boolean containsElements() { - return intervalls.size() > 0; - } - - public int numIntervalls() { - return intervalls.size(); - } - - // beware: depends on caller protocol, single user only - public Interval getNext() { - if (pos == intervalls.size()) pos = 0; - return (Interval) intervalls.elementAt(pos++); - } - - /** - * Create a caseless version of this charset. - *

- * The caseless version contains all characters of this char set, - * and additionally all lower/upper/title case variants of the - * characters in this set. - * - * @return a caseless copy of this set - */ - public IntCharSet getCaseless() { - IntCharSet n = copy(); - - int size = intervalls.size(); - for (int i=0; i < size; i++) { - Interval elem = (Interval) intervalls.elementAt(i); - for (char c = elem.start; c <= elem.end; c++) { - n.add(Character.toLowerCase(c)); - n.add(Character.toUpperCase(c)); - n.add(Character.toTitleCase(c)); - } - } - - return n; - } - - - /** - * Make a string representation of this char set. - * - * @return a string representing this char set. - */ - public String toString() { - StringBuffer result = new StringBuffer("{ "); - - for (int i = 0; i < intervalls.size(); i++) - result.append( intervalls.elementAt(i) ); - - result.append(" }"); - - return result.toString(); - } - - - /** - * Return a (deep) copy of this char set - * - * @return the copy - */ - public IntCharSet copy() { - IntCharSet result = new IntCharSet(); - int size = intervalls.size(); - for (int i=0; i < size; i++) { - Interval iv = ((Interval) intervalls.elementAt(i)).copy(); - result.intervalls.addElement(iv); - } - return result; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/IntPair.java b/tools/lexer/jflex-1.4/src/JFlex/IntPair.java deleted file mode 100644 index 877bd10ce315..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/IntPair.java +++ /dev/null @@ -1,57 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Simple pair of integers. - * - * Used in NFA to represent a partial NFA by its start and end state. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final class IntPair { - - int start; - int end; - - IntPair(int start, int end) { - this.start = start; - this.end = end; - } - - public int hashCode() { - return end + (start << 8); - } - - public boolean equals(Object o) { - if ( o instanceof IntPair ) { - IntPair p = (IntPair) o; - return start == p.start && end == p.end; - } - return false; - } - - public String toString() { - return "("+start+","+end+")"; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Interval.java b/tools/lexer/jflex-1.4/src/JFlex/Interval.java deleted file mode 100644 index 7f52a77576d3..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Interval.java +++ /dev/null @@ -1,163 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * An intervall of characters with basic operations. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class Interval { - - /* start and end of the intervall */ - public char start, end; - - - /** - * Constuct a new intervall from start to end. - * - * @param start first character the intervall should contain - * @param end last character the intervall should contain - */ - public Interval(char start, char end) { - this.start = start; - this.end = end; - } - - - /** - * Copy constructor - */ - public Interval(Interval other) { - this.start = other.start; - this.end = other.end; - } - - - /** - * Return true iff point is contained in this intervall. - * - * @param point the character to check - */ - public boolean contains(char point) { - return start <= point && end >= point; - } - - - /** - * Return true iff this intervall completely contains the - * other one. - * - * @param other the other intervall - */ - public boolean contains(Interval other) { - return this.start <= other.start && this.end >= other.end; - } - - - /** - * Return true if o is an intervall - * with the same borders. - * - * @param o the object to check equality with - */ - public boolean equals(Object o) { - if ( o == this ) return true; - if ( !(o instanceof Interval) ) return false; - - Interval other = (Interval) o; - return other.start == this.start && other.end == this.end; - } - - - /** - * Set a new last character - * - * @param end the new last character of this intervall - */ - public void setEnd(char end) { - this.end = end; - } - - - /** - * Set a new first character - * - * @param start the new first character of this intervall - */ - public void setStart(char start) { - this.start = start; - } - - - /** - * Check wether a character is printable. - * - * @param c the character to check - */ - private static boolean isPrintable(char c) { - // fixme: should make unicode test here - return c > 31 && c < 127; - } - - - /** - * Get a String representation of this intervall. - * - * @return a string "[start-end]" or - * "[start]" (if there is only one character in - * the intervall) where start and - * end are either a number (the character code) - * or something of the from 'a'. - */ - public String toString() { - StringBuffer result = new StringBuffer("["); - - if ( isPrintable(start) ) - result.append("'"+start+"'"); - else - result.append( (int) start ); - - if (start != end) { - result.append("-"); - - if ( isPrintable(end) ) - result.append("'"+end+"'"); - else - result.append( (int) end ); - } - - result.append("]"); - return result.toString(); - } - - - /** - * Make a copy of this interval. - * - * @return the copy - */ - public Interval copy() { - return new Interval(start,end); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/LexParse.cup b/tools/lexer/jflex-1.4/src/JFlex/LexParse.cup deleted file mode 100644 index c67258adc3b5..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/LexParse.cup +++ /dev/null @@ -1,807 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - -/* customizing code */ - -action code {: - - LexScan scanner; - CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF); - RegExps regExps = new RegExps(); - Macros macros = new Macros(); - Integer stateNumber; - Timer t = new Timer(); - EOFActions eofActions = new EOFActions(); - - void fatalError(ErrorMessages message, int line, int col) { - syntaxError(message, line, col); - throw new GeneratorException(); - } - - void fatalError(ErrorMessages message) { - fatalError(message, scanner.currentLine(), -1); - throw new GeneratorException(); - } - - void syntaxError(ErrorMessages message) { - Out.error(scanner.file, message, scanner.currentLine(), -1); - } - - void syntaxError(ErrorMessages message, int line) { - Out.error(scanner.file, message, line, -1); - } - - void syntaxError(ErrorMessages message, int line, int col) { - Out.error(scanner.file, message, line, col); - } - - - private boolean check(int type, char c) { - switch (type) { - case sym.JLETTERCLASS: - return Character.isJavaIdentifierStart(c); - - case sym.JLETTERDIGITCLASS: - return Character.isJavaIdentifierPart(c); - - case sym.LETTERCLASS: - return Character.isLetter(c); - - case sym.DIGITCLASS: - return Character.isDigit(c); - - case sym.UPPERCLASS: - return Character.isUpperCase(c); - - case sym.LOWERCLASS: - return Character.isLowerCase(c); - - case sym.UNICODE_UNASSIGNED: - return Character.getType(c) == Character.UNASSIGNED; - - case sym.UNICODE_UPPERCASE_LETTER: - return Character.getType(c) == Character.UPPERCASE_LETTER; - - case sym.UNICODE_LOWERCASE_LETTER: - return Character.getType(c) == Character.LOWERCASE_LETTER; - - case sym.UNICODE_TITLECASE_LETTER: - return Character.getType(c) == Character.TITLECASE_LETTER; - - case sym.UNICODE_MODIFIER_LETTER: - return Character.getType(c) == Character.MODIFIER_LETTER; - - case sym.UNICODE_OTHER_LETTER: - return Character.getType(c) == Character.OTHER_LETTER; - - case sym.UNICODE_NON_SPACING_MARK: - return Character.getType(c) == Character.NON_SPACING_MARK; - - case sym.UNICODE_ENCLOSING_MARK: - return Character.getType(c) == Character.ENCLOSING_MARK; - - case sym.UNICODE_COMBINING_SPACING_MARK: - return Character.getType(c) == Character.COMBINING_SPACING_MARK; - - case sym.UNICODE_DECIMAL_DIGIT_NUMBER: - return Character.getType(c) == Character.DECIMAL_DIGIT_NUMBER; - - case sym.UNICODE_LETTER_NUMBER: - return Character.getType(c) == Character.LETTER_NUMBER; - - case sym.UNICODE_OTHER_NUMBER: - return Character.getType(c) == Character.OTHER_NUMBER; - - case sym.UNICODE_SPACE_SEPARATOR: - return Character.getType(c) == Character.SPACE_SEPARATOR; - - case sym.UNICODE_LINE_SEPARATOR: - return Character.getType(c) == Character.LINE_SEPARATOR; - - case sym.UNICODE_PARAGRAPH_SEPARATOR: - return Character.getType(c) == Character.PARAGRAPH_SEPARATOR; - - case sym.UNICODE_CONTROL: - return Character.getType(c) == Character.CONTROL; - - case sym.UNICODE_FORMAT: - return Character.getType(c) == Character.FORMAT; - - case sym.UNICODE_PRIVATE_USE: - return Character.getType(c) == Character.PRIVATE_USE; - - case sym.UNICODE_SURROGATE: - return Character.getType(c) == Character.SURROGATE; - - case sym.UNICODE_DASH_PUNCTUATION: - return Character.getType(c) == Character.DASH_PUNCTUATION; - - case sym.UNICODE_START_PUNCTUATION: - return Character.getType(c) == Character.START_PUNCTUATION; - - case sym.UNICODE_END_PUNCTUATION: - return Character.getType(c) == Character.END_PUNCTUATION; - - case sym.UNICODE_CONNECTOR_PUNCTUATION: - return Character.getType(c) == Character.CONNECTOR_PUNCTUATION; - - case sym.UNICODE_OTHER_PUNCTUATION: - return Character.getType(c) == Character.OTHER_PUNCTUATION; - - case sym.UNICODE_MATH_SYMBOL: - return Character.getType(c) == Character.MATH_SYMBOL; - - case sym.UNICODE_CURRENCY_SYMBOL: - return Character.getType(c) == Character.CURRENCY_SYMBOL; - - case sym.UNICODE_MODIFIER_SYMBOL: - return Character.getType(c) == Character.MODIFIER_SYMBOL; - - case sym.UNICODE_OTHER_SYMBOL: - return Character.getType(c) == Character.OTHER_SYMBOL; - - case sym.UNICODE_INITIAL_QUOTE_PUNCTUATION: - return Character.getType(c) == Character.INITIAL_QUOTE_PUNCTUATION; - - case sym.UNICODE_FINAL_QUOTE_PUNCTUATION: - return Character.getType(c) == Character.FINAL_QUOTE_PUNCTUATION; - - default: return false; - } - } - - private Vector makePreClass(int type) { - - Vector result = new Vector(); - - char c = 0; - char start = 0; - char last = charClasses.getMaxCharCode(); - - boolean prev, current; - - prev = check(type,'\u0000'); - - for (c = 1; c < last; c++) { - - current = check(type,c); - - if (!prev && current) start = c; - if (prev && !current) { - result.addElement(new Interval(start, (char)(c-1))); - } - - prev = current; - } - - // the last iteration is moved out of the loop to - // avoid an endless loop if last == maxCharCode and - // last+1 == 0 - current = check(type,c); - - if (!prev && current) result.addElement(new Interval(c,c)); - if (prev && current) result.addElement(new Interval(start, c)); - if (prev && !current) result.addElement(new Interval(start, (char)(c-1))); - - return result; - } - - private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) { - - if (n1 <= 0 && n2 <= 0) { - syntaxError(ErrorMessages.REPEAT_ZERO, line, col); - return null; - } - - if (n1 > n2) { - syntaxError(ErrorMessages.REPEAT_GREATER, line, col); - return null; - } - - int i; - RegExp result; - - if (n1 > 0) { - result = r; - n1--; n2--; // we need one concatenation less than the number of expressions to match - } - else { - result = new RegExp1(sym.QUESTION,r); - n2--; - } - - for (i = 0; i < n1; i++) - result = new RegExp2(sym.CONCAT, result, r); - - n2-= n1; - for (i = 0; i < n2; i++) - result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r)); - - return result; - } - - private RegExp makeNL() { - Vector list = new Vector(); - list.addElement(new Interval('\n','\r')); - list.addElement(new Interval('\u0085','\u0085')); - list.addElement(new Interval('\u2028','\u2029')); - - // assumption: line feeds are caseless - charClasses.makeClass(list, false); - charClasses.makeClass('\n', false); - charClasses.makeClass('\r', false); - - RegExp1 c = new RegExp1(sym.CCLASS, list); - Character n = new Character('\n'); - Character r = new Character('\r'); - - return new RegExp2(sym.BAR, - c, - new RegExp2(sym.CONCAT, - new RegExp1(sym.CHAR, r), - new RegExp1(sym.CHAR, n))); - } - -:}; - -parser code {: - public LexScan scanner; - - public LexParse(LexScan scanner) { - super(scanner); - this.scanner = scanner; - } - - public CharClasses getCharClasses() { - return action_obj.charClasses; - } - - public EOFActions getEOFActions() { - return action_obj.eofActions; - } - - public void report_error(String message, Object info) { - if ( info instanceof java_cup.runtime.Symbol ) { - java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info; - - if (s.sym == sym.EOF) - Out.error(ErrorMessages.UNEXPECTED_EOF); - else - Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right); - } - else - Out.error(ErrorMessages.UNKNOWN_SYNTAX); - } - - public void report_fatal_error(String message, Object info) { - // report_error(message, info); - throw new GeneratorException(); - } - -:}; - -init with {: - action_obj.scanner = this.scanner; -:}; - -/* token declarations */ - -terminal OPENBRACKET, CLOSEBRACKET, HAT, DOLLAR, OPENCLASS, - CLOSECLASS, DASH, DELIMITER, EQUALS, COMMA, LESSTHAN, - MORETHAN, LBRACE, RBRACE, ASCII, FULL, UNICODE, REGEXPEND; - -terminal JLETTERCLASS, JLETTERDIGITCLASS, LETTERCLASS, DIGITCLASS, - UPPERCLASS, LOWERCLASS, EOFRULE, NOACTION, LOOKAHEAD, - - UNICODE_UNASSIGNED, UNICODE_UPPERCASE_LETTER, UNICODE_LOWERCASE_LETTER, UNICODE_TITLECASE_LETTER, - UNICODE_MODIFIER_LETTER, UNICODE_OTHER_LETTER, UNICODE_NON_SPACING_MARK, UNICODE_ENCLOSING_MARK, - UNICODE_COMBINING_SPACING_MARK, UNICODE_DECIMAL_DIGIT_NUMBER, UNICODE_LETTER_NUMBER, UNICODE_OTHER_NUMBER, - UNICODE_SPACE_SEPARATOR, UNICODE_LINE_SEPARATOR, UNICODE_PARAGRAPH_SEPARATOR, UNICODE_CONTROL, UNICODE_FORMAT, - UNICODE_PRIVATE_USE, UNICODE_SURROGATE, UNICODE_DASH_PUNCTUATION, UNICODE_START_PUNCTUATION, - UNICODE_END_PUNCTUATION, UNICODE_CONNECTOR_PUNCTUATION, UNICODE_OTHER_PUNCTUATION, UNICODE_MATH_SYMBOL, - UNICODE_CURRENCY_SYMBOL, UNICODE_MODIFIER_SYMBOL, UNICODE_OTHER_SYMBOL, UNICODE_INITIAL_QUOTE_PUNCTUATION, - UNICODE_FINAL_QUOTE_PUNCTUATION; - -terminal Action ACTION; -terminal String IDENT, USERCODE; -terminal Integer REPEAT; - -/* tokens used in RegExp parse tree */ -terminal STAR, PLUS, BAR, QUESTION, POINT, BANG, TILDE; - -terminal Character CHAR; -terminal String STRING, MACROUSE; - -/* symbols *only* used in the parse tree (not in the grammar) */ -terminal CCLASS, CCLASSNOT, CONCAT; -terminal STRING_I, CHAR_I; /* case insensitive strings/chars */ - - -non terminal macros, macro; -non terminal Integer rule; -non terminal NFA specification; -non terminal RegExp series, concs, nregexp, regexp, charclass, lookahead; -non terminal Interval classcontentelem; -non terminal Vector states, statesOPT, classcontent, preclass, rules; -non terminal Boolean hatOPT; -non terminal Action act, actions; - - -/* grammar specification */ -start with specification; - -specification ::= USERCODE - /* delimiter is checked in lexer */ - macros - DELIMITER - rules - {: - scanner.t.stop(); - - Out.checkErrors(); - - Out.time(ErrorMessages.PARSING_TOOK, t); - - macros.expand(); - Enumeration unused = macros.unused(); - while ( unused.hasMoreElements() ) { - Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used."); - } - - SemCheck.check(regExps, macros, scanner.file); - - regExps.checkActions(); - regExps.checkLookAheads(); - - Out.checkErrors(); - - if (Options.dump) charClasses.dump(); - - Out.print("Constructing NFA : "); - - t.start(); - int num = regExps.getNum(); - - RESULT = new NFA(charClasses.getNumClasses(), - scanner, regExps, macros, charClasses); - - eofActions.setNumLexStates(scanner.states.number()); - - for (int i = 0; i < num; i++) { - if (regExps.isEOF(i)) - eofActions.add( regExps.getStates(i), regExps.getAction(i) ); - else - RESULT.addRegExp(i); - } - - if (scanner.standalone) RESULT.addStandaloneRule(); - t.stop(); - - Out.time(""); - Out.time(ErrorMessages.NFA_TOOK, t); - - :} - | /* emtpy spec. error */ - {: - fatalError(ErrorMessages.NO_LEX_SPEC); - :} - ; - -macros ::= /* empty, most switches & state declarations are parsed in lexer */ - | macros macro - | error; - -macro ::= ASCII - {: charClasses.setMaxCharCode(127); :} - | FULL - {: charClasses.setMaxCharCode(255); :} - | UNICODE - {: charClasses.setMaxCharCode(0xFFFF); :} - | IDENT:name EQUALS series:definition REGEXPEND - {: macros.insert(name, definition); :} - | IDENT EQUALS:e - {: syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); :} - ; - - -rules ::= rules:rlist rule:r - {: rlist.addElement(r); RESULT = rlist; :} - | rules:rlist1 LESSTHAN states:states MORETHAN LBRACE rules:rlist2 RBRACE - {: - Enumeration rs = rlist2.elements(); - while ( rs.hasMoreElements() ) { - Integer elem = (Integer) rs.nextElement(); - // might be null for error case of "rule" - if (elem != null) { - regExps.addStates( elem.intValue(), states ); - } - rlist1.addElement( elem ); - } - RESULT = rlist1; - :} - | LESSTHAN states:states MORETHAN LBRACE rules:rlist RBRACE - {: - Enumeration rs = rlist.elements(); - while ( rs.hasMoreElements() ) { - Integer elem = (Integer) rs.nextElement(); - // might be null for error case of "rule" - if (elem != null) { - regExps.addStates( elem.intValue(), states ); - } - } - RESULT = rlist; - :} - | rule:r - {: RESULT = new Vector(); RESULT.addElement(r); :} - ; - -rule ::= statesOPT:s hatOPT:bol series:r actions:a - {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); :} - | statesOPT:s hatOPT:bol series:r lookahead:l act:a - {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); :} - | statesOPT:s hatOPT:bol series:r lookahead:l NOACTION:a - {: syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); :} - | statesOPT:s EOFRULE ACTION:a - {: RESULT = new Integer(regExps.insert(s, a)); :} - | error - ; - -lookahead ::= DOLLAR - {: RESULT = makeNL(); :} - | LOOKAHEAD series:r - {: RESULT = r; :} - | LOOKAHEAD series:s DOLLAR - {: RESULT = new RegExp2(sym.CONCAT, s, makeNL()); :} - ; - -act ::= REGEXPEND ACTION:a - {: RESULT = a; :} - ; - -actions ::= act:a - {: RESULT = a; :} - | NOACTION - ; - - -statesOPT ::= LESSTHAN states:list MORETHAN - {: RESULT = list; :} - | /* empty */ - {: RESULT = new Vector(); :} - ; - -states ::= IDENT:id COMMA states:list - {: - stateNumber = scanner.states.getNumber( id ); - if ( stateNumber != null ) - list.addElement( stateNumber ); - else { - throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, - idleft, idright); - } - RESULT = list; - :} - | IDENT:id - {: - Vector list = new Vector(); - stateNumber = scanner.states.getNumber( id ); - if ( stateNumber != null ) - list.addElement( stateNumber ); - else { - throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, - idleft, idright); - } - RESULT = list; - :} - | IDENT COMMA:c - {: syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); :} - ; - -hatOPT ::= HAT - {: // assumption: there is no upper case for \n - charClasses.makeClass('\n', false); - RESULT = new Boolean(true); :} - | /* empty */ - {: RESULT = new Boolean(false); :} - ; - -series ::= series:r1 BAR concs:r2 - {: RESULT = new RegExp2(sym.BAR, r1, r2); :} - | concs:r - {: RESULT = r; :} - | BAR:b - {: syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); :} - ; - -concs ::= concs:r1 nregexp:r2 - {: RESULT = new RegExp2(sym.CONCAT, r1, r2); :} - | nregexp:r - {: RESULT = r; :} - ; - -nregexp ::= regexp:r - {: RESULT = r; :} - | BANG nregexp:r - {: RESULT = new RegExp1(sym.BANG, r); :} - | TILDE nregexp:r - {: RESULT = new RegExp1(sym.TILDE, r); :} - ; - -regexp ::= regexp:r STAR - {: RESULT = new RegExp1(sym.STAR, r); :} - | regexp:r PLUS - {: RESULT = new RegExp1(sym.PLUS, r); :} - | regexp:r QUESTION - {: RESULT = new RegExp1(sym.QUESTION, r); :} - | regexp:r REPEAT:n RBRACE:b - {: RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); :} - | regexp:r REPEAT:n1 REPEAT:n2 RBRACE - {: RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); :} - | OPENBRACKET series:r CLOSEBRACKET - {: RESULT = r; :} - | MACROUSE:ident - {: - if ( !scanner.macroDefinition ) { - if ( ! macros.markUsed(ident) ) - throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, - identleft, identright); - } - RESULT = new RegExp1(sym.MACROUSE, ident); - :} - | charclass:c - {: RESULT = c; :} - | preclass:list - {: - try { - // assumption [correct?]: preclasses are already closed under case - charClasses.makeClass(list, false); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft); - } - RESULT = new RegExp1(sym.CCLASS, list); - :} - | STRING:str - {: - try { - if ( scanner.caseless ) { - charClasses.makeClass(str, true); - RESULT = new RegExp1(sym.STRING_I, str); - } - else { - charClasses.makeClass(str, false); - RESULT = new RegExp1(sym.STRING, str); - } - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright); - } - - :} - | POINT - {: - Vector any = new Vector(); - any.addElement(new Interval('\n','\n')); - // assumption: there is no upper case for \n - charClasses.makeClass('\n', false); - RESULT = new RegExp1(sym.CCLASSNOT, any); - :} - | CHAR:c - {: - try { - if ( scanner.caseless ) { - charClasses.makeClass(c.charValue(), true); - RESULT = new RegExp1(sym.CHAR_I, c); - } - else { - charClasses.makeClass(c.charValue(), false); - RESULT = new RegExp1(sym.CHAR, c); - } - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright); - } - :} - ; - -charclass ::= OPENCLASS CLOSECLASS - {: - RESULT = new RegExp1(sym.CCLASS,null); - :} - | OPENCLASS classcontent:list CLOSECLASS:close - {: - try { - charClasses.makeClass(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - :} - | OPENCLASS HAT CLOSECLASS:close - {: - Vector list = new Vector(); - list.addElement(new Interval((char)0,CharClasses.maxChar)); - try { - charClasses.makeClass(list, false); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - :} - | OPENCLASS HAT classcontent:list CLOSECLASS:close - {: - try { - charClasses.makeClassNot(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - :} - | OPENCLASS DASH classcontent:list CLOSECLASS:close - {: - try { - list.addElement(new Interval('-','-')); - charClasses.makeClass(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - :} - | OPENCLASS HAT DASH classcontent:list CLOSECLASS:close - {: - try { - list.addElement(new Interval('-','-')); - charClasses.makeClassNot(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - :} - ; - -classcontent ::= classcontent:list classcontentelem:elem - {: - list.addElement(elem); - RESULT = list; - :} - | classcontentelem:elem - {: - Vector list = new Vector(); - list.addElement(elem); - RESULT = list; - :} - | classcontent:list preclass:plist - {: - for (Enumeration e = plist.elements(); e.hasMoreElements();) - list.addElement(e.nextElement()); - RESULT = list; - :} - | preclass:list - {: RESULT = list; :} - | classcontent:list STRING:s - {: - for (int i = 0; i < s.length(); i++) - list.addElement(new Interval(s.charAt(i),s.charAt(i))); - RESULT = list; - :} - | STRING:s - {: - RESULT = new Vector(); - for (int i = 0; i < s.length(); i++) - RESULT.addElement(new Interval(s.charAt(i),s.charAt(i))); - :} - | classcontent:list MACROUSE:ident - {: - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - :} - | MACROUSE:ident - {: - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - :} - ; - -classcontentelem ::= CHAR:c1 DASH CHAR:c2 - {: RESULT = new Interval(c1.charValue(), c2.charValue()); :} - | CHAR:c - {: RESULT = new Interval(c.charValue(), c.charValue()); :} - ; - -preclass ::= JLETTERCLASS - {: RESULT = makePreClass(sym.JLETTERCLASS); :} - | JLETTERDIGITCLASS - {: RESULT = makePreClass(sym.JLETTERDIGITCLASS); :} - | LETTERCLASS - {: RESULT = makePreClass(sym.LETTERCLASS); :} - | DIGITCLASS - {: RESULT = makePreClass(sym.DIGITCLASS); :} - | UPPERCLASS - {: RESULT = makePreClass(sym.UPPERCLASS); :} - | LOWERCLASS - {: RESULT = makePreClass(sym.LOWERCLASS); :} - | UNICODE_UNASSIGNED - {: RESULT = makePreClass(sym.UNICODE_UNASSIGNED); :} - | UNICODE_UPPERCASE_LETTER - {: RESULT = makePreClass(sym.UNICODE_UPPERCASE_LETTER); :} - | UNICODE_LOWERCASE_LETTER - {: RESULT = makePreClass(sym.UNICODE_LOWERCASE_LETTER); :} - | UNICODE_TITLECASE_LETTER - {: RESULT = makePreClass(sym.UNICODE_TITLECASE_LETTER); :} - | UNICODE_MODIFIER_LETTER - {: RESULT = makePreClass(sym.UNICODE_MODIFIER_LETTER); :} - | UNICODE_OTHER_LETTER - {: RESULT = makePreClass(sym.UNICODE_OTHER_LETTER); :} - | UNICODE_NON_SPACING_MARK - {: RESULT = makePreClass(sym.UNICODE_NON_SPACING_MARK); :} - | UNICODE_ENCLOSING_MARK - {: RESULT = makePreClass(sym.UNICODE_ENCLOSING_MARK); :} - | UNICODE_COMBINING_SPACING_MARK - {: RESULT = makePreClass(sym.UNICODE_COMBINING_SPACING_MARK); :} - | UNICODE_DECIMAL_DIGIT_NUMBER - {: RESULT = makePreClass(sym.UNICODE_DECIMAL_DIGIT_NUMBER); :} - | UNICODE_LETTER_NUMBER - {: RESULT = makePreClass(sym.UNICODE_LETTER_NUMBER); :} - | UNICODE_OTHER_NUMBER - {: RESULT = makePreClass(sym.UNICODE_OTHER_NUMBER); :} - | UNICODE_SPACE_SEPARATOR - {: RESULT = makePreClass(sym.UNICODE_SPACE_SEPARATOR); :} - | UNICODE_LINE_SEPARATOR - {: RESULT = makePreClass(sym.UNICODE_LINE_SEPARATOR); :} - | UNICODE_PARAGRAPH_SEPARATOR - {: RESULT = makePreClass(sym.UNICODE_PARAGRAPH_SEPARATOR); :} - | UNICODE_CONTROL - {: RESULT = makePreClass(sym.UNICODE_CONTROL); :} - | UNICODE_FORMAT - {: RESULT = makePreClass(sym.UNICODE_FORMAT); :} - | UNICODE_PRIVATE_USE - {: RESULT = makePreClass(sym.UNICODE_PRIVATE_USE); :} - | UNICODE_SURROGATE - {: RESULT = makePreClass(sym.UNICODE_SURROGATE); :} - | UNICODE_DASH_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_DASH_PUNCTUATION); :} - | UNICODE_START_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_START_PUNCTUATION); :} - | UNICODE_END_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_END_PUNCTUATION); :} - | UNICODE_CONNECTOR_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_CONNECTOR_PUNCTUATION); :} - | UNICODE_OTHER_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_OTHER_PUNCTUATION); :} - | UNICODE_MATH_SYMBOL - {: RESULT = makePreClass(sym.UNICODE_MATH_SYMBOL); :} - | UNICODE_CURRENCY_SYMBOL - {: RESULT = makePreClass(sym.UNICODE_CURRENCY_SYMBOL); :} - | UNICODE_MODIFIER_SYMBOL - {: RESULT = makePreClass(sym.UNICODE_MODIFIER_SYMBOL); :} - | UNICODE_OTHER_SYMBOL - {: RESULT = makePreClass(sym.UNICODE_OTHER_SYMBOL); :} - | UNICODE_INITIAL_QUOTE_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_INITIAL_QUOTE_PUNCTUATION); :} - | UNICODE_FINAL_QUOTE_PUNCTUATION - {: RESULT = makePreClass(sym.UNICODE_FINAL_QUOTE_PUNCTUATION); :} - ; diff --git a/tools/lexer/jflex-1.4/src/JFlex/LexParse.java b/tools/lexer/jflex-1.4/src/JFlex/LexParse.java deleted file mode 100644 index e11c63203c91..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/LexParse.java +++ /dev/null @@ -1,2795 +0,0 @@ - -//---------------------------------------------------- -// The following code was generated by CUP v0.11a beta 20060608 -// Mon Dec 03 16:12:49 MSK 2012 -//---------------------------------------------------- - -package JFlex; - -import java.util.*; - -/** CUP v0.11a beta 20060608 generated parser. - * @version Mon Dec 03 16:12:49 MSK 2012 - */ -public class LexParse extends java_cup.runtime.lr_parser { - - /** Default constructor. */ - public LexParse() {super();} - - /** Constructor which sets the default scanner. */ - public LexParse(java_cup.runtime.Scanner s) {super(s);} - - /** Constructor which sets the default scanner. */ - public LexParse(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);} - - /** Production table. */ - protected static final short _production_table[][] = - unpackFromStrings(new String[] { - "\000\151\000\002\002\004\000\002\005\006\000\002\005" + - "\002\000\002\002\002\000\002\002\004\000\002\002\003" + - "\000\002\003\003\000\002\003\003\000\002\003\003\000" + - "\002\003\006\000\002\003\004\000\002\021\004\000\002" + - "\021\011\000\002\021\010\000\002\021\003\000\002\004" + - "\006\000\002\004\007\000\002\004\007\000\002\004\005" + - "\000\002\004\003\000\002\013\003\000\002\013\004\000" + - "\002\013\005\000\002\023\004\000\002\024\003\000\002" + - "\024\003\000\002\016\005\000\002\016\002\000\002\015" + - "\005\000\002\015\003\000\002\015\004\000\002\022\003" + - "\000\002\022\002\000\002\006\005\000\002\006\003\000" + - "\002\006\003\000\002\007\004\000\002\007\003\000\002" + - "\010\003\000\002\010\004\000\002\010\004\000\002\011" + - "\004\000\002\011\004\000\002\011\004\000\002\011\005" + - "\000\002\011\006\000\002\011\005\000\002\011\003\000" + - "\002\011\003\000\002\011\003\000\002\011\003\000\002" + - "\011\003\000\002\011\003\000\002\012\004\000\002\012" + - "\005\000\002\012\005\000\002\012\006\000\002\012\006" + - "\000\002\012\007\000\002\017\004\000\002\017\003\000" + - "\002\017\004\000\002\017\003\000\002\017\004\000\002" + - "\017\003\000\002\017\004\000\002\017\003\000\002\014" + - "\005\000\002\014\003\000\002\020\003\000\002\020\003" + - "\000\002\020\003\000\002\020\003\000\002\020\003\000" + - "\002\020\003\000\002\020\003\000\002\020\003\000\002" + - "\020\003\000\002\020\003\000\002\020\003\000\002\020" + - "\003\000\002\020\003\000\002\020\003\000\002\020\003" + - "\000\002\020\003\000\002\020\003\000\002\020\003\000" + - "\002\020\003\000\002\020\003\000\002\020\003\000\002" + - "\020\003\000\002\020\003\000\002\020\003\000\002\020" + - "\003\000\002\020\003\000\002\020\003\000\002\020\003" + - "\000\002\020\003\000\002\020\003\000\002\020\003\000" + - "\002\020\003\000\002\020\003\000\002\020\003\000\002" + - "\020\003\000\002\020\003" }); - - /** Access to production table. */ - public short[][] production_table() {return _production_table;} - - /** Parse-action table. */ - protected static final short[][] _action_table = - unpackFromStrings(new String[] { - "\000\214\000\006\002\uffff\077\004\001\002\000\016\003" + - "\007\013\ufffe\022\ufffe\023\ufffe\024\ufffe\076\ufffe\001\002" + - "\000\004\002\006\001\002\000\004\002\001\001\002\000" + - "\014\013\ufffc\022\ufffc\023\ufffc\024\ufffc\076\ufffc\001\002" + - "\000\014\013\012\022\011\023\016\024\015\076\014\001" + - "\002\000\014\013\ufffb\022\ufffb\023\ufffb\024\ufffb\076\ufffb" + - "\001\002\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016" + - "\154\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + - "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + - "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + - "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + - "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + - "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + - "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + - "\000\014\013\ufffd\022\ufffd\023\ufffd\024\ufffd\076\ufffd\001" + - "\002\000\004\014\017\001\002\000\014\013\ufff9\022\ufff9" + - "\023\ufff9\024\ufff9\076\ufff9\001\002\000\014\013\ufffa\022" + - "\ufffa\023\ufffa\024\ufffa\076\ufffa\001\002\000\146\004\066" + - "\010\064\013\ufff7\022\ufff7\023\ufff7\024\ufff7\026\056\027" + - "\043\030\072\031\060\032\076\033\023\037\061\040\033" + - "\041\021\042\074\043\063\044\062\045\073\046\071\047" + - "\036\050\050\051\101\052\053\053\052\054\047\055\055" + - "\056\054\057\044\060\042\061\067\062\040\063\102\064" + - "\032\065\051\066\031\067\034\070\020\071\075\072\100" + - "\073\025\074\026\076\ufff7\103\037\105\070\106\041\107" + - "\035\110\022\111\077\112\024\001\002\000\160\004\uff9d" + - "\005\uff9d\007\uff9d\010\uff9d\011\uff9d\025\uff9d\026\uff9d\027" + - "\uff9d\030\uff9d\031\uff9d\032\uff9d\033\uff9d\035\uff9d\036\uff9d" + - "\037\uff9d\040\uff9d\041\uff9d\042\uff9d\043\uff9d\044\uff9d\045" + - "\uff9d\046\uff9d\047\uff9d\050\uff9d\051\uff9d\052\uff9d\053\uff9d" + - "\054\uff9d\055\uff9d\056\uff9d\057\uff9d\060\uff9d\061\uff9d\062" + - "\uff9d\063\uff9d\064\uff9d\065\uff9d\066\uff9d\067\uff9d\070\uff9d" + - "\071\uff9d\072\uff9d\073\uff9d\074\uff9d\100\uff9d\101\uff9d\102" + - "\uff9d\103\uff9d\104\uff9d\105\uff9d\106\uff9d\107\uff9d\110\uff9d" + - "\111\uff9d\112\uff9d\001\002\000\160\004\uffb4\005\uffb4\007" + - "\uffb4\010\uffb4\011\uffb4\025\uffb4\026\uffb4\027\uffb4\030\uffb4" + - "\031\uffb4\032\uffb4\033\uffb4\035\uffb4\036\uffb4\037\uffb4\040" + - "\uffb4\041\uffb4\042\uffb4\043\uffb4\044\uffb4\045\uffb4\046\uffb4" + - "\047\uffb4\050\uffb4\051\uffb4\052\uffb4\053\uffb4\054\uffb4\055" + - "\uffb4\056\uffb4\057\uffb4\060\uffb4\061\uffb4\062\uffb4\063\uffb4" + - "\064\uffb4\065\uffb4\066\uffb4\067\uffb4\070\uffb4\071\uffb4\072" + - "\uffb4\073\uffb4\074\uffb4\100\uffb4\101\uffb4\102\uffb4\103\uffb4" + - "\104\uffb4\105\uffb4\106\uffb4\107\uffb4\110\uffb4\111\uffb4\112" + - "\uffb4\001\002\000\156\004\uffcd\005\uffcd\007\uffcd\010\uffcd" + - "\025\uffcd\026\uffcd\027\uffcd\030\uffcd\031\uffcd\032\uffcd\033" + - "\uffcd\035\uffcd\036\uffcd\037\uffcd\040\uffcd\041\uffcd\042\uffcd" + - "\043\uffcd\044\uffcd\045\uffcd\046\uffcd\047\uffcd\050\uffcd\051" + - "\uffcd\052\uffcd\053\uffcd\054\uffcd\055\uffcd\056\uffcd\057\uffcd" + - "\060\uffcd\061\uffcd\062\uffcd\063\uffcd\064\uffcd\065\uffcd\066" + - "\uffcd\067\uffcd\070\uffcd\071\uffcd\072\uffcd\073\uffcd\074\uffcd" + - "\100\uffcd\101\uffcd\102\uffcd\103\uffcd\104\uffcd\105\uffcd\106" + - "\uffcd\107\uffcd\110\uffcd\111\uffcd\112\uffcd\001\002\000\160" + - "\004\uffb7\005\uffb7\007\uffb7\010\uffb7\011\uffb7\025\uffb7\026" + - "\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7\035\uffb7" + - "\036\uffb7\037\uffb7\040\uffb7\041\uffb7\042\uffb7\043\uffb7\044" + - "\uffb7\045\uffb7\046\uffb7\047\uffb7\050\uffb7\051\uffb7\052\uffb7" + - "\053\uffb7\054\uffb7\055\uffb7\056\uffb7\057\uffb7\060\uffb7\061" + - "\uffb7\062\uffb7\063\uffb7\064\uffb7\065\uffb7\066\uffb7\067\uffb7" + - "\070\uffb7\071\uffb7\072\uffb7\073\uffb7\074\uffb7\100\uffb7\101" + - "\uffb7\102\uffb7\103\uffb7\104\uffb7\105\uffb7\106\uffb7\107\uffb7" + - "\110\uffb7\111\uffb7\112\uffb7\001\002\000\156\004\uffd2\005" + - "\uffd2\007\uffd2\010\uffd2\025\uffd2\026\uffd2\027\uffd2\030\uffd2" + - "\031\uffd2\032\uffd2\033\uffd2\035\uffd2\036\uffd2\037\uffd2\040" + - "\uffd2\041\uffd2\042\uffd2\043\uffd2\044\uffd2\045\uffd2\046\uffd2" + - "\047\uffd2\050\uffd2\051\uffd2\052\uffd2\053\uffd2\054\uffd2\055" + - "\uffd2\056\uffd2\057\uffd2\060\uffd2\061\uffd2\062\uffd2\063\uffd2" + - "\064\uffd2\065\uffd2\066\uffd2\067\uffd2\070\uffd2\071\uffd2\072" + - "\uffd2\073\uffd2\074\uffd2\100\uffd2\101\uffd2\102\uffd2\103\uffd2" + - "\104\uffd2\105\uffd2\106\uffd2\107\uffd2\110\uffd2\111\uffd2\112" + - "\uffd2\001\002\000\160\004\uff9a\005\uff9a\007\uff9a\010\uff9a" + - "\011\uff9a\025\uff9a\026\uff9a\027\uff9a\030\uff9a\031\uff9a\032" + - "\uff9a\033\uff9a\035\uff9a\036\uff9a\037\uff9a\040\uff9a\041\uff9a" + - "\042\uff9a\043\uff9a\044\uff9a\045\uff9a\046\uff9a\047\uff9a\050" + - "\uff9a\051\uff9a\052\uff9a\053\uff9a\054\uff9a\055\uff9a\056\uff9a" + - "\057\uff9a\060\uff9a\061\uff9a\062\uff9a\063\uff9a\064\uff9a\065" + - "\uff9a\066\uff9a\067\uff9a\070\uff9a\071\uff9a\072\uff9a\073\uff9a" + - "\074\uff9a\100\uff9a\101\uff9a\102\uff9a\103\uff9a\104\uff9a\105" + - "\uff9a\106\uff9a\107\uff9a\110\uff9a\111\uff9a\112\uff9a\001\002" + - "\000\160\004\uff99\005\uff99\007\uff99\010\uff99\011\uff99\025" + - "\uff99\026\uff99\027\uff99\030\uff99\031\uff99\032\uff99\033\uff99" + - "\035\uff99\036\uff99\037\uff99\040\uff99\041\uff99\042\uff99\043" + - "\uff99\044\uff99\045\uff99\046\uff99\047\uff99\050\uff99\051\uff99" + - "\052\uff99\053\uff99\054\uff99\055\uff99\056\uff99\057\uff99\060" + - "\uff99\061\uff99\062\uff99\063\uff99\064\uff99\065\uff99\066\uff99" + - "\067\uff99\070\uff99\071\uff99\072\uff99\073\uff99\074\uff99\100" + - "\uff99\101\uff99\102\uff99\103\uff99\104\uff99\105\uff99\106\uff99" + - "\107\uff99\110\uff99\111\uff99\112\uff99\001\002\000\006\025" + - "\151\103\104\001\002\000\146\004\066\005\uffdf\007\uffdf" + - "\010\064\025\uffdf\026\056\027\043\030\072\031\060\032" + - "\076\033\023\035\uffdf\036\uffdf\037\061\040\033\041\021" + - "\042\074\043\063\044\062\045\073\046\071\047\036\050" + - "\050\051\101\052\053\053\052\054\047\055\055\056\054" + - "\057\044\060\042\061\067\062\040\063\102\064\032\065" + - "\051\066\031\067\034\070\020\071\075\072\100\073\025" + - "\074\026\103\uffdf\105\070\106\041\107\035\110\022\111" + - "\077\112\024\001\002\000\160\004\uff9f\005\uff9f\007\uff9f" + - "\010\uff9f\011\uff9f\025\uff9f\026\uff9f\027\uff9f\030\uff9f\031" + - "\uff9f\032\uff9f\033\uff9f\035\uff9f\036\uff9f\037\uff9f\040\uff9f" + - "\041\uff9f\042\uff9f\043\uff9f\044\uff9f\045\uff9f\046\uff9f\047" + - "\uff9f\050\uff9f\051\uff9f\052\uff9f\053\uff9f\054\uff9f\055\uff9f" + - "\056\uff9f\057\uff9f\060\uff9f\061\uff9f\062\uff9f\063\uff9f\064" + - "\uff9f\065\uff9f\066\uff9f\067\uff9f\070\uff9f\071\uff9f\072\uff9f" + - "\073\uff9f\074\uff9f\100\uff9f\101\uff9f\102\uff9f\103\uff9f\104" + - "\uff9f\105\uff9f\106\uff9f\107\uff9f\110\uff9f\111\uff9f\112\uff9f" + - "\001\002\000\160\004\uffa1\005\uffa1\007\uffa1\010\uffa1\011" + - "\uffa1\025\uffa1\026\uffa1\027\uffa1\030\uffa1\031\uffa1\032\uffa1" + - "\033\uffa1\035\uffa1\036\uffa1\037\uffa1\040\uffa1\041\uffa1\042" + - "\uffa1\043\uffa1\044\uffa1\045\uffa1\046\uffa1\047\uffa1\050\uffa1" + - "\051\uffa1\052\uffa1\053\uffa1\054\uffa1\055\uffa1\056\uffa1\057" + - "\uffa1\060\uffa1\061\uffa1\062\uffa1\063\uffa1\064\uffa1\065\uffa1" + - "\066\uffa1\067\uffa1\070\uffa1\071\uffa1\072\uffa1\073\uffa1\074" + - "\uffa1\100\uffa1\101\uffa1\102\uffa1\103\uffa1\104\uffa1\105\uffa1" + - "\106\uffa1\107\uffa1\110\uffa1\111\uffa1\112\uffa1\001\002\000" + - "\160\004\uffb5\005\uffb5\007\uffb5\010\uffb5\011\uffb5\025\uffb5" + - "\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5\035" + - "\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042\uffb5\043\uffb5" + - "\044\uffb5\045\uffb5\046\uffb5\047\uffb5\050\uffb5\051\uffb5\052" + - "\uffb5\053\uffb5\054\uffb5\055\uffb5\056\uffb5\057\uffb5\060\uffb5" + - "\061\uffb5\062\uffb5\063\uffb5\064\uffb5\065\uffb5\066\uffb5\067" + - "\uffb5\070\uffb5\071\uffb5\072\uffb5\073\uffb5\074\uffb5\100\uffb5" + - "\101\uffb5\102\uffb5\103\uffb5\104\uffb5\105\uffb5\106\uffb5\107" + - "\uffb5\110\uffb5\111\uffb5\112\uffb5\001\002\000\160\004\uff9e" + - "\005\uff9e\007\uff9e\010\uff9e\011\uff9e\025\uff9e\026\uff9e\027" + - "\uff9e\030\uff9e\031\uff9e\032\uff9e\033\uff9e\035\uff9e\036\uff9e" + - "\037\uff9e\040\uff9e\041\uff9e\042\uff9e\043\uff9e\044\uff9e\045" + - "\uff9e\046\uff9e\047\uff9e\050\uff9e\051\uff9e\052\uff9e\053\uff9e" + - "\054\uff9e\055\uff9e\056\uff9e\057\uff9e\060\uff9e\061\uff9e\062" + - "\uff9e\063\uff9e\064\uff9e\065\uff9e\066\uff9e\067\uff9e\070\uff9e" + - "\071\uff9e\072\uff9e\073\uff9e\074\uff9e\100\uff9e\101\uff9e\102" + - "\uff9e\103\uff9e\104\uff9e\105\uff9e\106\uff9e\107\uff9e\110\uff9e" + - "\111\uff9e\112\uff9e\001\002\000\132\004\066\010\064\026" + - "\056\027\043\030\072\031\060\032\076\033\023\037\061" + - "\040\033\041\021\042\074\043\063\044\062\045\073\046" + - "\071\047\036\050\050\051\101\052\053\053\052\054\047" + - "\055\055\056\054\057\044\060\042\061\067\062\040\063" + - "\102\064\032\065\051\066\031\067\034\070\020\071\075" + - "\072\100\073\025\074\026\105\070\106\041\107\035\110" + - "\022\111\077\112\024\001\002\000\160\004\uffae\005\uffae" + - "\007\uffae\010\uffae\011\uffae\025\uffae\026\uffae\027\uffae\030" + - "\uffae\031\uffae\032\uffae\033\uffae\035\uffae\036\uffae\037\uffae" + - "\040\uffae\041\uffae\042\uffae\043\uffae\044\uffae\045\uffae\046" + - "\uffae\047\uffae\050\uffae\051\uffae\052\uffae\053\uffae\054\uffae" + - "\055\uffae\056\uffae\057\uffae\060\uffae\061\uffae\062\uffae\063" + - "\uffae\064\uffae\065\uffae\066\uffae\067\uffae\070\uffae\071\uffae" + - "\072\uffae\073\uffae\074\uffae\100\uffae\101\uffae\102\uffae\103" + - "\uffae\104\uffae\105\uffae\106\uffae\107\uffae\110\uffae\111\uffae" + - "\112\uffae\001\002\000\016\005\uffde\007\uffde\025\uffde\035" + - "\uffde\036\uffde\103\uffde\001\002\000\160\004\uffa3\005\uffa3" + - "\007\uffa3\010\uffa3\011\uffa3\025\uffa3\026\uffa3\027\uffa3\030" + - "\uffa3\031\uffa3\032\uffa3\033\uffa3\035\uffa3\036\uffa3\037\uffa3" + - "\040\uffa3\041\uffa3\042\uffa3\043\uffa3\044\uffa3\045\uffa3\046" + - "\uffa3\047\uffa3\050\uffa3\051\uffa3\052\uffa3\053\uffa3\054\uffa3" + - "\055\uffa3\056\uffa3\057\uffa3\060\uffa3\061\uffa3\062\uffa3\063" + - "\uffa3\064\uffa3\065\uffa3\066\uffa3\067\uffa3\070\uffa3\071\uffa3" + - "\072\uffa3\073\uffa3\074\uffa3\100\uffa3\101\uffa3\102\uffa3\103" + - "\uffa3\104\uffa3\105\uffa3\106\uffa3\107\uffa3\110\uffa3\111\uffa3" + - "\112\uffa3\001\002\000\132\004\066\010\064\026\056\027" + - "\043\030\072\031\060\032\076\033\023\037\061\040\033" + - "\041\021\042\074\043\063\044\062\045\073\046\071\047" + - "\036\050\050\051\101\052\053\053\052\054\047\055\055" + - "\056\054\057\044\060\042\061\067\062\040\063\102\064" + - "\032\065\051\066\031\067\034\070\020\071\075\072\100" + - "\073\025\074\026\105\070\106\041\107\035\110\022\111" + - "\077\112\024\001\002\000\160\004\uffa5\005\uffa5\007\uffa5" + - "\010\uffa5\011\uffa5\025\uffa5\026\uffa5\027\uffa5\030\uffa5\031" + - "\uffa5\032\uffa5\033\uffa5\035\uffa5\036\uffa5\037\uffa5\040\uffa5" + - "\041\uffa5\042\uffa5\043\uffa5\044\uffa5\045\uffa5\046\uffa5\047" + - "\uffa5\050\uffa5\051\uffa5\052\uffa5\053\uffa5\054\uffa5\055\uffa5" + - "\056\uffa5\057\uffa5\060\uffa5\061\uffa5\062\uffa5\063\uffa5\064" + - "\uffa5\065\uffa5\066\uffa5\067\uffa5\070\uffa5\071\uffa5\072\uffa5" + - "\073\uffa5\074\uffa5\100\uffa5\101\uffa5\102\uffa5\103\uffa5\104" + - "\uffa5\105\uffa5\106\uffa5\107\uffa5\110\uffa5\111\uffa5\112\uffa5" + - "\001\002\000\160\004\uffbb\005\uffbb\007\uffbb\010\uffbb\011" + - "\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb" + - "\033\uffbb\035\uffbb\036\uffbb\037\uffbb\040\uffbb\041\uffbb\042" + - "\uffbb\043\uffbb\044\uffbb\045\uffbb\046\uffbb\047\uffbb\050\uffbb" + - "\051\uffbb\052\uffbb\053\uffbb\054\uffbb\055\uffbb\056\uffbb\057" + - "\uffbb\060\uffbb\061\uffbb\062\uffbb\063\uffbb\064\uffbb\065\uffbb" + - "\066\uffbb\067\uffbb\070\uffbb\071\uffbb\072\uffbb\073\uffbb\074" + - "\uffbb\100\uffbb\101\uffbb\102\uffbb\103\uffbb\104\uffbb\105\uffbb" + - "\106\uffbb\107\uffbb\110\uffbb\111\uffbb\112\uffbb\001\002\000" + - "\160\004\uffa6\005\uffa6\007\uffa6\010\uffa6\011\uffa6\025\uffa6" + - "\026\uffa6\027\uffa6\030\uffa6\031\uffa6\032\uffa6\033\uffa6\035" + - "\uffa6\036\uffa6\037\uffa6\040\uffa6\041\uffa6\042\uffa6\043\uffa6" + - "\044\uffa6\045\uffa6\046\uffa6\047\uffa6\050\uffa6\051\uffa6\052" + - "\uffa6\053\uffa6\054\uffa6\055\uffa6\056\uffa6\057\uffa6\060\uffa6" + - "\061\uffa6\062\uffa6\063\uffa6\064\uffa6\065\uffa6\066\uffa6\067" + - "\uffa6\070\uffa6\071\uffa6\072\uffa6\073\uffa6\074\uffa6\100\uffa6" + - "\101\uffa6\102\uffa6\103\uffa6\104\uffa6\105\uffa6\106\uffa6\107" + - "\uffa6\110\uffa6\111\uffa6\112\uffa6\001\002\000\156\004\uffdb" + - "\005\uffdb\007\uffdb\010\uffdb\025\uffdb\026\uffdb\027\uffdb\030" + - "\uffdb\031\uffdb\032\uffdb\033\uffdb\035\uffdb\036\uffdb\037\uffdb" + - "\040\uffdb\041\uffdb\042\uffdb\043\uffdb\044\uffdb\045\uffdb\046" + - "\uffdb\047\uffdb\050\uffdb\051\uffdb\052\uffdb\053\uffdb\054\uffdb" + - "\055\uffdb\056\uffdb\057\uffdb\060\uffdb\061\uffdb\062\uffdb\063" + - "\uffdb\064\uffdb\065\uffdb\066\uffdb\067\uffdb\070\uffdb\071\uffdb" + - "\072\uffdb\073\uffdb\074\uffdb\100\142\101\140\102\141\103" + - "\uffdb\104\143\105\uffdb\106\uffdb\107\uffdb\110\uffdb\111\uffdb" + - "\112\uffdb\001\002\000\156\004\uffd0\005\uffd0\007\uffd0\010" + - "\uffd0\025\uffd0\026\uffd0\027\uffd0\030\uffd0\031\uffd0\032\uffd0" + - "\033\uffd0\035\uffd0\036\uffd0\037\uffd0\040\uffd0\041\uffd0\042" + - "\uffd0\043\uffd0\044\uffd0\045\uffd0\046\uffd0\047\uffd0\050\uffd0" + - "\051\uffd0\052\uffd0\053\uffd0\054\uffd0\055\uffd0\056\uffd0\057" + - "\uffd0\060\uffd0\061\uffd0\062\uffd0\063\uffd0\064\uffd0\065\uffd0" + - "\066\uffd0\067\uffd0\070\uffd0\071\uffd0\072\uffd0\073\uffd0\074" + - "\uffd0\100\uffd0\101\uffd0\102\uffd0\103\uffd0\104\uffd0\105\uffd0" + - "\106\uffd0\107\uffd0\110\uffd0\111\uffd0\112\uffd0\001\002\000" + - "\160\004\uffa9\005\uffa9\007\uffa9\010\uffa9\011\uffa9\025\uffa9" + - "\026\uffa9\027\uffa9\030\uffa9\031\uffa9\032\uffa9\033\uffa9\035" + - "\uffa9\036\uffa9\037\uffa9\040\uffa9\041\uffa9\042\uffa9\043\uffa9" + - "\044\uffa9\045\uffa9\046\uffa9\047\uffa9\050\uffa9\051\uffa9\052" + - "\uffa9\053\uffa9\054\uffa9\055\uffa9\056\uffa9\057\uffa9\060\uffa9" + - "\061\uffa9\062\uffa9\063\uffa9\064\uffa9\065\uffa9\066\uffa9\067" + - "\uffa9\070\uffa9\071\uffa9\072\uffa9\073\uffa9\074\uffa9\100\uffa9" + - "\101\uffa9\102\uffa9\103\uffa9\104\uffa9\105\uffa9\106\uffa9\107" + - "\uffa9\110\uffa9\111\uffa9\112\uffa9\001\002\000\160\004\uffad" + - "\005\uffad\007\uffad\010\uffad\011\uffad\025\uffad\026\uffad\027" + - "\uffad\030\uffad\031\uffad\032\uffad\033\uffad\035\uffad\036\uffad" + - "\037\uffad\040\uffad\041\uffad\042\uffad\043\uffad\044\uffad\045" + - "\uffad\046\uffad\047\uffad\050\uffad\051\uffad\052\uffad\053\uffad" + - "\054\uffad\055\uffad\056\uffad\057\uffad\060\uffad\061\uffad\062" + - "\uffad\063\uffad\064\uffad\065\uffad\066\uffad\067\uffad\070\uffad" + - "\071\uffad\072\uffad\073\uffad\074\uffad\100\uffad\101\uffad\102" + - "\uffad\103\uffad\104\uffad\105\uffad\106\uffad\107\uffad\110\uffad" + - "\111\uffad\112\uffad\001\002\000\160\004\uffa0\005\uffa0\007" + - "\uffa0\010\uffa0\011\uffa0\025\uffa0\026\uffa0\027\uffa0\030\uffa0" + - "\031\uffa0\032\uffa0\033\uffa0\035\uffa0\036\uffa0\037\uffa0\040" + - "\uffa0\041\uffa0\042\uffa0\043\uffa0\044\uffa0\045\uffa0\046\uffa0" + - "\047\uffa0\050\uffa0\051\uffa0\052\uffa0\053\uffa0\054\uffa0\055" + - "\uffa0\056\uffa0\057\uffa0\060\uffa0\061\uffa0\062\uffa0\063\uffa0" + - "\064\uffa0\065\uffa0\066\uffa0\067\uffa0\070\uffa0\071\uffa0\072" + - "\uffa0\073\uffa0\074\uffa0\100\uffa0\101\uffa0\102\uffa0\103\uffa0" + - "\104\uffa0\105\uffa0\106\uffa0\107\uffa0\110\uffa0\111\uffa0\112" + - "\uffa0\001\002\000\160\004\uffaa\005\uffaa\007\uffaa\010\uffaa" + - "\011\uffaa\025\uffaa\026\uffaa\027\uffaa\030\uffaa\031\uffaa\032" + - "\uffaa\033\uffaa\035\uffaa\036\uffaa\037\uffaa\040\uffaa\041\uffaa" + - "\042\uffaa\043\uffaa\044\uffaa\045\uffaa\046\uffaa\047\uffaa\050" + - "\uffaa\051\uffaa\052\uffaa\053\uffaa\054\uffaa\055\uffaa\056\uffaa" + - "\057\uffaa\060\uffaa\061\uffaa\062\uffaa\063\uffaa\064\uffaa\065" + - "\uffaa\066\uffaa\067\uffaa\070\uffaa\071\uffaa\072\uffaa\073\uffaa" + - "\074\uffaa\100\uffaa\101\uffaa\102\uffaa\103\uffaa\104\uffaa\105" + - "\uffaa\106\uffaa\107\uffaa\110\uffaa\111\uffaa\112\uffaa\001\002" + - "\000\160\004\uffab\005\uffab\007\uffab\010\uffab\011\uffab\025" + - "\uffab\026\uffab\027\uffab\030\uffab\031\uffab\032\uffab\033\uffab" + - "\035\uffab\036\uffab\037\uffab\040\uffab\041\uffab\042\uffab\043" + - "\uffab\044\uffab\045\uffab\046\uffab\047\uffab\050\uffab\051\uffab" + - "\052\uffab\053\uffab\054\uffab\055\uffab\056\uffab\057\uffab\060" + - "\uffab\061\uffab\062\uffab\063\uffab\064\uffab\065\uffab\066\uffab" + - "\067\uffab\070\uffab\071\uffab\072\uffab\073\uffab\074\uffab\100" + - "\uffab\101\uffab\102\uffab\103\uffab\104\uffab\105\uffab\106\uffab" + - "\107\uffab\110\uffab\111\uffab\112\uffab\001\002\000\160\004" + - "\uffa7\005\uffa7\007\uffa7\010\uffa7\011\uffa7\025\uffa7\026\uffa7" + - "\027\uffa7\030\uffa7\031\uffa7\032\uffa7\033\uffa7\035\uffa7\036" + - "\uffa7\037\uffa7\040\uffa7\041\uffa7\042\uffa7\043\uffa7\044\uffa7" + - "\045\uffa7\046\uffa7\047\uffa7\050\uffa7\051\uffa7\052\uffa7\053" + - "\uffa7\054\uffa7\055\uffa7\056\uffa7\057\uffa7\060\uffa7\061\uffa7" + - "\062\uffa7\063\uffa7\064\uffa7\065\uffa7\066\uffa7\067\uffa7\070" + - "\uffa7\071\uffa7\072\uffa7\073\uffa7\074\uffa7\100\uffa7\101\uffa7" + - "\102\uffa7\103\uffa7\104\uffa7\105\uffa7\106\uffa7\107\uffa7\110" + - "\uffa7\111\uffa7\112\uffa7\001\002\000\160\004\uffa8\005\uffa8" + - "\007\uffa8\010\uffa8\011\uffa8\025\uffa8\026\uffa8\027\uffa8\030" + - "\uffa8\031\uffa8\032\uffa8\033\uffa8\035\uffa8\036\uffa8\037\uffa8" + - "\040\uffa8\041\uffa8\042\uffa8\043\uffa8\044\uffa8\045\uffa8\046" + - "\uffa8\047\uffa8\050\uffa8\051\uffa8\052\uffa8\053\uffa8\054\uffa8" + - "\055\uffa8\056\uffa8\057\uffa8\060\uffa8\061\uffa8\062\uffa8\063" + - "\uffa8\064\uffa8\065\uffa8\066\uffa8\067\uffa8\070\uffa8\071\uffa8" + - "\072\uffa8\073\uffa8\074\uffa8\100\uffa8\101\uffa8\102\uffa8\103" + - "\uffa8\104\uffa8\105\uffa8\106\uffa8\107\uffa8\110\uffa8\111\uffa8" + - "\112\uffa8\001\002\000\160\004\uffbc\005\uffbc\007\uffbc\010" + - "\uffbc\011\uffbc\025\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc" + - "\032\uffbc\033\uffbc\035\uffbc\036\uffbc\037\uffbc\040\uffbc\041" + - "\uffbc\042\uffbc\043\uffbc\044\uffbc\045\uffbc\046\uffbc\047\uffbc" + - "\050\uffbc\051\uffbc\052\uffbc\053\uffbc\054\uffbc\055\uffbc\056" + - "\uffbc\057\uffbc\060\uffbc\061\uffbc\062\uffbc\063\uffbc\064\uffbc" + - "\065\uffbc\066\uffbc\067\uffbc\070\uffbc\071\uffbc\072\uffbc\073" + - "\uffbc\074\uffbc\100\uffbc\101\uffbc\102\uffbc\103\uffbc\104\uffbc" + - "\105\uffbc\106\uffbc\107\uffbc\110\uffbc\111\uffbc\112\uffbc\001" + - "\002\000\156\004\uffd1\005\uffd1\007\uffd1\010\uffd1\025\uffd1" + - "\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1\035" + - "\uffd1\036\uffd1\037\uffd1\040\uffd1\041\uffd1\042\uffd1\043\uffd1" + - "\044\uffd1\045\uffd1\046\uffd1\047\uffd1\050\uffd1\051\uffd1\052" + - "\uffd1\053\uffd1\054\uffd1\055\uffd1\056\uffd1\057\uffd1\060\uffd1" + - "\061\uffd1\062\uffd1\063\uffd1\064\uffd1\065\uffd1\066\uffd1\067" + - "\uffd1\070\uffd1\071\uffd1\072\uffd1\073\uffd1\074\uffd1\100\uffd1" + - "\101\uffd1\102\uffd1\103\uffd1\104\uffd1\105\uffd1\106\uffd1\107" + - "\uffd1\110\uffd1\111\uffd1\112\uffd1\001\002\000\160\004\uffb9" + - "\005\uffb9\007\uffb9\010\uffb9\011\uffb9\025\uffb9\026\uffb9\027" + - "\uffb9\030\uffb9\031\uffb9\032\uffb9\033\uffb9\035\uffb9\036\uffb9" + - "\037\uffb9\040\uffb9\041\uffb9\042\uffb9\043\uffb9\044\uffb9\045" + - "\uffb9\046\uffb9\047\uffb9\050\uffb9\051\uffb9\052\uffb9\053\uffb9" + - "\054\uffb9\055\uffb9\056\uffb9\057\uffb9\060\uffb9\061\uffb9\062" + - "\uffb9\063\uffb9\064\uffb9\065\uffb9\066\uffb9\067\uffb9\070\uffb9" + - "\071\uffb9\072\uffb9\073\uffb9\074\uffb9\100\uffb9\101\uffb9\102" + - "\uffb9\103\uffb9\104\uffb9\105\uffb9\106\uffb9\107\uffb9\110\uffb9" + - "\111\uffb9\112\uffb9\001\002\000\160\004\uffb6\005\uffb6\007" + - "\uffb6\010\uffb6\011\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6" + - "\031\uffb6\032\uffb6\033\uffb6\035\uffb6\036\uffb6\037\uffb6\040" + - "\uffb6\041\uffb6\042\uffb6\043\uffb6\044\uffb6\045\uffb6\046\uffb6" + - "\047\uffb6\050\uffb6\051\uffb6\052\uffb6\053\uffb6\054\uffb6\055" + - "\uffb6\056\uffb6\057\uffb6\060\uffb6\061\uffb6\062\uffb6\063\uffb6" + - "\064\uffb6\065\uffb6\066\uffb6\067\uffb6\070\uffb6\071\uffb6\072" + - "\uffb6\073\uffb6\074\uffb6\100\uffb6\101\uffb6\102\uffb6\103\uffb6" + - "\104\uffb6\105\uffb6\106\uffb6\107\uffb6\110\uffb6\111\uffb6\112" + - "\uffb6\001\002\000\160\004\uffb1\005\uffb1\007\uffb1\010\uffb1" + - "\011\uffb1\025\uffb1\026\uffb1\027\uffb1\030\uffb1\031\uffb1\032" + - "\uffb1\033\uffb1\035\uffb1\036\uffb1\037\uffb1\040\uffb1\041\uffb1" + - "\042\uffb1\043\uffb1\044\uffb1\045\uffb1\046\uffb1\047\uffb1\050" + - "\uffb1\051\uffb1\052\uffb1\053\uffb1\054\uffb1\055\uffb1\056\uffb1" + - "\057\uffb1\060\uffb1\061\uffb1\062\uffb1\063\uffb1\064\uffb1\065" + - "\uffb1\066\uffb1\067\uffb1\070\uffb1\071\uffb1\072\uffb1\073\uffb1" + - "\074\uffb1\100\uffb1\101\uffb1\102\uffb1\103\uffb1\104\uffb1\105" + - "\uffb1\106\uffb1\107\uffb1\110\uffb1\111\uffb1\112\uffb1\001\002" + - "\000\160\004\uffb2\005\uffb2\007\uffb2\010\uffb2\011\uffb2\025" + - "\uffb2\026\uffb2\027\uffb2\030\uffb2\031\uffb2\032\uffb2\033\uffb2" + - "\035\uffb2\036\uffb2\037\uffb2\040\uffb2\041\uffb2\042\uffb2\043" + - "\uffb2\044\uffb2\045\uffb2\046\uffb2\047\uffb2\050\uffb2\051\uffb2" + - "\052\uffb2\053\uffb2\054\uffb2\055\uffb2\056\uffb2\057\uffb2\060" + - "\uffb2\061\uffb2\062\uffb2\063\uffb2\064\uffb2\065\uffb2\066\uffb2" + - "\067\uffb2\070\uffb2\071\uffb2\072\uffb2\073\uffb2\074\uffb2\100" + - "\uffb2\101\uffb2\102\uffb2\103\uffb2\104\uffb2\105\uffb2\106\uffb2" + - "\107\uffb2\110\uffb2\111\uffb2\112\uffb2\001\002\000\126\006" + - "\114\011\115\012\113\026\056\027\043\030\072\031\060" + - "\032\076\033\023\037\061\040\033\041\021\042\074\043" + - "\063\044\062\045\073\046\071\047\036\050\050\051\101" + - "\052\053\053\052\054\047\055\055\056\054\057\044\060" + - "\042\061\067\062\040\063\102\064\032\065\051\066\031" + - "\067\034\070\020\071\075\072\100\073\025\074\026\110" + - "\110\111\116\112\111\001\002\000\146\004\uffdc\005\uffdc" + - "\007\uffdc\010\uffdc\025\uffdc\026\uffdc\027\uffdc\030\uffdc\031" + - "\uffdc\032\uffdc\033\uffdc\035\uffdc\036\uffdc\037\uffdc\040\uffdc" + - "\041\uffdc\042\uffdc\043\uffdc\044\uffdc\045\uffdc\046\uffdc\047" + - "\uffdc\050\uffdc\051\uffdc\052\uffdc\053\uffdc\054\uffdc\055\uffdc" + - "\056\uffdc\057\uffdc\060\uffdc\061\uffdc\062\uffdc\063\uffdc\064" + - "\uffdc\065\uffdc\066\uffdc\067\uffdc\070\uffdc\071\uffdc\072\uffdc" + - "\073\uffdc\074\uffdc\103\uffdc\105\uffdc\106\uffdc\107\uffdc\110" + - "\uffdc\111\uffdc\112\uffdc\001\002\000\134\004\066\010\064" + - "\026\056\027\043\030\072\031\060\032\076\033\023\037" + - "\061\040\033\041\021\042\074\043\063\044\062\045\073" + - "\046\071\047\036\050\050\051\101\052\053\053\052\054" + - "\047\055\055\056\054\057\044\060\042\061\067\062\040" + - "\063\102\064\032\065\051\066\031\067\034\070\020\071" + - "\075\072\100\073\025\074\026\103\037\105\070\106\041" + - "\107\035\110\022\111\077\112\024\001\002\000\160\004" + - "\uffa4\005\uffa4\007\uffa4\010\uffa4\011\uffa4\025\uffa4\026\uffa4" + - "\027\uffa4\030\uffa4\031\uffa4\032\uffa4\033\uffa4\035\uffa4\036" + - "\uffa4\037\uffa4\040\uffa4\041\uffa4\042\uffa4\043\uffa4\044\uffa4" + - "\045\uffa4\046\uffa4\047\uffa4\050\uffa4\051\uffa4\052\uffa4\053" + - "\uffa4\054\uffa4\055\uffa4\056\uffa4\057\uffa4\060\uffa4\061\uffa4" + - "\062\uffa4\063\uffa4\064\uffa4\065\uffa4\066\uffa4\067\uffa4\070" + - "\uffa4\071\uffa4\072\uffa4\073\uffa4\074\uffa4\100\uffa4\101\uffa4" + - "\102\uffa4\103\uffa4\104\uffa4\105\uffa4\106\uffa4\107\uffa4\110" + - "\uffa4\111\uffa4\112\uffa4\001\002\000\156\004\uffce\005\uffce" + - "\007\uffce\010\uffce\025\uffce\026\uffce\027\uffce\030\uffce\031" + - "\uffce\032\uffce\033\uffce\035\uffce\036\uffce\037\uffce\040\uffce" + - "\041\uffce\042\uffce\043\uffce\044\uffce\045\uffce\046\uffce\047" + - "\uffce\050\uffce\051\uffce\052\uffce\053\uffce\054\uffce\055\uffce" + - "\056\uffce\057\uffce\060\uffce\061\uffce\062\uffce\063\uffce\064" + - "\uffce\065\uffce\066\uffce\067\uffce\070\uffce\071\uffce\072\uffce" + - "\073\uffce\074\uffce\100\uffce\101\uffce\102\uffce\103\uffce\104" + - "\uffce\105\uffce\106\uffce\107\uffce\110\uffce\111\uffce\112\uffce" + - "\001\002\000\160\004\uffaf\005\uffaf\007\uffaf\010\uffaf\011" + - "\uffaf\025\uffaf\026\uffaf\027\uffaf\030\uffaf\031\uffaf\032\uffaf" + - "\033\uffaf\035\uffaf\036\uffaf\037\uffaf\040\uffaf\041\uffaf\042" + - "\uffaf\043\uffaf\044\uffaf\045\uffaf\046\uffaf\047\uffaf\050\uffaf" + - "\051\uffaf\052\uffaf\053\uffaf\054\uffaf\055\uffaf\056\uffaf\057" + - "\uffaf\060\uffaf\061\uffaf\062\uffaf\063\uffaf\064\uffaf\065\uffaf" + - "\066\uffaf\067\uffaf\070\uffaf\071\uffaf\072\uffaf\073\uffaf\074" + - "\uffaf\100\uffaf\101\uffaf\102\uffaf\103\uffaf\104\uffaf\105\uffaf" + - "\106\uffaf\107\uffaf\110\uffaf\111\uffaf\112\uffaf\001\002\000" + - "\160\004\uffba\005\uffba\007\uffba\010\uffba\011\uffba\025\uffba" + - "\026\uffba\027\uffba\030\uffba\031\uffba\032\uffba\033\uffba\035" + - "\uffba\036\uffba\037\uffba\040\uffba\041\uffba\042\uffba\043\uffba" + - "\044\uffba\045\uffba\046\uffba\047\uffba\050\uffba\051\uffba\052" + - "\uffba\053\uffba\054\uffba\055\uffba\056\uffba\057\uffba\060\uffba" + - "\061\uffba\062\uffba\063\uffba\064\uffba\065\uffba\066\uffba\067" + - "\uffba\070\uffba\071\uffba\072\uffba\073\uffba\074\uffba\100\uffba" + - "\101\uffba\102\uffba\103\uffba\104\uffba\105\uffba\106\uffba\107" + - "\uffba\110\uffba\111\uffba\112\uffba\001\002\000\160\004\uffb0" + - "\005\uffb0\007\uffb0\010\uffb0\011\uffb0\025\uffb0\026\uffb0\027" + - "\uffb0\030\uffb0\031\uffb0\032\uffb0\033\uffb0\035\uffb0\036\uffb0" + - "\037\uffb0\040\uffb0\041\uffb0\042\uffb0\043\uffb0\044\uffb0\045" + - "\uffb0\046\uffb0\047\uffb0\050\uffb0\051\uffb0\052\uffb0\053\uffb0" + - "\054\uffb0\055\uffb0\056\uffb0\057\uffb0\060\uffb0\061\uffb0\062" + - "\uffb0\063\uffb0\064\uffb0\065\uffb0\066\uffb0\067\uffb0\070\uffb0" + - "\071\uffb0\072\uffb0\073\uffb0\074\uffb0\100\uffb0\101\uffb0\102" + - "\uffb0\103\uffb0\104\uffb0\105\uffb0\106\uffb0\107\uffb0\110\uffb0" + - "\111\uffb0\112\uffb0\001\002\000\160\004\uffb3\005\uffb3\007" + - "\uffb3\010\uffb3\011\uffb3\025\uffb3\026\uffb3\027\uffb3\030\uffb3" + - "\031\uffb3\032\uffb3\033\uffb3\035\uffb3\036\uffb3\037\uffb3\040" + - "\uffb3\041\uffb3\042\uffb3\043\uffb3\044\uffb3\045\uffb3\046\uffb3" + - "\047\uffb3\050\uffb3\051\uffb3\052\uffb3\053\uffb3\054\uffb3\055" + - "\uffb3\056\uffb3\057\uffb3\060\uffb3\061\uffb3\062\uffb3\063\uffb3" + - "\064\uffb3\065\uffb3\066\uffb3\067\uffb3\070\uffb3\071\uffb3\072" + - "\uffb3\073\uffb3\074\uffb3\100\uffb3\101\uffb3\102\uffb3\103\uffb3" + - "\104\uffb3\105\uffb3\106\uffb3\107\uffb3\110\uffb3\111\uffb3\112" + - "\uffb3\001\002\000\160\004\uff9c\005\uff9c\007\uff9c\010\uff9c" + - "\011\uff9c\025\uff9c\026\uff9c\027\uff9c\030\uff9c\031\uff9c\032" + - "\uff9c\033\uff9c\035\uff9c\036\uff9c\037\uff9c\040\uff9c\041\uff9c" + - "\042\uff9c\043\uff9c\044\uff9c\045\uff9c\046\uff9c\047\uff9c\050" + - "\uff9c\051\uff9c\052\uff9c\053\uff9c\054\uff9c\055\uff9c\056\uff9c" + - "\057\uff9c\060\uff9c\061\uff9c\062\uff9c\063\uff9c\064\uff9c\065" + - "\uff9c\066\uff9c\067\uff9c\070\uff9c\071\uff9c\072\uff9c\073\uff9c" + - "\074\uff9c\100\uff9c\101\uff9c\102\uff9c\103\uff9c\104\uff9c\105" + - "\uff9c\106\uff9c\107\uff9c\110\uff9c\111\uff9c\112\uff9c\001\002" + - "\000\160\004\uffb8\005\uffb8\007\uffb8\010\uffb8\011\uffb8\025" + - "\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8\033\uffb8" + - "\035\uffb8\036\uffb8\037\uffb8\040\uffb8\041\uffb8\042\uffb8\043" + - "\uffb8\044\uffb8\045\uffb8\046\uffb8\047\uffb8\050\uffb8\051\uffb8" + - "\052\uffb8\053\uffb8\054\uffb8\055\uffb8\056\uffb8\057\uffb8\060" + - "\uffb8\061\uffb8\062\uffb8\063\uffb8\064\uffb8\065\uffb8\066\uffb8" + - "\067\uffb8\070\uffb8\071\uffb8\072\uffb8\073\uffb8\074\uffb8\100" + - "\uffb8\101\uffb8\102\uffb8\103\uffb8\104\uffb8\105\uffb8\106\uffb8" + - "\107\uffb8\110\uffb8\111\uffb8\112\uffb8\001\002\000\156\004" + - "\uffcf\005\uffcf\007\uffcf\010\uffcf\025\uffcf\026\uffcf\027\uffcf" + - "\030\uffcf\031\uffcf\032\uffcf\033\uffcf\035\uffcf\036\uffcf\037" + - "\uffcf\040\uffcf\041\uffcf\042\uffcf\043\uffcf\044\uffcf\045\uffcf" + - "\046\uffcf\047\uffcf\050\uffcf\051\uffcf\052\uffcf\053\uffcf\054" + - "\uffcf\055\uffcf\056\uffcf\057\uffcf\060\uffcf\061\uffcf\062\uffcf" + - "\063\uffcf\064\uffcf\065\uffcf\066\uffcf\067\uffcf\070\uffcf\071" + - "\uffcf\072\uffcf\073\uffcf\074\uffcf\100\uffcf\101\uffcf\102\uffcf" + - "\103\uffcf\104\uffcf\105\uffcf\106\uffcf\107\uffcf\110\uffcf\111" + - "\uffcf\112\uffcf\001\002\000\160\004\uff9b\005\uff9b\007\uff9b" + - "\010\uff9b\011\uff9b\025\uff9b\026\uff9b\027\uff9b\030\uff9b\031" + - "\uff9b\032\uff9b\033\uff9b\035\uff9b\036\uff9b\037\uff9b\040\uff9b" + - "\041\uff9b\042\uff9b\043\uff9b\044\uff9b\045\uff9b\046\uff9b\047" + - "\uff9b\050\uff9b\051\uff9b\052\uff9b\053\uff9b\054\uff9b\055\uff9b" + - "\056\uff9b\057\uff9b\060\uff9b\061\uff9b\062\uff9b\063\uff9b\064" + - "\uff9b\065\uff9b\066\uff9b\067\uff9b\070\uff9b\071\uff9b\072\uff9b" + - "\073\uff9b\074\uff9b\100\uff9b\101\uff9b\102\uff9b\103\uff9b\104" + - "\uff9b\105\uff9b\106\uff9b\107\uff9b\110\uff9b\111\uff9b\112\uff9b" + - "\001\002\000\160\004\uffac\005\uffac\007\uffac\010\uffac\011" + - "\uffac\025\uffac\026\uffac\027\uffac\030\uffac\031\uffac\032\uffac" + - "\033\uffac\035\uffac\036\uffac\037\uffac\040\uffac\041\uffac\042" + - "\uffac\043\uffac\044\uffac\045\uffac\046\uffac\047\uffac\050\uffac" + - "\051\uffac\052\uffac\053\uffac\054\uffac\055\uffac\056\uffac\057" + - "\uffac\060\uffac\061\uffac\062\uffac\063\uffac\064\uffac\065\uffac" + - "\066\uffac\067\uffac\070\uffac\071\uffac\072\uffac\073\uffac\074" + - "\uffac\100\uffac\101\uffac\102\uffac\103\uffac\104\uffac\105\uffac" + - "\106\uffac\107\uffac\110\uffac\111\uffac\112\uffac\001\002\000" + - "\160\004\uffa2\005\uffa2\007\uffa2\010\uffa2\011\uffa2\025\uffa2" + - "\026\uffa2\027\uffa2\030\uffa2\031\uffa2\032\uffa2\033\uffa2\035" + - "\uffa2\036\uffa2\037\uffa2\040\uffa2\041\uffa2\042\uffa2\043\uffa2" + - "\044\uffa2\045\uffa2\046\uffa2\047\uffa2\050\uffa2\051\uffa2\052" + - "\uffa2\053\uffa2\054\uffa2\055\uffa2\056\uffa2\057\uffa2\060\uffa2" + - "\061\uffa2\062\uffa2\063\uffa2\064\uffa2\065\uffa2\066\uffa2\067" + - "\uffa2\070\uffa2\071\uffa2\072\uffa2\073\uffa2\074\uffa2\100\uffa2" + - "\101\uffa2\102\uffa2\103\uffa2\104\uffa2\105\uffa2\106\uffa2\107" + - "\uffa2\110\uffa2\111\uffa2\112\uffa2\001\002\000\006\005\105" + - "\103\104\001\002\000\132\004\066\010\064\026\056\027" + - "\043\030\072\031\060\032\076\033\023\037\061\040\033" + - "\041\021\042\074\043\063\044\062\045\073\046\071\047" + - "\036\050\050\051\101\052\053\053\052\054\047\055\055" + - "\056\054\057\044\060\042\061\067\062\040\063\102\064" + - "\032\065\051\066\031\067\034\070\020\071\075\072\100" + - "\073\025\074\026\105\070\106\041\107\035\110\022\111" + - "\077\112\024\001\002\000\156\004\uffd3\005\uffd3\007\uffd3" + - "\010\uffd3\025\uffd3\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032" + - "\uffd3\033\uffd3\035\uffd3\036\uffd3\037\uffd3\040\uffd3\041\uffd3" + - "\042\uffd3\043\uffd3\044\uffd3\045\uffd3\046\uffd3\047\uffd3\050" + - "\uffd3\051\uffd3\052\uffd3\053\uffd3\054\uffd3\055\uffd3\056\uffd3" + - "\057\uffd3\060\uffd3\061\uffd3\062\uffd3\063\uffd3\064\uffd3\065" + - "\uffd3\066\uffd3\067\uffd3\070\uffd3\071\uffd3\072\uffd3\073\uffd3" + - "\074\uffd3\100\uffd3\101\uffd3\102\uffd3\103\uffd3\104\uffd3\105" + - "\uffd3\106\uffd3\107\uffd3\110\uffd3\111\uffd3\112\uffd3\001\002" + - "\000\146\004\066\005\uffe0\007\uffe0\010\064\025\uffe0\026" + - "\056\027\043\030\072\031\060\032\076\033\023\035\uffe0" + - "\036\uffe0\037\061\040\033\041\021\042\074\043\063\044" + - "\062\045\073\046\071\047\036\050\050\051\101\052\053" + - "\053\052\054\047\055\055\056\054\057\044\060\042\061" + - "\067\062\040\063\102\064\032\065\051\066\031\067\034" + - "\070\020\071\075\072\100\073\025\074\026\103\uffe0\105" + - "\070\106\041\107\035\110\022\111\077\112\024\001\002" + - "\000\146\004\uffdd\005\uffdd\007\uffdd\010\uffdd\025\uffdd\026" + - "\uffdd\027\uffdd\030\uffdd\031\uffdd\032\uffdd\033\uffdd\035\uffdd" + - "\036\uffdd\037\uffdd\040\uffdd\041\uffdd\042\uffdd\043\uffdd\044" + - "\uffdd\045\uffdd\046\uffdd\047\uffdd\050\uffdd\051\uffdd\052\uffdd" + - "\053\uffdd\054\uffdd\055\uffdd\056\uffdd\057\uffdd\060\uffdd\061" + - "\uffdd\062\uffdd\063\uffdd\064\uffdd\065\uffdd\066\uffdd\067\uffdd" + - "\070\uffdd\071\uffdd\072\uffdd\073\uffdd\074\uffdd\103\uffdd\105" + - "\uffdd\106\uffdd\107\uffdd\110\uffdd\111\uffdd\112\uffdd\001\002" + - "\000\124\011\uffbd\012\136\026\uffbd\027\uffbd\030\uffbd\031" + - "\uffbd\032\uffbd\033\uffbd\037\uffbd\040\uffbd\041\uffbd\042\uffbd" + - "\043\uffbd\044\uffbd\045\uffbd\046\uffbd\047\uffbd\050\uffbd\051" + - "\uffbd\052\uffbd\053\uffbd\054\uffbd\055\uffbd\056\uffbd\057\uffbd" + - "\060\uffbd\061\uffbd\062\uffbd\063\uffbd\064\uffbd\065\uffbd\066" + - "\uffbd\067\uffbd\070\uffbd\071\uffbd\072\uffbd\073\uffbd\074\uffbd" + - "\110\uffbd\111\uffbd\112\uffbd\001\002\000\122\011\uffbf\026" + - "\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\037\uffbf" + - "\040\uffbf\041\uffbf\042\uffbf\043\uffbf\044\uffbf\045\uffbf\046" + - "\uffbf\047\uffbf\050\uffbf\051\uffbf\052\uffbf\053\uffbf\054\uffbf" + - "\055\uffbf\056\uffbf\057\uffbf\060\uffbf\061\uffbf\062\uffbf\063" + - "\uffbf\064\uffbf\065\uffbf\066\uffbf\067\uffbf\070\uffbf\071\uffbf" + - "\072\uffbf\073\uffbf\074\uffbf\110\uffbf\111\uffbf\112\uffbf\001" + - "\002\000\122\011\uffc3\026\uffc3\027\uffc3\030\uffc3\031\uffc3" + - "\032\uffc3\033\uffc3\037\uffc3\040\uffc3\041\uffc3\042\uffc3\043" + - "\uffc3\044\uffc3\045\uffc3\046\uffc3\047\uffc3\050\uffc3\051\uffc3" + - "\052\uffc3\053\uffc3\054\uffc3\055\uffc3\056\uffc3\057\uffc3\060" + - "\uffc3\061\uffc3\062\uffc3\063\uffc3\064\uffc3\065\uffc3\066\uffc3" + - "\067\uffc3\070\uffc3\071\uffc3\072\uffc3\073\uffc3\074\uffc3\110" + - "\uffc3\111\uffc3\112\uffc3\001\002\000\120\026\056\027\043" + - "\030\072\031\060\032\076\033\023\037\061\040\033\041" + - "\021\042\074\043\063\044\062\045\073\046\071\047\036" + - "\050\050\051\101\052\053\053\052\054\047\055\055\056" + - "\054\057\044\060\042\061\067\062\040\063\102\064\032" + - "\065\051\066\031\067\034\070\020\071\075\072\100\073" + - "\025\074\026\110\110\111\116\112\111\001\002\000\124" + - "\011\127\012\126\026\056\027\043\030\072\031\060\032" + - "\076\033\023\037\061\040\033\041\021\042\074\043\063" + - "\044\062\045\073\046\071\047\036\050\050\051\101\052" + - "\053\053\052\054\047\055\055\056\054\057\044\060\042" + - "\061\067\062\040\063\102\064\032\065\051\066\031\067" + - "\034\070\020\071\075\072\100\073\025\074\026\110\110" + - "\111\116\112\111\001\002\000\156\004\uffcc\005\uffcc\007" + - "\uffcc\010\uffcc\025\uffcc\026\uffcc\027\uffcc\030\uffcc\031\uffcc" + - "\032\uffcc\033\uffcc\035\uffcc\036\uffcc\037\uffcc\040\uffcc\041" + - "\uffcc\042\uffcc\043\uffcc\044\uffcc\045\uffcc\046\uffcc\047\uffcc" + - "\050\uffcc\051\uffcc\052\uffcc\053\uffcc\054\uffcc\055\uffcc\056" + - "\uffcc\057\uffcc\060\uffcc\061\uffcc\062\uffcc\063\uffcc\064\uffcc" + - "\065\uffcc\066\uffcc\067\uffcc\070\uffcc\071\uffcc\072\uffcc\073" + - "\uffcc\074\uffcc\100\uffcc\101\uffcc\102\uffcc\103\uffcc\104\uffcc" + - "\105\uffcc\106\uffcc\107\uffcc\110\uffcc\111\uffcc\112\uffcc\001" + - "\002\000\122\011\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1" + - "\032\uffc1\033\uffc1\037\uffc1\040\uffc1\041\uffc1\042\uffc1\043" + - "\uffc1\044\uffc1\045\uffc1\046\uffc1\047\uffc1\050\uffc1\051\uffc1" + - "\052\uffc1\053\uffc1\054\uffc1\055\uffc1\056\uffc1\057\uffc1\060" + - "\uffc1\061\uffc1\062\uffc1\063\uffc1\064\uffc1\065\uffc1\066\uffc1" + - "\067\uffc1\070\uffc1\071\uffc1\072\uffc1\073\uffc1\074\uffc1\110" + - "\uffc1\111\uffc1\112\uffc1\001\002\000\122\011\uffc5\026\uffc5" + - "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\037\uffc5\040" + - "\uffc5\041\uffc5\042\uffc5\043\uffc5\044\uffc5\045\uffc5\046\uffc5" + - "\047\uffc5\050\uffc5\051\uffc5\052\uffc5\053\uffc5\054\uffc5\055" + - "\uffc5\056\uffc5\057\uffc5\060\uffc5\061\uffc5\062\uffc5\063\uffc5" + - "\064\uffc5\065\uffc5\066\uffc5\067\uffc5\070\uffc5\071\uffc5\072" + - "\uffc5\073\uffc5\074\uffc5\110\uffc5\111\uffc5\112\uffc5\001\002" + - "\000\122\011\123\026\056\027\043\030\072\031\060\032" + - "\076\033\023\037\061\040\033\041\021\042\074\043\063" + - "\044\062\045\073\046\071\047\036\050\050\051\101\052" + - "\053\053\052\054\047\055\055\056\054\057\044\060\042" + - "\061\067\062\040\063\102\064\032\065\051\066\031\067" + - "\034\070\020\071\075\072\100\073\025\074\026\110\110" + - "\111\124\112\121\001\002\000\122\011\uffc0\026\uffc0\027" + - "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\037\uffc0\040\uffc0" + - "\041\uffc0\042\uffc0\043\uffc0\044\uffc0\045\uffc0\046\uffc0\047" + - "\uffc0\050\uffc0\051\uffc0\052\uffc0\053\uffc0\054\uffc0\055\uffc0" + - "\056\uffc0\057\uffc0\060\uffc0\061\uffc0\062\uffc0\063\uffc0\064" + - "\uffc0\065\uffc0\066\uffc0\067\uffc0\070\uffc0\071\uffc0\072\uffc0" + - "\073\uffc0\074\uffc0\110\uffc0\111\uffc0\112\uffc0\001\002\000" + - "\122\011\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4" + - "\033\uffc4\037\uffc4\040\uffc4\041\uffc4\042\uffc4\043\uffc4\044" + - "\uffc4\045\uffc4\046\uffc4\047\uffc4\050\uffc4\051\uffc4\052\uffc4" + - "\053\uffc4\054\uffc4\055\uffc4\056\uffc4\057\uffc4\060\uffc4\061" + - "\uffc4\062\uffc4\063\uffc4\064\uffc4\065\uffc4\066\uffc4\067\uffc4" + - "\070\uffc4\071\uffc4\072\uffc4\073\uffc4\074\uffc4\110\uffc4\111" + - "\uffc4\112\uffc4\001\002\000\156\004\uffcb\005\uffcb\007\uffcb" + - "\010\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb\031\uffcb\032" + - "\uffcb\033\uffcb\035\uffcb\036\uffcb\037\uffcb\040\uffcb\041\uffcb" + - "\042\uffcb\043\uffcb\044\uffcb\045\uffcb\046\uffcb\047\uffcb\050" + - "\uffcb\051\uffcb\052\uffcb\053\uffcb\054\uffcb\055\uffcb\056\uffcb" + - "\057\uffcb\060\uffcb\061\uffcb\062\uffcb\063\uffcb\064\uffcb\065" + - "\uffcb\066\uffcb\067\uffcb\070\uffcb\071\uffcb\072\uffcb\073\uffcb" + - "\074\uffcb\100\uffcb\101\uffcb\102\uffcb\103\uffcb\104\uffcb\105" + - "\uffcb\106\uffcb\107\uffcb\110\uffcb\111\uffcb\112\uffcb\001\002" + - "\000\122\011\uffc2\026\uffc2\027\uffc2\030\uffc2\031\uffc2\032" + - "\uffc2\033\uffc2\037\uffc2\040\uffc2\041\uffc2\042\uffc2\043\uffc2" + - "\044\uffc2\045\uffc2\046\uffc2\047\uffc2\050\uffc2\051\uffc2\052" + - "\uffc2\053\uffc2\054\uffc2\055\uffc2\056\uffc2\057\uffc2\060\uffc2" + - "\061\uffc2\062\uffc2\063\uffc2\064\uffc2\065\uffc2\066\uffc2\067" + - "\uffc2\070\uffc2\071\uffc2\072\uffc2\073\uffc2\074\uffc2\110\uffc2" + - "\111\uffc2\112\uffc2\001\002\000\122\011\uffc6\026\uffc6\027" + - "\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6\037\uffc6\040\uffc6" + - "\041\uffc6\042\uffc6\043\uffc6\044\uffc6\045\uffc6\046\uffc6\047" + - "\uffc6\050\uffc6\051\uffc6\052\uffc6\053\uffc6\054\uffc6\055\uffc6" + - "\056\uffc6\057\uffc6\060\uffc6\061\uffc6\062\uffc6\063\uffc6\064" + - "\uffc6\065\uffc6\066\uffc6\067\uffc6\070\uffc6\071\uffc6\072\uffc6" + - "\073\uffc6\074\uffc6\110\uffc6\111\uffc6\112\uffc6\001\002\000" + - "\120\026\056\027\043\030\072\031\060\032\076\033\023" + - "\037\061\040\033\041\021\042\074\043\063\044\062\045" + - "\073\046\071\047\036\050\050\051\101\052\053\053\052" + - "\054\047\055\055\056\054\057\044\060\042\061\067\062" + - "\040\063\102\064\032\065\051\066\031\067\034\070\020" + - "\071\075\072\100\073\025\074\026\110\110\111\116\112" + - "\111\001\002\000\156\004\uffca\005\uffca\007\uffca\010\uffca" + - "\025\uffca\026\uffca\027\uffca\030\uffca\031\uffca\032\uffca\033" + - "\uffca\035\uffca\036\uffca\037\uffca\040\uffca\041\uffca\042\uffca" + - "\043\uffca\044\uffca\045\uffca\046\uffca\047\uffca\050\uffca\051" + - "\uffca\052\uffca\053\uffca\054\uffca\055\uffca\056\uffca\057\uffca" + - "\060\uffca\061\uffca\062\uffca\063\uffca\064\uffca\065\uffca\066" + - "\uffca\067\uffca\070\uffca\071\uffca\072\uffca\073\uffca\074\uffca" + - "\100\uffca\101\uffca\102\uffca\103\uffca\104\uffca\105\uffca\106" + - "\uffca\107\uffca\110\uffca\111\uffca\112\uffca\001\002\000\122" + - "\011\131\026\056\027\043\030\072\031\060\032\076\033" + - "\023\037\061\040\033\041\021\042\074\043\063\044\062" + - "\045\073\046\071\047\036\050\050\051\101\052\053\053" + - "\052\054\047\055\055\056\054\057\044\060\042\061\067" + - "\062\040\063\102\064\032\065\051\066\031\067\034\070" + - "\020\071\075\072\100\073\025\074\026\110\110\111\124" + - "\112\121\001\002\000\156\004\uffc9\005\uffc9\007\uffc9\010" + - "\uffc9\025\uffc9\026\uffc9\027\uffc9\030\uffc9\031\uffc9\032\uffc9" + - "\033\uffc9\035\uffc9\036\uffc9\037\uffc9\040\uffc9\041\uffc9\042" + - "\uffc9\043\uffc9\044\uffc9\045\uffc9\046\uffc9\047\uffc9\050\uffc9" + - "\051\uffc9\052\uffc9\053\uffc9\054\uffc9\055\uffc9\056\uffc9\057" + - "\uffc9\060\uffc9\061\uffc9\062\uffc9\063\uffc9\064\uffc9\065\uffc9" + - "\066\uffc9\067\uffc9\070\uffc9\071\uffc9\072\uffc9\073\uffc9\074" + - "\uffc9\100\uffc9\101\uffc9\102\uffc9\103\uffc9\104\uffc9\105\uffc9" + - "\106\uffc9\107\uffc9\110\uffc9\111\uffc9\112\uffc9\001\002\000" + - "\122\011\133\026\056\027\043\030\072\031\060\032\076" + - "\033\023\037\061\040\033\041\021\042\074\043\063\044" + - "\062\045\073\046\071\047\036\050\050\051\101\052\053" + - "\053\052\054\047\055\055\056\054\057\044\060\042\061" + - "\067\062\040\063\102\064\032\065\051\066\031\067\034" + - "\070\020\071\075\072\100\073\025\074\026\110\110\111" + - "\124\112\121\001\002\000\156\004\uffc7\005\uffc7\007\uffc7" + - "\010\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031\uffc7\032" + - "\uffc7\033\uffc7\035\uffc7\036\uffc7\037\uffc7\040\uffc7\041\uffc7" + - "\042\uffc7\043\uffc7\044\uffc7\045\uffc7\046\uffc7\047\uffc7\050" + - "\uffc7\051\uffc7\052\uffc7\053\uffc7\054\uffc7\055\uffc7\056\uffc7" + - "\057\uffc7\060\uffc7\061\uffc7\062\uffc7\063\uffc7\064\uffc7\065" + - "\uffc7\066\uffc7\067\uffc7\070\uffc7\071\uffc7\072\uffc7\073\uffc7" + - "\074\uffc7\100\uffc7\101\uffc7\102\uffc7\103\uffc7\104\uffc7\105" + - "\uffc7\106\uffc7\107\uffc7\110\uffc7\111\uffc7\112\uffc7\001\002" + - "\000\122\011\135\026\056\027\043\030\072\031\060\032" + - "\076\033\023\037\061\040\033\041\021\042\074\043\063" + - "\044\062\045\073\046\071\047\036\050\050\051\101\052" + - "\053\053\052\054\047\055\055\056\054\057\044\060\042" + - "\061\067\062\040\063\102\064\032\065\051\066\031\067" + - "\034\070\020\071\075\072\100\073\025\074\026\110\110" + - "\111\124\112\121\001\002\000\156\004\uffc8\005\uffc8\007" + - "\uffc8\010\uffc8\025\uffc8\026\uffc8\027\uffc8\030\uffc8\031\uffc8" + - "\032\uffc8\033\uffc8\035\uffc8\036\uffc8\037\uffc8\040\uffc8\041" + - "\uffc8\042\uffc8\043\uffc8\044\uffc8\045\uffc8\046\uffc8\047\uffc8" + - "\050\uffc8\051\uffc8\052\uffc8\053\uffc8\054\uffc8\055\uffc8\056" + - "\uffc8\057\uffc8\060\uffc8\061\uffc8\062\uffc8\063\uffc8\064\uffc8" + - "\065\uffc8\066\uffc8\067\uffc8\070\uffc8\071\uffc8\072\uffc8\073" + - "\uffc8\074\uffc8\100\uffc8\101\uffc8\102\uffc8\103\uffc8\104\uffc8" + - "\105\uffc8\106\uffc8\107\uffc8\110\uffc8\111\uffc8\112\uffc8\001" + - "\002\000\004\110\137\001\002\000\122\011\uffbe\026\uffbe" + - "\027\uffbe\030\uffbe\031\uffbe\032\uffbe\033\uffbe\037\uffbe\040" + - "\uffbe\041\uffbe\042\uffbe\043\uffbe\044\uffbe\045\uffbe\046\uffbe" + - "\047\uffbe\050\uffbe\051\uffbe\052\uffbe\053\uffbe\054\uffbe\055" + - "\uffbe\056\uffbe\057\uffbe\060\uffbe\061\uffbe\062\uffbe\063\uffbe" + - "\064\uffbe\065\uffbe\066\uffbe\067\uffbe\070\uffbe\071\uffbe\072" + - "\uffbe\073\uffbe\074\uffbe\110\uffbe\111\uffbe\112\uffbe\001\002" + - "\000\156\004\uffd8\005\uffd8\007\uffd8\010\uffd8\025\uffd8\026" + - "\uffd8\027\uffd8\030\uffd8\031\uffd8\032\uffd8\033\uffd8\035\uffd8" + - "\036\uffd8\037\uffd8\040\uffd8\041\uffd8\042\uffd8\043\uffd8\044" + - "\uffd8\045\uffd8\046\uffd8\047\uffd8\050\uffd8\051\uffd8\052\uffd8" + - "\053\uffd8\054\uffd8\055\uffd8\056\uffd8\057\uffd8\060\uffd8\061" + - "\uffd8\062\uffd8\063\uffd8\064\uffd8\065\uffd8\066\uffd8\067\uffd8" + - "\070\uffd8\071\uffd8\072\uffd8\073\uffd8\074\uffd8\100\uffd8\101" + - "\uffd8\102\uffd8\103\uffd8\104\uffd8\105\uffd8\106\uffd8\107\uffd8" + - "\110\uffd8\111\uffd8\112\uffd8\001\002\000\156\004\uffd7\005" + - "\uffd7\007\uffd7\010\uffd7\025\uffd7\026\uffd7\027\uffd7\030\uffd7" + - "\031\uffd7\032\uffd7\033\uffd7\035\uffd7\036\uffd7\037\uffd7\040" + - "\uffd7\041\uffd7\042\uffd7\043\uffd7\044\uffd7\045\uffd7\046\uffd7" + - "\047\uffd7\050\uffd7\051\uffd7\052\uffd7\053\uffd7\054\uffd7\055" + - "\uffd7\056\uffd7\057\uffd7\060\uffd7\061\uffd7\062\uffd7\063\uffd7" + - "\064\uffd7\065\uffd7\066\uffd7\067\uffd7\070\uffd7\071\uffd7\072" + - "\uffd7\073\uffd7\074\uffd7\100\uffd7\101\uffd7\102\uffd7\103\uffd7" + - "\104\uffd7\105\uffd7\106\uffd7\107\uffd7\110\uffd7\111\uffd7\112" + - "\uffd7\001\002\000\006\021\144\100\145\001\002\000\156" + - "\004\uffd6\005\uffd6\007\uffd6\010\uffd6\025\uffd6\026\uffd6\027" + - "\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6\035\uffd6\036\uffd6" + - "\037\uffd6\040\uffd6\041\uffd6\042\uffd6\043\uffd6\044\uffd6\045" + - "\uffd6\046\uffd6\047\uffd6\050\uffd6\051\uffd6\052\uffd6\053\uffd6" + - "\054\uffd6\055\uffd6\056\uffd6\057\uffd6\060\uffd6\061\uffd6\062" + - "\uffd6\063\uffd6\064\uffd6\065\uffd6\066\uffd6\067\uffd6\070\uffd6" + - "\071\uffd6\072\uffd6\073\uffd6\074\uffd6\100\uffd6\101\uffd6\102" + - "\uffd6\103\uffd6\104\uffd6\105\uffd6\106\uffd6\107\uffd6\110\uffd6" + - "\111\uffd6\112\uffd6\001\002\000\156\004\uffd5\005\uffd5\007" + - "\uffd5\010\uffd5\025\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5" + - "\032\uffd5\033\uffd5\035\uffd5\036\uffd5\037\uffd5\040\uffd5\041" + - "\uffd5\042\uffd5\043\uffd5\044\uffd5\045\uffd5\046\uffd5\047\uffd5" + - "\050\uffd5\051\uffd5\052\uffd5\053\uffd5\054\uffd5\055\uffd5\056" + - "\uffd5\057\uffd5\060\uffd5\061\uffd5\062\uffd5\063\uffd5\064\uffd5" + - "\065\uffd5\066\uffd5\067\uffd5\070\uffd5\071\uffd5\072\uffd5\073" + - "\uffd5\074\uffd5\100\uffd5\101\uffd5\102\uffd5\103\uffd5\104\uffd5" + - "\105\uffd5\106\uffd5\107\uffd5\110\uffd5\111\uffd5\112\uffd5\001" + - "\002\000\004\021\146\001\002\000\156\004\uffd4\005\uffd4" + - "\007\uffd4\010\uffd4\025\uffd4\026\uffd4\027\uffd4\030\uffd4\031" + - "\uffd4\032\uffd4\033\uffd4\035\uffd4\036\uffd4\037\uffd4\040\uffd4" + - "\041\uffd4\042\uffd4\043\uffd4\044\uffd4\045\uffd4\046\uffd4\047" + - "\uffd4\050\uffd4\051\uffd4\052\uffd4\053\uffd4\054\uffd4\055\uffd4" + - "\056\uffd4\057\uffd4\060\uffd4\061\uffd4\062\uffd4\063\uffd4\064" + - "\uffd4\065\uffd4\066\uffd4\067\uffd4\070\uffd4\071\uffd4\072\uffd4" + - "\073\uffd4\074\uffd4\100\uffd4\101\uffd4\102\uffd4\103\uffd4\104" + - "\uffd4\105\uffd4\106\uffd4\107\uffd4\110\uffd4\111\uffd4\112\uffd4" + - "\001\002\000\146\004\uffda\005\uffda\007\uffda\010\uffda\025" + - "\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda\033\uffda" + - "\035\uffda\036\uffda\037\uffda\040\uffda\041\uffda\042\uffda\043" + - "\uffda\044\uffda\045\uffda\046\uffda\047\uffda\050\uffda\051\uffda" + - "\052\uffda\053\uffda\054\uffda\055\uffda\056\uffda\057\uffda\060" + - "\uffda\061\uffda\062\uffda\063\uffda\064\uffda\065\uffda\066\uffda" + - "\067\uffda\070\uffda\071\uffda\072\uffda\073\uffda\074\uffda\103" + - "\uffda\105\uffda\106\uffda\107\uffda\110\uffda\111\uffda\112\uffda" + - "\001\002\000\146\004\uffd9\005\uffd9\007\uffd9\010\uffd9\025" + - "\uffd9\026\uffd9\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9" + - "\035\uffd9\036\uffd9\037\uffd9\040\uffd9\041\uffd9\042\uffd9\043" + - "\uffd9\044\uffd9\045\uffd9\046\uffd9\047\uffd9\050\uffd9\051\uffd9" + - "\052\uffd9\053\uffd9\054\uffd9\055\uffd9\056\uffd9\057\uffd9\060" + - "\uffd9\061\uffd9\062\uffd9\063\uffd9\064\uffd9\065\uffd9\066\uffd9" + - "\067\uffd9\070\uffd9\071\uffd9\072\uffd9\073\uffd9\074\uffd9\103" + - "\uffd9\105\uffd9\106\uffd9\107\uffd9\110\uffd9\111\uffd9\112\uffd9" + - "\001\002\000\014\013\ufff8\022\ufff8\023\ufff8\024\ufff8\076" + - "\ufff8\001\002\000\150\002\uffee\003\uffee\004\uffee\006\uffee" + - "\010\uffee\016\uffee\021\uffee\026\uffee\027\uffee\030\uffee\031" + - "\uffee\032\uffee\033\uffee\034\uffee\037\uffee\040\uffee\041\uffee" + - "\042\uffee\043\uffee\044\uffee\045\uffee\046\uffee\047\uffee\050" + - "\uffee\051\uffee\052\uffee\053\uffee\054\uffee\055\uffee\056\uffee" + - "\057\uffee\060\uffee\061\uffee\062\uffee\063\uffee\064\uffee\065" + - "\uffee\066\uffee\067\uffee\070\uffee\071\uffee\072\uffee\073\uffee" + - "\074\uffee\103\uffee\105\uffee\106\uffee\107\uffee\110\uffee\111" + - "\uffee\112\uffee\001\002\000\140\004\uffe1\006\200\010\uffe1" + - "\026\uffe1\027\uffe1\030\uffe1\031\uffe1\032\uffe1\033\uffe1\034" + - "\176\037\uffe1\040\uffe1\041\uffe1\042\uffe1\043\uffe1\044\uffe1" + - "\045\uffe1\046\uffe1\047\uffe1\050\uffe1\051\uffe1\052\uffe1\053" + - "\uffe1\054\uffe1\055\uffe1\056\uffe1\057\uffe1\060\uffe1\061\uffe1" + - "\062\uffe1\063\uffe1\064\uffe1\065\uffe1\066\uffe1\067\uffe1\070" + - "\uffe1\071\uffe1\072\uffe1\073\uffe1\074\uffe1\103\uffe1\105\uffe1" + - "\106\uffe1\107\uffe1\110\uffe1\111\uffe1\112\uffe1\001\002\000" + - "\004\076\162\001\002\000\150\002\ufff3\003\ufff3\004\ufff3" + - "\006\ufff3\010\ufff3\016\ufff3\021\ufff3\026\ufff3\027\ufff3\030" + - "\ufff3\031\ufff3\032\ufff3\033\ufff3\034\ufff3\037\ufff3\040\ufff3" + - "\041\ufff3\042\ufff3\043\ufff3\044\ufff3\045\ufff3\046\ufff3\047" + - "\ufff3\050\ufff3\051\ufff3\052\ufff3\053\ufff3\054\ufff3\055\ufff3" + - "\056\ufff3\057\ufff3\060\ufff3\061\ufff3\062\ufff3\063\ufff3\064" + - "\ufff3\065\ufff3\066\ufff3\067\ufff3\070\ufff3\071\ufff3\072\ufff3" + - "\073\ufff3\074\ufff3\103\ufff3\105\ufff3\106\ufff3\107\ufff3\110" + - "\ufff3\111\ufff3\112\ufff3\001\002\000\146\002\000\003\152" + - "\004\uffe6\006\uffe6\010\uffe6\016\157\026\uffe6\027\uffe6\030" + - "\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\037\uffe6\040\uffe6" + - "\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045\uffe6\046\uffe6\047" + - "\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6\055\uffe6" + - "\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062\uffe6\063\uffe6\064" + - "\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6\071\uffe6\072\uffe6" + - "\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106\uffe6\107\uffe6\110" + - "\uffe6\111\uffe6\112\uffe6\001\002\000\004\076\162\001\002" + - "\000\150\002\ufff6\003\ufff6\004\ufff6\006\ufff6\010\ufff6\016" + - "\ufff6\021\ufff6\026\ufff6\027\ufff6\030\ufff6\031\ufff6\032\ufff6" + - "\033\ufff6\034\ufff6\037\ufff6\040\ufff6\041\ufff6\042\ufff6\043" + - "\ufff6\044\ufff6\045\ufff6\046\ufff6\047\ufff6\050\ufff6\051\ufff6" + - "\052\ufff6\053\ufff6\054\ufff6\055\ufff6\056\ufff6\057\ufff6\060" + - "\ufff6\061\ufff6\062\ufff6\063\ufff6\064\ufff6\065\ufff6\066\ufff6" + - "\067\ufff6\070\ufff6\071\ufff6\072\ufff6\073\ufff6\074\ufff6\103" + - "\ufff6\105\ufff6\106\ufff6\107\ufff6\110\ufff6\111\ufff6\112\ufff6" + - "\001\002\000\004\017\165\001\002\000\006\015\163\017" + - "\uffe4\001\002\000\006\017\uffe3\076\162\001\002\000\004" + - "\017\uffe5\001\002\000\142\004\uffe7\006\uffe7\010\uffe7\020" + - "\166\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7" + - "\034\uffe7\037\uffe7\040\uffe7\041\uffe7\042\uffe7\043\uffe7\044" + - "\uffe7\045\uffe7\046\uffe7\047\uffe7\050\uffe7\051\uffe7\052\uffe7" + - "\053\uffe7\054\uffe7\055\uffe7\056\uffe7\057\uffe7\060\uffe7\061" + - "\uffe7\062\uffe7\063\uffe7\064\uffe7\065\uffe7\066\uffe7\067\uffe7" + - "\070\uffe7\071\uffe7\072\uffe7\073\uffe7\074\uffe7\103\uffe7\105" + - "\uffe7\106\uffe7\107\uffe7\110\uffe7\111\uffe7\112\uffe7\001\002" + - "\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016\154\026" + - "\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6" + - "\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045" + - "\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + - "\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062" + - "\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6" + - "\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106" + - "\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002\000\146" + - "\003\152\004\uffe6\006\uffe6\010\uffe6\016\157\021\170\026" + - "\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6" + - "\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044\uffe6\045" + - "\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + - "\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061\uffe6\062" + - "\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6\070\uffe6" + - "\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105\uffe6\106" + - "\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002\000\150" + - "\002\ufff5\003\ufff5\004\ufff5\006\ufff5\010\ufff5\016\ufff5\021" + - "\ufff5\026\ufff5\027\ufff5\030\ufff5\031\ufff5\032\ufff5\033\ufff5" + - "\034\ufff5\037\ufff5\040\ufff5\041\ufff5\042\ufff5\043\ufff5\044" + - "\ufff5\045\ufff5\046\ufff5\047\ufff5\050\ufff5\051\ufff5\052\ufff5" + - "\053\ufff5\054\ufff5\055\ufff5\056\ufff5\057\ufff5\060\ufff5\061" + - "\ufff5\062\ufff5\063\ufff5\064\ufff5\065\ufff5\066\ufff5\067\ufff5" + - "\070\ufff5\071\ufff5\072\ufff5\073\ufff5\074\ufff5\103\ufff5\105" + - "\ufff5\106\ufff5\107\ufff5\110\ufff5\111\ufff5\112\ufff5\001\002" + - "\000\004\017\172\001\002\000\142\004\uffe7\006\uffe7\010" + - "\uffe7\020\173\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7" + - "\033\uffe7\034\uffe7\037\uffe7\040\uffe7\041\uffe7\042\uffe7\043" + - "\uffe7\044\uffe7\045\uffe7\046\uffe7\047\uffe7\050\uffe7\051\uffe7" + - "\052\uffe7\053\uffe7\054\uffe7\055\uffe7\056\uffe7\057\uffe7\060" + - "\uffe7\061\uffe7\062\uffe7\063\uffe7\064\uffe7\065\uffe7\066\uffe7" + - "\067\uffe7\070\uffe7\071\uffe7\072\uffe7\073\uffe7\074\uffe7\103" + - "\uffe7\105\uffe7\106\uffe7\107\uffe7\110\uffe7\111\uffe7\112\uffe7" + - "\001\002\000\144\003\152\004\uffe6\006\uffe6\010\uffe6\016" + - "\154\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + - "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + - "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + - "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + - "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + - "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + - "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + - "\000\146\003\152\004\uffe6\006\uffe6\010\uffe6\016\157\021" + - "\175\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + - "\034\uffe6\037\uffe6\040\uffe6\041\uffe6\042\uffe6\043\uffe6\044" + - "\uffe6\045\uffe6\046\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6" + - "\053\uffe6\054\uffe6\055\uffe6\056\uffe6\057\uffe6\060\uffe6\061" + - "\uffe6\062\uffe6\063\uffe6\064\uffe6\065\uffe6\066\uffe6\067\uffe6" + - "\070\uffe6\071\uffe6\072\uffe6\073\uffe6\074\uffe6\103\uffe6\105" + - "\uffe6\106\uffe6\107\uffe6\110\uffe6\111\uffe6\112\uffe6\001\002" + - "\000\150\002\ufff4\003\ufff4\004\ufff4\006\ufff4\010\ufff4\016" + - "\ufff4\021\ufff4\026\ufff4\027\ufff4\030\ufff4\031\ufff4\032\ufff4" + - "\033\ufff4\034\ufff4\037\ufff4\040\ufff4\041\ufff4\042\ufff4\043" + - "\ufff4\044\ufff4\045\ufff4\046\ufff4\047\ufff4\050\ufff4\051\ufff4" + - "\052\ufff4\053\ufff4\054\ufff4\055\ufff4\056\ufff4\057\ufff4\060" + - "\ufff4\061\ufff4\062\ufff4\063\ufff4\064\ufff4\065\ufff4\066\ufff4" + - "\067\ufff4\070\ufff4\071\ufff4\072\ufff4\073\ufff4\074\ufff4\103" + - "\ufff4\105\ufff4\106\ufff4\107\ufff4\110\ufff4\111\ufff4\112\ufff4" + - "\001\002\000\004\075\216\001\002\000\134\004\066\010" + - "\064\026\056\027\043\030\072\031\060\032\076\033\023" + - "\037\061\040\033\041\021\042\074\043\063\044\062\045" + - "\073\046\071\047\036\050\050\051\101\052\053\053\052" + - "\054\047\055\055\056\054\057\044\060\042\061\067\062" + - "\040\063\102\064\032\065\051\066\031\067\034\070\020" + - "\071\075\072\100\073\025\074\026\103\037\105\070\106" + - "\041\107\035\110\022\111\077\112\024\001\002\000\134" + - "\004\uffe2\010\uffe2\026\uffe2\027\uffe2\030\uffe2\031\uffe2\032" + - "\uffe2\033\uffe2\037\uffe2\040\uffe2\041\uffe2\042\uffe2\043\uffe2" + - "\044\uffe2\045\uffe2\046\uffe2\047\uffe2\050\uffe2\051\uffe2\052" + - "\uffe2\053\uffe2\054\uffe2\055\uffe2\056\uffe2\057\uffe2\060\uffe2" + - "\061\uffe2\062\uffe2\063\uffe2\064\uffe2\065\uffe2\066\uffe2\067" + - "\uffe2\070\uffe2\071\uffe2\072\uffe2\073\uffe2\074\uffe2\103\uffe2" + - "\105\uffe2\106\uffe2\107\uffe2\110\uffe2\111\uffe2\112\uffe2\001" + - "\002\000\014\007\210\025\205\035\202\036\204\103\104" + - "\001\002\000\150\002\uffe8\003\uffe8\004\uffe8\006\uffe8\010" + - "\uffe8\016\uffe8\021\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8" + - "\032\uffe8\033\uffe8\034\uffe8\037\uffe8\040\uffe8\041\uffe8\042" + - "\uffe8\043\uffe8\044\uffe8\045\uffe8\046\uffe8\047\uffe8\050\uffe8" + - "\051\uffe8\052\uffe8\053\uffe8\054\uffe8\055\uffe8\056\uffe8\057" + - "\uffe8\060\uffe8\061\uffe8\062\uffe8\063\uffe8\064\uffe8\065\uffe8" + - "\066\uffe8\067\uffe8\070\uffe8\071\uffe8\072\uffe8\073\uffe8\074" + - "\uffe8\103\uffe8\105\uffe8\106\uffe8\107\uffe8\110\uffe8\111\uffe8" + - "\112\uffe8\001\002\000\150\002\uffe9\003\uffe9\004\uffe9\006" + - "\uffe9\010\uffe9\016\uffe9\021\uffe9\026\uffe9\027\uffe9\030\uffe9" + - "\031\uffe9\032\uffe9\033\uffe9\034\uffe9\037\uffe9\040\uffe9\041" + - "\uffe9\042\uffe9\043\uffe9\044\uffe9\045\uffe9\046\uffe9\047\uffe9" + - "\050\uffe9\051\uffe9\052\uffe9\053\uffe9\054\uffe9\055\uffe9\056" + - "\uffe9\057\uffe9\060\uffe9\061\uffe9\062\uffe9\063\uffe9\064\uffe9" + - "\065\uffe9\066\uffe9\067\uffe9\070\uffe9\071\uffe9\072\uffe9\073" + - "\uffe9\074\uffe9\103\uffe9\105\uffe9\106\uffe9\107\uffe9\110\uffe9" + - "\111\uffe9\112\uffe9\001\002\000\134\004\066\010\064\026" + - "\056\027\043\030\072\031\060\032\076\033\023\037\061" + - "\040\033\041\021\042\074\043\063\044\062\045\073\046" + - "\071\047\036\050\050\051\101\052\053\053\052\054\047" + - "\055\055\056\054\057\044\060\042\061\067\062\040\063" + - "\102\064\032\065\051\066\031\067\034\070\020\071\075" + - "\072\100\073\025\074\026\103\037\105\070\106\041\107" + - "\035\110\022\111\077\112\024\001\002\000\004\075\213" + - "\001\002\000\006\025\205\035\211\001\002\000\150\002" + - "\ufff2\003\ufff2\004\ufff2\006\ufff2\010\ufff2\016\ufff2\021\ufff2" + - "\026\ufff2\027\ufff2\030\ufff2\031\ufff2\032\ufff2\033\ufff2\034" + - "\ufff2\037\ufff2\040\ufff2\041\ufff2\042\ufff2\043\ufff2\044\ufff2" + - "\045\ufff2\046\ufff2\047\ufff2\050\ufff2\051\ufff2\052\ufff2\053" + - "\ufff2\054\ufff2\055\ufff2\056\ufff2\057\ufff2\060\ufff2\061\ufff2" + - "\062\ufff2\063\ufff2\064\ufff2\065\ufff2\066\ufff2\067\ufff2\070" + - "\ufff2\071\ufff2\072\ufff2\073\ufff2\074\ufff2\103\ufff2\105\ufff2" + - "\106\ufff2\107\ufff2\110\ufff2\111\ufff2\112\ufff2\001\002\000" + - "\006\025\uffed\035\uffed\001\002\000\150\002\ufff0\003\ufff0" + - "\004\ufff0\006\ufff0\010\ufff0\016\ufff0\021\ufff0\026\ufff0\027" + - "\ufff0\030\ufff0\031\ufff0\032\ufff0\033\ufff0\034\ufff0\037\ufff0" + - "\040\ufff0\041\ufff0\042\ufff0\043\ufff0\044\ufff0\045\ufff0\046" + - "\ufff0\047\ufff0\050\ufff0\051\ufff0\052\ufff0\053\ufff0\054\ufff0" + - "\055\ufff0\056\ufff0\057\ufff0\060\ufff0\061\ufff0\062\ufff0\063" + - "\ufff0\064\ufff0\065\ufff0\066\ufff0\067\ufff0\070\ufff0\071\ufff0" + - "\072\ufff0\073\ufff0\074\ufff0\103\ufff0\105\ufff0\106\ufff0\107" + - "\ufff0\110\ufff0\111\ufff0\112\ufff0\001\002\000\150\002\ufff1" + - "\003\ufff1\004\ufff1\006\ufff1\010\ufff1\016\ufff1\021\ufff1\026" + - "\ufff1\027\ufff1\030\ufff1\031\ufff1\032\ufff1\033\ufff1\034\ufff1" + - "\037\ufff1\040\ufff1\041\ufff1\042\ufff1\043\ufff1\044\ufff1\045" + - "\ufff1\046\ufff1\047\ufff1\050\ufff1\051\ufff1\052\ufff1\053\ufff1" + - "\054\ufff1\055\ufff1\056\ufff1\057\ufff1\060\ufff1\061\ufff1\062" + - "\ufff1\063\ufff1\064\ufff1\065\ufff1\066\ufff1\067\ufff1\070\ufff1" + - "\071\ufff1\072\ufff1\073\ufff1\074\ufff1\103\ufff1\105\ufff1\106" + - "\ufff1\107\ufff1\110\ufff1\111\ufff1\112\ufff1\001\002\000\150" + - "\002\uffea\003\uffea\004\uffea\006\uffea\010\uffea\016\uffea\021" + - "\uffea\026\uffea\027\uffea\030\uffea\031\uffea\032\uffea\033\uffea" + - "\034\uffea\037\uffea\040\uffea\041\uffea\042\uffea\043\uffea\044" + - "\uffea\045\uffea\046\uffea\047\uffea\050\uffea\051\uffea\052\uffea" + - "\053\uffea\054\uffea\055\uffea\056\uffea\057\uffea\060\uffea\061" + - "\uffea\062\uffea\063\uffea\064\uffea\065\uffea\066\uffea\067\uffea" + - "\070\uffea\071\uffea\072\uffea\073\uffea\074\uffea\103\uffea\105" + - "\uffea\106\uffea\107\uffea\110\uffea\111\uffea\112\uffea\001\002" + - "\000\012\007\215\025\uffec\035\uffec\103\104\001\002\000" + - "\006\025\uffeb\035\uffeb\001\002\000\150\002\uffef\003\uffef" + - "\004\uffef\006\uffef\010\uffef\016\uffef\021\uffef\026\uffef\027" + - "\uffef\030\uffef\031\uffef\032\uffef\033\uffef\034\uffef\037\uffef" + - "\040\uffef\041\uffef\042\uffef\043\uffef\044\uffef\045\uffef\046" + - "\uffef\047\uffef\050\uffef\051\uffef\052\uffef\053\uffef\054\uffef" + - "\055\uffef\056\uffef\057\uffef\060\uffef\061\uffef\062\uffef\063" + - "\uffef\064\uffef\065\uffef\066\uffef\067\uffef\070\uffef\071\uffef" + - "\072\uffef\073\uffef\074\uffef\103\uffef\105\uffef\106\uffef\107" + - "\uffef\110\uffef\111\uffef\112\uffef\001\002" }); - - /** Access to parse-action table. */ - public short[][] action_table() {return _action_table;} - - /** reduce_goto table. */ - protected static final short[][] _reduce_table = - unpackFromStrings(new String[] { - "\000\214\000\004\005\004\001\001\000\004\002\007\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\004\003\012\001\001\000\002\001\001\000\010\004" + - "\154\016\152\021\155\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\016\006" + - "\026\007\027\010\064\011\044\012\056\020\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\002\001\001\000\012\010\106\011\044\012" + - "\056\020\045\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\012\010\147\011" + - "\044\012\056\020\045\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\012\010\146\011\044\012" + - "\056\020\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\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" + - "\010\014\116\017\117\020\111\001\001\000\002\001\001" + - "\000\016\006\102\007\027\010\064\011\044\012\056\020" + - "\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\002\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + - "\002\001\001\000\014\007\105\010\064\011\044\012\056" + - "\020\045\001\001\000\002\001\001\000\012\010\106\011" + - "\044\012\056\020\045\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\010\014" + - "\116\017\133\020\111\001\001\000\010\014\116\017\127" + - "\020\111\001\001\000\002\001\001\000\002\001\001\000" + - "\002\001\001\000\006\014\124\020\121\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\010\014\116\017\131\020\111" + - "\001\001\000\002\001\001\000\006\014\124\020\121\001" + - "\001\000\002\001\001\000\006\014\124\020\121\001\001" + - "\000\002\001\001\000\006\014\124\020\121\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\022\176\001\001\000\004\015\170" + - "\001\001\000\002\001\001\000\006\004\157\016\152\001" + - "\001\000\004\015\160\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\004\015\163\001\001\000" + - "\002\001\001\000\002\001\001\000\010\004\154\016\152" + - "\021\166\001\001\000\006\004\157\016\152\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\010" + - "\004\154\016\152\021\173\001\001\000\006\004\157\016" + - "\152\001\001\000\002\001\001\000\002\001\001\000\016" + - "\006\200\007\027\010\064\011\044\012\056\020\045\001" + - "\001\000\002\001\001\000\010\013\205\023\202\024\206" + - "\001\001\000\002\001\001\000\002\001\001\000\016\006" + - "\213\007\027\010\064\011\044\012\056\020\045\001\001" + - "\000\002\001\001\000\004\023\211\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 reduce_goto table. */ - public short[][] reduce_table() {return _reduce_table;} - - /** Instance of action encapsulation class. */ - protected CUP$LexParse$actions action_obj; - - /** Action encapsulation object initializer. */ - protected void init_actions() - { - action_obj = new CUP$LexParse$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$LexParse$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;} - - /** EOF Symbol index. */ - public int EOF_sym() {return 0;} - - /** error Symbol index. */ - public int error_sym() {return 1;} - - - /** User initialization code. */ - public void user_init() throws java.lang.Exception - { - - action_obj.scanner = this.scanner; - - } - - - public LexScan scanner; - - public LexParse(LexScan scanner) { - super(scanner); - this.scanner = scanner; - } - - public CharClasses getCharClasses() { - return action_obj.charClasses; - } - - public EOFActions getEOFActions() { - return action_obj.eofActions; - } - - public void report_error(String message, Object info) { - if ( info instanceof java_cup.runtime.Symbol ) { - java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info; - - if (s.sym == sym.EOF) - Out.error(ErrorMessages.UNEXPECTED_EOF); - else - Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right); - } - else - Out.error(ErrorMessages.UNKNOWN_SYNTAX); - } - - public void report_fatal_error(String message, Object info) { - // report_error(message, info); - throw new GeneratorException(); - } - - -} - -/** Cup generated class to encapsulate user supplied action code.*/ -class CUP$LexParse$actions { - - - - LexScan scanner; - CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF); - RegExps regExps = new RegExps(); - Macros macros = new Macros(); - Integer stateNumber; - Timer t = new Timer(); - EOFActions eofActions = new EOFActions(); - - void fatalError(ErrorMessages message, int line, int col) { - syntaxError(message, line, col); - throw new GeneratorException(); - } - - void fatalError(ErrorMessages message) { - fatalError(message, scanner.currentLine(), -1); - throw new GeneratorException(); - } - - void syntaxError(ErrorMessages message) { - Out.error(scanner.file, message, scanner.currentLine(), -1); - } - - void syntaxError(ErrorMessages message, int line) { - Out.error(scanner.file, message, line, -1); - } - - void syntaxError(ErrorMessages message, int line, int col) { - Out.error(scanner.file, message, line, col); - } - - - private boolean check(int type, char c) { - switch (type) { - case sym.JLETTERCLASS: - return Character.isJavaIdentifierStart(c); - - case sym.JLETTERDIGITCLASS: - return Character.isJavaIdentifierPart(c); - - case sym.LETTERCLASS: - return Character.isLetter(c); - - case sym.DIGITCLASS: - return Character.isDigit(c); - - case sym.UPPERCLASS: - return Character.isUpperCase(c); - - case sym.LOWERCLASS: - return Character.isLowerCase(c); - - case sym.UNICODE_UNASSIGNED: - return Character.getType(c) == Character.UNASSIGNED; - - case sym.UNICODE_UPPERCASE_LETTER: - return Character.getType(c) == Character.UPPERCASE_LETTER; - - case sym.UNICODE_LOWERCASE_LETTER: - return Character.getType(c) == Character.LOWERCASE_LETTER; - - case sym.UNICODE_TITLECASE_LETTER: - return Character.getType(c) == Character.TITLECASE_LETTER; - - case sym.UNICODE_MODIFIER_LETTER: - return Character.getType(c) == Character.MODIFIER_LETTER; - - case sym.UNICODE_OTHER_LETTER: - return Character.getType(c) == Character.OTHER_LETTER; - - case sym.UNICODE_NON_SPACING_MARK: - return Character.getType(c) == Character.NON_SPACING_MARK; - - case sym.UNICODE_ENCLOSING_MARK: - return Character.getType(c) == Character.ENCLOSING_MARK; - - case sym.UNICODE_COMBINING_SPACING_MARK: - return Character.getType(c) == Character.COMBINING_SPACING_MARK; - - case sym.UNICODE_DECIMAL_DIGIT_NUMBER: - return Character.getType(c) == Character.DECIMAL_DIGIT_NUMBER; - - case sym.UNICODE_LETTER_NUMBER: - return Character.getType(c) == Character.LETTER_NUMBER; - - case sym.UNICODE_OTHER_NUMBER: - return Character.getType(c) == Character.OTHER_NUMBER; - - case sym.UNICODE_SPACE_SEPARATOR: - return Character.getType(c) == Character.SPACE_SEPARATOR; - - case sym.UNICODE_LINE_SEPARATOR: - return Character.getType(c) == Character.LINE_SEPARATOR; - - case sym.UNICODE_PARAGRAPH_SEPARATOR: - return Character.getType(c) == Character.PARAGRAPH_SEPARATOR; - - case sym.UNICODE_CONTROL: - return Character.getType(c) == Character.CONTROL; - - case sym.UNICODE_FORMAT: - return Character.getType(c) == Character.FORMAT; - - case sym.UNICODE_PRIVATE_USE: - return Character.getType(c) == Character.PRIVATE_USE; - - case sym.UNICODE_SURROGATE: - return Character.getType(c) == Character.SURROGATE; - - case sym.UNICODE_DASH_PUNCTUATION: - return Character.getType(c) == Character.DASH_PUNCTUATION; - - case sym.UNICODE_START_PUNCTUATION: - return Character.getType(c) == Character.START_PUNCTUATION; - - case sym.UNICODE_END_PUNCTUATION: - return Character.getType(c) == Character.END_PUNCTUATION; - - case sym.UNICODE_CONNECTOR_PUNCTUATION: - return Character.getType(c) == Character.CONNECTOR_PUNCTUATION; - - case sym.UNICODE_OTHER_PUNCTUATION: - return Character.getType(c) == Character.OTHER_PUNCTUATION; - - case sym.UNICODE_MATH_SYMBOL: - return Character.getType(c) == Character.MATH_SYMBOL; - - case sym.UNICODE_CURRENCY_SYMBOL: - return Character.getType(c) == Character.CURRENCY_SYMBOL; - - case sym.UNICODE_MODIFIER_SYMBOL: - return Character.getType(c) == Character.MODIFIER_SYMBOL; - - case sym.UNICODE_OTHER_SYMBOL: - return Character.getType(c) == Character.OTHER_SYMBOL; - - case sym.UNICODE_INITIAL_QUOTE_PUNCTUATION: - return Character.getType(c) == Character.INITIAL_QUOTE_PUNCTUATION; - - case sym.UNICODE_FINAL_QUOTE_PUNCTUATION: - return Character.getType(c) == Character.FINAL_QUOTE_PUNCTUATION; - - default: return false; - } - } - - private Vector makePreClass(int type) { - - Vector result = new Vector(); - - char c = 0; - char start = 0; - char last = charClasses.getMaxCharCode(); - - boolean prev, current; - - prev = check(type,'\u0000'); - - for (c = 1; c < last; c++) { - - current = check(type,c); - - if (!prev && current) start = c; - if (prev && !current) { - result.addElement(new Interval(start, (char)(c-1))); - } - - prev = current; - } - - // the last iteration is moved out of the loop to - // avoid an endless loop if last == maxCharCode and - // last+1 == 0 - current = check(type,c); - - if (!prev && current) result.addElement(new Interval(c,c)); - if (prev && current) result.addElement(new Interval(start, c)); - if (prev && !current) result.addElement(new Interval(start, (char)(c-1))); - - return result; - } - - private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) { - - if (n1 <= 0 && n2 <= 0) { - syntaxError(ErrorMessages.REPEAT_ZERO, line, col); - return null; - } - - if (n1 > n2) { - syntaxError(ErrorMessages.REPEAT_GREATER, line, col); - return null; - } - - int i; - RegExp result; - - if (n1 > 0) { - result = r; - n1--; n2--; // we need one concatenation less than the number of expressions to match - } - else { - result = new RegExp1(sym.QUESTION,r); - n2--; - } - - for (i = 0; i < n1; i++) - result = new RegExp2(sym.CONCAT, result, r); - - n2-= n1; - for (i = 0; i < n2; i++) - result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r)); - - return result; - } - - private RegExp makeNL() { - Vector list = new Vector(); - list.addElement(new Interval('\n','\r')); - list.addElement(new Interval('\u0085','\u0085')); - list.addElement(new Interval('\u2028','\u2029')); - - // assumption: line feeds are caseless - charClasses.makeClass(list, false); - charClasses.makeClass('\n', false); - charClasses.makeClass('\r', false); - - RegExp1 c = new RegExp1(sym.CCLASS, list); - Character n = new Character('\n'); - Character r = new Character('\r'); - - return new RegExp2(sym.BAR, - c, - new RegExp2(sym.CONCAT, - new RegExp1(sym.CHAR, r), - new RegExp1(sym.CHAR, n))); - } - - - private final LexParse parser; - - /** Constructor */ - CUP$LexParse$actions(LexParse parser) { - this.parser = parser; - } - - /** Method with the actual generated action code. */ - public final java_cup.runtime.Symbol CUP$LexParse$do_action( - int CUP$LexParse$act_num, - java_cup.runtime.lr_parser CUP$LexParse$parser, - java.util.Stack CUP$LexParse$stack, - int CUP$LexParse$top) - throws java.lang.Exception - { - /* Symbol object for return from actions */ - java_cup.runtime.Symbol CUP$LexParse$result; - - /* select the action based on the action number */ - switch (CUP$LexParse$act_num) - { - /*. . . . . . . . . . . . . . . . . . . .*/ - case 104: // preclass ::= UNICODE_FINAL_QUOTE_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_FINAL_QUOTE_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 103: // preclass ::= UNICODE_INITIAL_QUOTE_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_INITIAL_QUOTE_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 102: // preclass ::= UNICODE_OTHER_SYMBOL - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_OTHER_SYMBOL); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 101: // preclass ::= UNICODE_MODIFIER_SYMBOL - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_MODIFIER_SYMBOL); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 100: // preclass ::= UNICODE_CURRENCY_SYMBOL - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_CURRENCY_SYMBOL); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 99: // preclass ::= UNICODE_MATH_SYMBOL - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_MATH_SYMBOL); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 98: // preclass ::= UNICODE_OTHER_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_OTHER_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 97: // preclass ::= UNICODE_CONNECTOR_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_CONNECTOR_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 96: // preclass ::= UNICODE_END_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_END_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 95: // preclass ::= UNICODE_START_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_START_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 94: // preclass ::= UNICODE_DASH_PUNCTUATION - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_DASH_PUNCTUATION); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 93: // preclass ::= UNICODE_SURROGATE - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_SURROGATE); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 92: // preclass ::= UNICODE_PRIVATE_USE - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_PRIVATE_USE); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 91: // preclass ::= UNICODE_FORMAT - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_FORMAT); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 90: // preclass ::= UNICODE_CONTROL - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_CONTROL); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 89: // preclass ::= UNICODE_PARAGRAPH_SEPARATOR - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_PARAGRAPH_SEPARATOR); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 88: // preclass ::= UNICODE_LINE_SEPARATOR - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_LINE_SEPARATOR); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 87: // preclass ::= UNICODE_SPACE_SEPARATOR - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_SPACE_SEPARATOR); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 86: // preclass ::= UNICODE_OTHER_NUMBER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_OTHER_NUMBER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 85: // preclass ::= UNICODE_LETTER_NUMBER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_LETTER_NUMBER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 84: // preclass ::= UNICODE_DECIMAL_DIGIT_NUMBER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_DECIMAL_DIGIT_NUMBER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 83: // preclass ::= UNICODE_COMBINING_SPACING_MARK - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_COMBINING_SPACING_MARK); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 82: // preclass ::= UNICODE_ENCLOSING_MARK - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_ENCLOSING_MARK); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 81: // preclass ::= UNICODE_NON_SPACING_MARK - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_NON_SPACING_MARK); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 80: // preclass ::= UNICODE_OTHER_LETTER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_OTHER_LETTER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 79: // preclass ::= UNICODE_MODIFIER_LETTER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_MODIFIER_LETTER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 78: // preclass ::= UNICODE_TITLECASE_LETTER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_TITLECASE_LETTER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 77: // preclass ::= UNICODE_LOWERCASE_LETTER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_LOWERCASE_LETTER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 76: // preclass ::= UNICODE_UPPERCASE_LETTER - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_UPPERCASE_LETTER); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 75: // preclass ::= UNICODE_UNASSIGNED - { - Vector RESULT =null; - RESULT = makePreClass(sym.UNICODE_UNASSIGNED); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 74: // preclass ::= LOWERCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.LOWERCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 73: // preclass ::= UPPERCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.UPPERCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 72: // preclass ::= DIGITCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.DIGITCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 71: // preclass ::= LETTERCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.LETTERCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 70: // preclass ::= JLETTERDIGITCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.JLETTERDIGITCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 69: // preclass ::= JLETTERCLASS - { - Vector RESULT =null; - RESULT = makePreClass(sym.JLETTERCLASS); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 68: // classcontentelem ::= CHAR - { - Interval RESULT =null; - int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Interval(c.charValue(), c.charValue()); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 67: // classcontentelem ::= CHAR DASH CHAR - { - Interval RESULT =null; - int c1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int c1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Character c1 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int c2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int c2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Character c2 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Interval(c1.charValue(), c2.charValue()); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 66: // classcontent ::= MACROUSE - { - Vector RESULT =null; - int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 65: // classcontent ::= classcontent MACROUSE - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 64: // classcontent ::= STRING - { - Vector RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - RESULT = new Vector(); - for (int i = 0; i < s.length(); i++) - RESULT.addElement(new Interval(s.charAt(i),s.charAt(i))); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 63: // classcontent ::= classcontent STRING - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - for (int i = 0; i < s.length(); i++) - list.addElement(new Interval(s.charAt(i),s.charAt(i))); - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 62: // classcontent ::= preclass - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = list; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 61: // classcontent ::= classcontent preclass - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int plistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int plistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Vector plist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - for (Enumeration e = plist.elements(); e.hasMoreElements();) - list.addElement(e.nextElement()); - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 60: // classcontent ::= classcontentelem - { - Vector RESULT =null; - int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - list.addElement(elem); - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 59: // classcontent ::= classcontent classcontentelem - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - list.addElement(elem); - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 58: // charclass ::= OPENCLASS HAT DASH classcontent CLOSECLASS - { - RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - list.addElement(new Interval('-','-')); - charClasses.makeClassNot(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 57: // charclass ::= OPENCLASS DASH classcontent CLOSECLASS - { - RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - list.addElement(new Interval('-','-')); - charClasses.makeClass(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 56: // charclass ::= OPENCLASS HAT classcontent CLOSECLASS - { - RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - charClasses.makeClassNot(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASSNOT,list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 55: // charclass ::= OPENCLASS HAT CLOSECLASS - { - RegExp RESULT =null; - int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - list.addElement(new Interval((char)0,CharClasses.maxChar)); - try { - charClasses.makeClass(list, false); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 54: // charclass ::= OPENCLASS classcontent CLOSECLASS - { - RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - charClasses.makeClass(list, Options.jlex && scanner.caseless); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); - } - RESULT = new RegExp1(sym.CCLASS,list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 53: // charclass ::= OPENCLASS CLOSECLASS - { - RegExp RESULT =null; - - RESULT = new RegExp1(sym.CCLASS,null); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 52: // regexp ::= CHAR - { - RegExp RESULT =null; - int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - if ( scanner.caseless ) { - charClasses.makeClass(c.charValue(), true); - RESULT = new RegExp1(sym.CHAR_I, c); - } - else { - charClasses.makeClass(c.charValue(), false); - RESULT = new RegExp1(sym.CHAR, c); - } - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright); - } - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 51: // regexp ::= POINT - { - RegExp RESULT =null; - - Vector any = new Vector(); - any.addElement(new Interval('\n','\n')); - // assumption: there is no upper case for \n - charClasses.makeClass('\n', false); - RESULT = new RegExp1(sym.CCLASSNOT, any); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 50: // regexp ::= STRING - { - RegExp RESULT =null; - int strleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int strright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String str = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - if ( scanner.caseless ) { - charClasses.makeClass(str, true); - RESULT = new RegExp1(sym.STRING_I, str); - } - else { - charClasses.makeClass(str, false); - RESULT = new RegExp1(sym.STRING, str); - } - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright); - } - - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 49: // regexp ::= preclass - { - RegExp RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - try { - // assumption [correct?]: preclasses are already closed under case - charClasses.makeClass(list, false); - } - catch (CharClassException e) { - syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft); - } - RESULT = new RegExp1(sym.CCLASS, list); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 48: // regexp ::= charclass - { - RegExp RESULT =null; - int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp c = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = c; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 47: // regexp ::= MACROUSE - { - RegExp RESULT =null; - int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - if ( !scanner.macroDefinition ) { - if ( ! macros.markUsed(ident) ) - throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, - identleft, identright); - } - RESULT = new RegExp1(sym.MACROUSE, ident); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 46: // regexp ::= OPENBRACKET series CLOSEBRACKET - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = r; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 45: // regexp ::= regexp REPEAT REPEAT RBRACE - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; - int n1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int n1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Integer n1 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int n2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int n2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Integer n2 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 44: // regexp ::= regexp REPEAT RBRACE - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int nleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int nright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Integer n = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 43: // regexp ::= regexp QUESTION - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.QUESTION, r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 42: // regexp ::= regexp PLUS - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.PLUS, r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 41: // regexp ::= regexp STAR - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp1(sym.STAR, r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 40: // nregexp ::= TILDE nregexp - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp1(sym.TILDE, r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 39: // nregexp ::= BANG nregexp - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp1(sym.BANG, r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 38: // nregexp ::= regexp - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 37: // concs ::= nregexp - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 36: // concs ::= concs nregexp - { - RegExp RESULT =null; - int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp2(sym.CONCAT, r1, r2); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 35: // series ::= BAR - { - RegExp RESULT =null; - int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 34: // series ::= concs - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 33: // series ::= series BAR concs - { - RegExp RESULT =null; - int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new RegExp2(sym.BAR, r1, r2); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 32: // hatOPT ::= - { - Boolean RESULT =null; - RESULT = new Boolean(false); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 31: // hatOPT ::= HAT - { - Boolean RESULT =null; - // assumption: there is no upper case for \n - charClasses.makeClass('\n', false); - RESULT = new Boolean(true); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 30: // states ::= IDENT COMMA - { - Vector RESULT =null; - int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object c = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 29: // states ::= IDENT - { - Vector RESULT =null; - int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - Vector list = new Vector(); - stateNumber = scanner.states.getNumber( id ); - if ( stateNumber != null ) - list.addElement( stateNumber ); - else { - throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, - idleft, idright); - } - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 28: // states ::= IDENT COMMA states - { - Vector RESULT =null; - int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - - stateNumber = scanner.states.getNumber( id ); - if ( stateNumber != null ) - list.addElement( stateNumber ); - else { - throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, - idleft, idright); - } - RESULT = list; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 27: // statesOPT ::= - { - Vector RESULT =null; - RESULT = new Vector(); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 26: // statesOPT ::= LESSTHAN states MORETHAN - { - Vector RESULT =null; - int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = list; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 25: // actions ::= NOACTION - { - Action RESULT =null; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 24: // actions ::= act - { - Action RESULT =null; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = a; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 23: // act ::= REGEXPEND ACTION - { - Action RESULT =null; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = a; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("act",17, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 22: // lookahead ::= LOOKAHEAD series DOLLAR - { - RegExp RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp s = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = new RegExp2(sym.CONCAT, s, makeNL()); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 21: // lookahead ::= LOOKAHEAD series - { - RegExp RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = r; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 20: // lookahead ::= DOLLAR - { - RegExp RESULT =null; - RESULT = makeNL(); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 19: // rule ::= error - { - Integer RESULT =null; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 18: // rule ::= statesOPT EOFRULE ACTION - { - Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(s, a)); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 17: // rule ::= statesOPT hatOPT series lookahead NOACTION - { - Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; - int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object a = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 16: // rule ::= statesOPT hatOPT series lookahead act - { - Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; - int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 15: // rule ::= statesOPT hatOPT series actions - { - Integer RESULT =null; - int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; - int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; - int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; - Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 14: // rules ::= rule - { - Vector RESULT =null; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - RESULT = new Vector(); RESULT.addElement(r); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 13: // rules ::= LESSTHAN states MORETHAN LBRACE rules RBRACE - { - Vector RESULT =null; - int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; - int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - - Enumeration rs = rlist.elements(); - while ( rs.hasMoreElements() ) { - Integer elem = (Integer) rs.nextElement(); - // might be null for error case of "rule" - if (elem != null) { - regExps.addStates( elem.intValue(), states ); - } - } - RESULT = rlist; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-5)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 12: // rules ::= rules LESSTHAN states MORETHAN LBRACE rules RBRACE - { - Vector RESULT =null; - int rlist1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).left; - int rlist1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).right; - Vector rlist1 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).value; - int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; - int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; - Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; - int rlist2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rlist2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector rlist2 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - - Enumeration rs = rlist2.elements(); - while ( rs.hasMoreElements() ) { - Integer elem = (Integer) rs.nextElement(); - // might be null for error case of "rule" - if (elem != null) { - regExps.addStates( elem.intValue(), states ); - } - rlist1.addElement( elem ); - } - RESULT = rlist1; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 11: // rules ::= rules rule - { - Vector RESULT =null; - int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - rlist.addElement(r); RESULT = rlist; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 10: // macro ::= IDENT EQUALS - { - Object RESULT =null; - int eleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; - int eright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; - Object e = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; - syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 9: // macro ::= IDENT EQUALS series REGEXPEND - { - Object RESULT =null; - int nameleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; - int nameright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; - String name = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; - int definitionleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int definitionright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - RegExp definition = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - macros.insert(name, definition); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 8: // macro ::= UNICODE - { - Object RESULT =null; - charClasses.setMaxCharCode(0xFFFF); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 7: // macro ::= FULL - { - Object RESULT =null; - charClasses.setMaxCharCode(255); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 6: // macro ::= ASCII - { - Object RESULT =null; - charClasses.setMaxCharCode(127); - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 5: // macros ::= error - { - Object RESULT =null; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 4: // macros ::= macros macro - { - Object RESULT =null; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 3: // macros ::= - { - Object RESULT =null; - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 2: // specification ::= - { - NFA RESULT =null; - - fatalError(ErrorMessages.NO_LEX_SPEC); - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 1: // specification ::= USERCODE macros DELIMITER rules - { - NFA RESULT =null; - - scanner.t.stop(); - - Out.checkErrors(); - - Out.time(ErrorMessages.PARSING_TOOK, t); - - macros.expand(); - Enumeration unused = macros.unused(); - while ( unused.hasMoreElements() ) { - Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used."); - } - - SemCheck.check(regExps, macros, scanner.file); - - regExps.checkActions(); - regExps.checkLookAheads(); - - Out.checkErrors(); - - if (Options.dump) charClasses.dump(); - - Out.print("Constructing NFA : "); - - t.start(); - int num = regExps.getNum(); - - RESULT = new NFA(charClasses.getNumClasses(), - scanner, regExps, macros, charClasses); - - eofActions.setNumLexStates(scanner.states.number()); - - for (int i = 0; i < num; i++) { - if (regExps.isEOF(i)) - eofActions.add( regExps.getStates(i), regExps.getAction(i) ); - else - RESULT.addRegExp(i); - } - - if (scanner.standalone) RESULT.addStandaloneRule(); - t.stop(); - - Out.time(""); - Out.time(ErrorMessages.NFA_TOOK, t); - - - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - return CUP$LexParse$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 0: // $START ::= specification EOF - { - Object RESULT =null; - int start_valleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; - int start_valright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; - NFA start_val = (NFA)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; - RESULT = start_val; - CUP$LexParse$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); - } - /* ACCEPT */ - CUP$LexParse$parser.done_parsing(); - return CUP$LexParse$result; - - /* . . . . . .*/ - default: - throw new Exception( - "Invalid action number found in internal parse table"); - - } - } -} - diff --git a/tools/lexer/jflex-1.4/src/JFlex/LexScan.flex b/tools/lexer/jflex-1.4/src/JFlex/LexScan.flex deleted file mode 100644 index d8f0e6e251d8..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/LexScan.flex +++ /dev/null @@ -1,613 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java_cup.runtime.Symbol; -import java.util.Vector; -import java.io.*; -import java.util.Stack; - -/** - * The lexer of JFlex. - * - * Generated by JFlex. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -%% - -%final -%public -%class LexScan -%implements sym, java_cup.runtime.Scanner -%function next_token - -%type Symbol -%unicode - -%column -%line - -%eofclose - -%state COMMENT, STATELIST, MACROS, REGEXPSTART -%state REGEXP, JAVA_CODE, STATES, STRING_CONTENT -%state CHARCLASS, COPY, REPEATEXP, EATWSPNL -%state CTOR_ARG - -%cupdebug - -%{ - int balance = 0; - int commentbalance = 0; - int action_line = 0; - int bufferSize = 16384; - - File file; - Stack files = new Stack(); - - StringBuffer userCode = new StringBuffer(); - - String classCode; - String initCode; - String initThrow; - String eofCode; - String eofThrow; - String lexThrow; - String eofVal; - String scanErrorException; - String cupSymbol = "sym"; - - StringBuffer actionText = new StringBuffer(); - StringBuffer string = new StringBuffer(); - - boolean charCount; - boolean lineCount; - boolean columnCount; - boolean cupCompatible; - boolean cupDebug; - boolean isInteger; - boolean isIntWrap; - boolean isYYEOF; - boolean notUnix; - boolean isPublic; - boolean isFinal; - boolean isAbstract; - boolean bolUsed; - boolean standalone; - boolean debugOption; - boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE; - boolean packed = Options.gen_method == Options.PACK; - boolean caseless; - boolean inclusive_states; - boolean eofclose; - boolean emitInputStreamCtor = Options.emitInputStreamCtor; - - String isImplementing; - String isExtending; - String className = "Yylex"; - String functionName; - String tokenType; - String visibility = "public"; - - Vector /* String */ ctorArgs = new Vector(); - Vector /* String */ ctorTypes = new Vector(); - - LexicalStates states = new LexicalStates(); - - Vector actions = new Vector(); - - private int nextState; - - boolean macroDefinition; - - Timer t = new Timer(); - - public int currentLine() { - return yyline; - } - - public void setFile(File file) { - this.file = file; - } - - private Symbol symbol(int type, Object value) { - return new Symbol(type, yyline, yycolumn, value); - } - - private Symbol symbol(int type) { - return new Symbol(type, yyline, yycolumn); - } - - // updates line and column count to the beginning of the first - // non whitespace character in yytext, but leaves yyline+yycolumn - // untouched - private Symbol symbol_countUpdate(int type, Object value) { - int lc = yyline; - int cc = yycolumn; - String text = yytext(); - - for (int i=0; i < text.length(); i++) { - char c = text.charAt(i); - - if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) - return new Symbol(type, lc, cc, value); - - if (c == '\n') { - lc++; - cc = 0; - } - else - cc++; - } - - return new Symbol(type, yyline, yycolumn, value); - } - - private String makeMacroIdent() { - String matched = yytext().trim(); - return matched.substring(1, matched.length()-1).trim(); - } - - public static String conc(Object a, Object b) { - if (a == null && b == null) return null; - if (a == null) return b.toString(); - if (b == null) return a.toString(); - - return a.toString()+b.toString(); - } - - public static String concExc(Object a, Object b) { - if (a == null && b == null) return null; - if (a == null) return b.toString(); - if (b == null) return a.toString(); - - return a.toString()+", "+b.toString(); - } -%} - -%init{ - states.insert("YYINITIAL", true); -%init} - - -Digit = [0-9] -HexDigit = [0-9a-fA-F] -OctDigit = [0-7] - -Number = {Digit}+ -HexNumber = \\ x {HexDigit} {2} -Unicode = \\ u {HexDigit} {1, 4} -OctNumber = \\ [0-3]? {OctDigit} {1, 2} - -// see http://www.unicode.org/unicode/reports/tr18/ -WSP = [ \t\b] -WSPNL = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085\t\b\ ] -NL = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085] | \u000D\u000A -NNL = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085] - -Ident = {IdentStart} {IdentPart}* -QualIdent = {Ident} ( {WSP}* "." {WSP}* {Ident} )* -QUIL = {QualIdent} ( {WSP}* "," {WSP}* {QualIdent} )* -Array = "[" {WSP}* "]" -ParamPart = {IdentStart}|{IdentPart}|"<"|">"|","|{WSP}|"&"|"?"|"." -GenParam = "<" {ParamPart}+ ">" -ClassT = {Ident} ({WSP}* {GenParam})? -QClassT = {QualIdent} ({WSP}* {GenParam})? -ArrType = ({GenParam} {WSP}*)? {QClassT} ({WSP}* {Array})* - -IdentStart = [:jletter:] -IdentPart = [:jletterdigit:] - -JFlexCommentChar = [^*/]|"/"+[^*/]|"*"+[^*/] -JFlexComment = {JFlexCommentChar}* - -/* Java comments */ -JavaComment = {TraditionalComment}|{EndOfLineComment} -TraditionalComment = "/*"{CommentContent}\*+"/" -EndOfLineComment = "//".*{NL} - -CommentContent = ([^*]|\*+[^*/])* - -StringCharacter = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\"\\] - -CharLiteral = \'([^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\'\\]|{EscapeSequence})\' -StringLiteral = \"({StringCharacter}|{EscapeSequence})*\" - -EscapeSequence = \\[^\u2028\u2029\u000A\u000B\u000C\u000D\u0085]|\\+u{HexDigit}{4}|\\[0-3]?{OctDigit}{1,2} - -/* \\(b|t|n|f|r|\"|\'|\\|[0-3]?{OctDigit}{1,2}|u{HexDigit}{4}) */ - -JavaRest = [^\{\}\"\'/]|"/"[^*/] -JavaCode = ({JavaRest}|{StringLiteral}|{CharLiteral}|{JavaComment})+ - -%% - - { - "%%".*{NL}? { - t.start(); - yybegin(MACROS); - macroDefinition = true; - return symbol(USERCODE,userCode); - } - .*{NL} { userCode.append(yytext()); } - .* { return symbol(EOF); } -} - - ("%{"|"%init{"|"%initthrow{"|"%eof{"|"%eofthrow{"|"%yylexthrow{"|"%eofval{").*{NL} - { string.setLength(0); yybegin(COPY); } - { - "%}".*{NL} { classCode = conc(classCode,string); yybegin(MACROS); } - "%init}".*{NL} { initCode = conc(initCode,string); yybegin(MACROS); } - "%initthrow}".*{NL} { initThrow = concExc(initThrow,string); yybegin(MACROS); } - "%eof}".*{NL} { eofCode = conc(eofCode,string); yybegin(MACROS); } - "%eofthrow}".*{NL} { eofThrow = concExc(eofThrow,string); yybegin(MACROS); } - "%yylexthrow}".*{NL} { lexThrow = concExc(lexThrow,string); yybegin(MACROS); } - "%eofval}".*{NL} { eofVal = string.toString(); yybegin(MACROS); } - - .*{NL} { string.append(yytext()); } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } -} - - - ^"%s" ("tate" "s"?)? {WSP}+ { inclusive_states = true; yybegin(STATELIST); } - ^"%x" ("state" "s"?)? {WSP}+ { inclusive_states = false; yybegin(STATELIST); } - { - {Ident} { states.insert(yytext(),inclusive_states); } - ([\ \t]*","[\ \t]*)|([\ \t]+) { } - {NL} { yybegin(MACROS); } - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } -} - - { - "%char" { charCount = true; } - "%line" { lineCount = true; } - "%column" { columnCount = true; } - "%byaccj" { isInteger = true; - if (eofVal == null) - eofVal = "return 0;"; - eofclose = true; - } - "%cup" { cupCompatible = true; - isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner"); - if (functionName == null) - functionName = "next_token"; - if (tokenType == null) - tokenType = "java_cup.runtime.Symbol"; - if (eofVal == null) - eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);"; - if (!Options.jlex) eofclose = true; - } - "%cupsym"{WSP}+{QualIdent} {WSP}* { cupSymbol = yytext().substring(8).trim(); - if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); } - "%cupsym"{WSP}+{NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); } - "%cupdebug" { cupDebug = true; } - "%eofclose"({WSP}+"true")? { eofclose = true; } - "%eofclose"({WSP}+"false") { eofclose = false; } - "%class"{WSP}+{ClassT} {WSP}* { className = yytext().substring(7).trim(); } - "%ctorarg"{WSP}+{ArrType}{WSP}+ { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); } - "%function"{WSP}+{Ident} {WSP}* { functionName = yytext().substring(10).trim(); } - "%type"{WSP}+{ArrType} {WSP}* { tokenType = yytext().substring(6).trim(); } - "%integer"|"%int" { isInteger = true; } - "%intwrap" { isIntWrap = true; } - "%yyeof" { isYYEOF = true; } - "%notunix" { notUnix = true; } - "%7bit" { return symbol(ASCII); } - "%full"|"%8bit" { return symbol(FULL); } - "%unicode"|"%16bit" { return symbol(UNICODE); } - "%caseless"|"%ignorecase" { caseless = true; } - "%implements"{WSP}+.* { isImplementing = concExc(isImplementing, yytext().substring(12).trim()); } - "%extends"{WSP}+{QClassT}{WSP}* { isExtending = yytext().substring(9).trim(); } - "%public" { isPublic = true; } - "%apiprivate" { visibility = "private"; Skeleton.makePrivate(); } - "%final" { isFinal = true; } - "%abstract" { isAbstract = true; } - "%debug" { debugOption = true; } - "%standalone" { standalone = true; isInteger = true; } - "%switch" { packed = false; useRowMap = false; } - "%table" { packed = false; useRowMap = true; } - "%pack" { packed = true; useRowMap = true; } - "%include" {WSP}+ .* { File f = new File(yytext().substring(9).trim()); - if ( !f.canRead() ) - throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); - // check for cycle - if (files.search(f) > 0) - throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline); - try { - yypushStream( new FileReader(f) ); - files.push(file); - file = f; - Out.println("Including \""+file+"\""); - } - catch (FileNotFoundException e) { - throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); - } - } - "%buffer" {WSP}+ {Number} {WSP}* { bufferSize = Integer.parseInt(yytext().substring(8).trim()); } - "%buffer" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); } - "%initthrow" {WSP}+ {QUIL} {WSP}* { initThrow = concExc(initThrow,yytext().substring(11).trim()); } - "%initthrow" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); } - "%eofthrow" {WSP}+ {QUIL} {WSP}* { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); } - "%eofthrow" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); } - "%yylexthrow"{WSP}+ {QUIL} {WSP}* { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); } - "%throws" {WSP}+ {QUIL} {WSP}* { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); } - "%yylexthrow"{WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); } - "%throws" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); } - "%scanerror" {WSP}+ {QualIdent} {WSP}* { scanErrorException = yytext().substring(11).trim(); } - "%scanerror" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); } - - {Ident} { return symbol(IDENT, yytext()); } - "="{WSP}* { yybegin(REGEXP); return symbol(EQUALS); } - - "/*" { nextState = MACROS; yybegin(COMMENT); } - - {EndOfLineComment} { } - - /* no {NL} at the end of this expression, because - needs at least one {WSPNL} to start a regular expression! */ - ^"%%" {NNL}* { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); } - "%"{Ident} { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); } - "%" { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); } - ^{WSP}+"%" { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); } - - {WSP}+ { } - {NL}+ { } - <> { if ( yymoreStreams() ) { - file = (File) files.pop(); - yypopStream(); - } - else - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } -} - - { - {Ident} {WSP}* { yybegin(MACROS); ctorArgs.add(yytext().trim()); } - [^] { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); } -} - - { - {WSPNL}* "/*" { nextState = REGEXPSTART; yybegin(COMMENT); } - {WSPNL}+ { yybegin(REGEXP); } - {WSPNL}* "<" { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); } - {WSPNL}* "}" { return symbol_countUpdate(RBRACE, null); } - {WSPNL}* "//" {NNL}* { } - {WSPNL}* "<>" {WSPNL}* "{" - { actionText.setLength(0); yybegin(JAVA_CODE); - Symbol s = symbol_countUpdate(EOFRULE, null); - action_line = s.left+1; - return s; - } -} - - { - {Ident} { return symbol(IDENT, yytext()); } - "," { return symbol(COMMA); } - {WSPNL}+ { } - - // "{" will be caught in REGEXP - ">"{WSPNL}* { yybegin(REGEXP); return symbol(MORETHAN); } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); } -} - - - { - "<>" {WSPNL}+ "{" { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); } - "<>" { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); } - - {WSPNL}*"|"{WSP}*$ { if (macroDefinition) { - yybegin(EATWSPNL); - return symbol(BAR); - } - else { - yybegin(REGEXPSTART); - return symbol(NOACTION); - } - } - - // stategroup - "{" { yybegin(REGEXPSTART); return symbol(LBRACE); } - - {WSPNL}*"|" { return symbol(BAR); } - - {WSPNL}*\" { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); } - {WSPNL}*"!" { return symbol(BANG); } - {WSPNL}*"~" { return symbol(TILDE); } - {WSPNL}*"(" { return symbol(OPENBRACKET); } - {WSPNL}*")" { return symbol(CLOSEBRACKET); } - {WSPNL}*"*" { return symbol(STAR); } - {WSPNL}*"+" { return symbol(PLUS); } - {WSPNL}*"?" { return symbol(QUESTION); } - {WSPNL}*"$" { return symbol(DOLLAR); } - {WSPNL}*"^" { bolUsed = true; return symbol(HAT); } - {WSPNL}*"." { return symbol(POINT); } - {WSPNL}*"[" { yybegin(CHARCLASS); return symbol(OPENCLASS); } - {WSPNL}*"/" { return symbol(LOOKAHEAD); } - - {WSPNL}* "{" {WSP}* {Ident} {WSP}* "}" { return symbol_countUpdate(MACROUSE, makeMacroIdent()); } - {WSPNL}* "{" {WSP}* {Number} { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); } - - {WSPNL}+ "{" { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); } - {NL} { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); } - - {WSPNL}*"/*" { nextState = REGEXP; yybegin(COMMENT); } - - {WSPNL}*"//"{NNL}* { } - - {WSP}+ { } - - { - {WSPNL}*"[:jletter:]" { return symbol(JLETTERCLASS); } - {WSPNL}*"[:jletterdigit:]" { return symbol(JLETTERDIGITCLASS); } - {WSPNL}*"[:letter:]" { return symbol(LETTERCLASS); } - {WSPNL}*"[:digit:]" { return symbol(DIGITCLASS); } - {WSPNL}*"[:uppercase:]" { return symbol(UPPERCLASS); } - {WSPNL}*"[:lowercase:]" { return symbol(LOWERCLASS); } - {WSPNL}*"[:unicode_unassigned:]" { return symbol(UNICODE_UNASSIGNED); } - {WSPNL}*"[:unicode_uppercase_letter:]" { return symbol(UNICODE_UPPERCASE_LETTER); } - {WSPNL}*"[:unicode_lowercase_letter:]" { return symbol(UNICODE_LOWERCASE_LETTER); } - {WSPNL}*"[:unicode_titlecase_letter:]" { return symbol(UNICODE_TITLECASE_LETTER); } - {WSPNL}*"[:unicode_modifier_letter:]" { return symbol(UNICODE_MODIFIER_LETTER); } - {WSPNL}*"[:unicode_other_letter:]" { return symbol(UNICODE_OTHER_LETTER); } - {WSPNL}*"[:unicode_non_spacing_mark:]" { return symbol(UNICODE_NON_SPACING_MARK); } - {WSPNL}*"[:unicode_enclosing_mark:]" { return symbol(UNICODE_ENCLOSING_MARK); } - {WSPNL}*"[:unicode_combining_spacing_mark:]" { return symbol(UNICODE_COMBINING_SPACING_MARK); } - {WSPNL}*"[:unicode_decimal_digit_number:]" { return symbol(UNICODE_DECIMAL_DIGIT_NUMBER); } - {WSPNL}*"[:unicode_letter_number:]" { return symbol(UNICODE_LETTER_NUMBER); } - {WSPNL}*"[:unicode_other_number:]" { return symbol(UNICODE_OTHER_NUMBER); } - {WSPNL}*"[:unicode_space_separator:]" { return symbol(UNICODE_SPACE_SEPARATOR); } - {WSPNL}*"[:unicode_line_separator:]" { return symbol(UNICODE_LINE_SEPARATOR); } - {WSPNL}*"[:unicode_paragraph_separator:]" { return symbol(UNICODE_PARAGRAPH_SEPARATOR); } - {WSPNL}*"[:unicode_control:]" { return symbol(UNICODE_CONTROL); } - {WSPNL}*"[:unicode_format:]" { return symbol(UNICODE_FORMAT); } - {WSPNL}*"[:unicode_private_use:]" { return symbol(UNICODE_PRIVATE_USE); } - {WSPNL}*"[:unicode_surrogate:]" { return symbol(UNICODE_SURROGATE); } - {WSPNL}*"[:unicode_dash_punctuation:]" { return symbol(UNICODE_DASH_PUNCTUATION); } - {WSPNL}*"[:unicode_start_punctuation:]" { return symbol(UNICODE_START_PUNCTUATION); } - {WSPNL}*"[:unicode_end_punctuation:]" { return symbol(UNICODE_END_PUNCTUATION); } - {WSPNL}*"[:unicode_connector_punctuation:]" { return symbol(UNICODE_CONNECTOR_PUNCTUATION); } - {WSPNL}*"[:unicode_other_punctuation:]" { return symbol(UNICODE_OTHER_PUNCTUATION); } - {WSPNL}*"[:unicode_math_symbol:]" { return symbol(UNICODE_MATH_SYMBOL); } - {WSPNL}*"[:unicode_currency_symbol:]" { return symbol(UNICODE_CURRENCY_SYMBOL); } - {WSPNL}*"[:unicode_modifier_symbol:]" { return symbol(UNICODE_MODIFIER_SYMBOL); } - {WSPNL}*"[:unicode_other_symbol:]" { return symbol(UNICODE_OTHER_SYMBOL); } - {WSPNL}*"[:unicode_initial_quote_punctuation:]" { return symbol(UNICODE_INITIAL_QUOTE_PUNCTUATION); } - {WSPNL}*"[:unicode_final_quote_punctuation:]" { return symbol(UNICODE_FINAL_QUOTE_PUNCTUATION); } - } - - . { return symbol(CHAR, new Character(yytext().charAt(0))); } -} - - {WSPNL}+ { yybegin(REGEXP); } - - - { - "}" { yybegin(REGEXP); return symbol(RBRACE); } - "," {WSP}* {Number} { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); } - {WSP}+ { } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } -} - - { - "{"{Ident}"}" { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); } - "[" { balance++; return symbol(OPENCLASS); } - "]" { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); } - "^" { return symbol(HAT); } - "-" { return symbol(DASH); } - - // this is a hack to keep JLex compatibilty with char class - // expressions like [+-] - "-]" { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); } - - \" { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); } - - . { return symbol(CHAR, new Character(yytext().charAt(0))); } - - \n { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } -} - - { - \" { yybegin(nextState); return symbol(STRING, string.toString()); } - \\\" { string.append('\"'); } - [^\"\\\u2028\u2029\u000A\u000B\u000C\u000D\u0085]+ { string.append(yytext()); } - - {NL} { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); } - - {HexNumber} { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); } - {Unicode} { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); } - {OctNumber} { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); } - - \\b { string.append('\b'); } - \\n { string.append('\n'); } - \\t { string.append('\t'); } - \\f { string.append('\f'); } - \\r { string.append('\r'); } - - \\. { string.append(yytext().charAt(1)); } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); } -} - - - { - {HexNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); } - {Unicode} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); } - {OctNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); } - - \\b { return symbol(CHAR,new Character('\b')); } - \\n { return symbol(CHAR,new Character('\n')); } - \\t { return symbol(CHAR,new Character('\t')); } - \\f { return symbol(CHAR,new Character('\f')); } - \\r { return symbol(CHAR,new Character('\r')); } - - \\. { return symbol(CHAR, new Character(yytext().charAt(1))); } -} - - - { - "{" { balance++; actionText.append('{'); } - "}" { if (balance > 0) { - balance--; - actionText.append('}'); - } - else { - yybegin(REGEXPSTART); - Action a = new Action(actionText.toString(), action_line); - actions.addElement(a); - return symbol(ACTION, a); - } - } - - {JavaCode} { actionText.append(yytext()); } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); } -} - - { - - "/"+ "*" { commentbalance++; } - "*"+ "/" { if (commentbalance > 0) - commentbalance--; - else - yybegin(nextState); - } - - {JFlexComment} { /* ignore */ } - - <> { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); } -} - - -. { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); } -\n { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); } - -<> { if ( yymoreStreams() ) { - file = (File) files.pop(); - yypopStream(); - } - else - return symbol(EOF); } diff --git a/tools/lexer/jflex-1.4/src/JFlex/LexScan.java b/tools/lexer/jflex-1.4/src/JFlex/LexScan.java deleted file mode 100644 index 92f7ce38550c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/LexScan.java +++ /dev/null @@ -1,3404 +0,0 @@ -/* The following code was generated by JFlex 1.4.3 on 12/1/09 8:12 AM */ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java_cup.runtime.Symbol; -import java.util.Vector; -import java.io.*; -import java.util.Stack; - -/** - * The lexer of JFlex. - * - * Generated by JFlex. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ - -public final class LexScan implements sym, java_cup.runtime.Scanner { - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ - private static final int ZZ_BUFFERSIZE = 16384; - - /** lexical states */ - public static final int STRING_CONTENT = 16; - public static final int REGEXPSTART = 8; - public static final int MACROS = 6; - public static final int STATELIST = 4; - public static final int CTOR_ARG = 26; - public static final int EATWSPNL = 24; - public static final int CHARCLASS = 18; - public static final int JAVA_CODE = 12; - public static final int REGEXP = 10; - public static final int YYINITIAL = 0; - public static final int REPEATEXP = 22; - public static final int COMMENT = 2; - public static final int STATES = 14; - public static final int COPY = 20; - - /** - * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l - * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l - * at the beginning of a line - * l is of the form l = 2*k, k a non negative integer - */ - private static final int ZZ_LEXSTATE[] = { - 0, 0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14 - }; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED = - "\10\25\1\26\1\10\1\13\2\11\1\12\16\25\4\0\1\10\1\76"+ - "\1\32\1\0\1\103\1\35\1\22\1\33\1\100\1\101\1\30\1\102"+ - "\1\15\1\110\1\14\1\31\1\7\1\66\2\7\2\3\1\67\1\64"+ - "\1\65\1\1\1\105\1\0\1\20\1\71\1\21\1\23\1\0\4\2"+ - "\1\72\1\74\10\24\1\73\13\24\1\16\1\4\1\17\1\104\1\106"+ - "\1\0\1\53\1\57\1\55\1\62\1\46\1\47\1\63\1\42\1\37"+ - "\1\60\1\70\1\51\1\56\1\40\1\44\1\61\1\107\1\43\1\54"+ - "\1\41\1\6\1\52\1\45\1\5\1\50\1\24\1\36\1\75\1\34"+ - "\1\77\6\25\1\27\32\25\2\0\4\24\4\0\1\24\2\0\1\25"+ - "\7\0\1\24\4\0\1\24\5\0\27\24\1\0\37\24\1\0\u013f\24"+ - "\31\0\162\24\4\0\14\24\16\0\5\24\11\0\1\24\21\0\130\25"+ - "\5\0\23\25\12\0\1\24\13\0\1\24\1\0\3\24\1\0\1\24"+ - "\1\0\24\24\1\0\54\24\1\0\46\24\1\0\5\24\4\0\202\24"+ - "\1\0\4\25\3\0\105\24\1\0\46\24\2\0\2\24\6\0\20\24"+ - "\41\0\46\24\2\0\1\24\7\0\47\24\11\0\21\25\1\0\27\25"+ - "\1\0\3\25\1\0\1\25\1\0\2\25\1\0\1\25\13\0\33\24"+ - "\5\0\3\24\15\0\4\25\14\0\6\25\13\0\32\24\5\0\13\24"+ - "\16\25\7\0\12\25\4\0\2\24\1\25\143\24\1\0\1\24\10\25"+ - "\1\0\6\25\2\24\2\25\1\0\4\25\2\24\12\25\3\24\2\0"+ - "\1\24\17\0\1\25\1\24\1\25\36\24\33\25\2\0\3\24\60\0"+ - "\46\24\13\25\1\24\u014f\0\3\25\66\24\2\0\1\25\1\24\20\25"+ - "\2\0\1\24\4\25\3\0\12\24\2\25\2\0\12\25\21\0\3\25"+ - "\1\0\10\24\2\0\2\24\2\0\26\24\1\0\7\24\1\0\1\24"+ - "\3\0\4\24\2\0\1\25\1\24\7\25\2\0\2\25\2\0\3\25"+ - "\11\0\1\25\4\0\2\24\1\0\3\24\2\25\2\0\12\25\4\24"+ - "\15\0\3\25\1\0\6\24\4\0\2\24\2\0\26\24\1\0\7\24"+ - "\1\0\2\24\1\0\2\24\1\0\2\24\2\0\1\25\1\0\5\25"+ - "\4\0\2\25\2\0\3\25\13\0\4\24\1\0\1\24\7\0\14\25"+ - "\3\24\14\0\3\25\1\0\11\24\1\0\3\24\1\0\26\24\1\0"+ - "\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\10\25\1\0"+ - "\3\25\1\0\3\25\2\0\1\24\17\0\2\24\2\25\2\0\12\25"+ - "\1\0\1\24\17\0\3\25\1\0\10\24\2\0\2\24\2\0\26\24"+ - "\1\0\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\6\25"+ - "\3\0\2\25\2\0\3\25\10\0\2\25\4\0\2\24\1\0\3\24"+ - "\4\0\12\25\1\0\1\24\20\0\1\25\1\24\1\0\6\24\3\0"+ - "\3\24\1\0\4\24\3\0\2\24\1\0\1\24\1\0\2\24\3\0"+ - "\2\24\3\0\3\24\3\0\10\24\1\0\3\24\4\0\5\25\3\0"+ - "\3\25\1\0\4\25\11\0\1\25\17\0\11\25\11\0\1\24\7\0"+ - "\3\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0\12\24\1\0"+ - "\5\24\4\0\7\25\1\0\3\25\1\0\4\25\7\0\2\25\11\0"+ - "\2\24\4\0\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0"+ - "\27\24\1\0\12\24\1\0\5\24\2\0\1\25\1\24\7\25\1\0"+ - "\3\25\1\0\4\25\7\0\2\25\7\0\1\24\1\0\2\24\4\0"+ - "\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0"+ - "\20\24\4\0\6\25\2\0\3\25\1\0\4\25\11\0\1\25\10\0"+ - "\2\24\4\0\12\25\22\0\2\25\1\0\22\24\3\0\30\24\1\0"+ - "\11\24\1\0\1\24\2\0\7\24\3\0\1\25\4\0\6\25\1\0"+ - "\1\25\1\0\10\25\22\0\2\25\15\0\60\24\1\25\2\24\7\25"+ - "\4\0\10\24\10\25\1\0\12\25\47\0\2\24\1\0\1\24\2\0"+ - "\2\24\1\0\1\24\2\0\1\24\6\0\4\24\1\0\7\24\1\0"+ - "\3\24\1\0\1\24\1\0\1\24\2\0\2\24\1\0\4\24\1\25"+ - "\2\24\6\25\1\0\2\25\1\24\2\0\5\24\1\0\1\24\1\0"+ - "\6\25\2\0\12\25\2\0\2\24\42\0\1\24\27\0\2\25\6\0"+ - "\12\25\13\0\1\25\1\0\1\25\1\0\1\25\4\0\2\25\10\24"+ - "\1\0\42\24\6\0\24\25\1\0\2\25\4\24\4\0\10\25\1\0"+ - "\44\25\11\0\1\25\71\0\42\24\1\0\5\24\1\0\2\24\1\0"+ - "\7\25\3\0\4\25\6\0\12\25\6\0\6\24\4\25\106\0\46\24"+ - "\12\0\51\24\7\0\132\24\5\0\104\24\5\0\122\24\6\0\7\24"+ - "\1\0\77\24\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24"+ - "\1\0\4\24\2\0\47\24\1\0\1\24\1\0\4\24\2\0\37\24"+ - "\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24\1\0\4\24"+ - "\2\0\7\24\1\0\7\24\1\0\27\24\1\0\37\24\1\0\1\24"+ - "\1\0\4\24\2\0\7\24\1\0\47\24\1\0\23\24\16\0\11\25"+ - "\56\0\125\24\14\0\u026c\24\2\0\10\24\12\0\32\24\5\0\113\24"+ - "\3\0\3\24\17\0\15\24\1\0\4\24\3\25\13\0\22\24\3\25"+ - "\13\0\22\24\2\25\14\0\15\24\1\0\3\24\1\0\2\25\14\0"+ - "\64\24\40\25\3\0\1\24\3\0\2\24\1\25\2\0\12\25\41\0"+ - "\3\25\2\0\12\25\6\0\130\24\10\0\51\24\1\25\126\0\35\24"+ - "\3\0\14\25\4\0\14\25\12\0\12\25\36\24\2\0\5\24\u038b\0"+ - "\154\24\224\0\234\24\4\0\132\24\6\0\26\24\2\0\6\24\2\0"+ - "\46\24\2\0\6\24\2\0\10\24\1\0\1\24\1\0\1\24\1\0"+ - "\1\24\1\0\37\24\2\0\65\24\1\0\7\24\1\0\1\24\3\0"+ - "\3\24\1\0\7\24\3\0\4\24\2\0\6\24\4\0\15\24\5\0"+ - "\3\24\1\0\7\24\17\0\4\25\30\0\2\11\5\25\20\0\2\24"+ - "\23\0\1\24\13\0\4\25\6\0\6\25\1\0\1\24\15\0\1\24"+ - "\40\0\22\24\36\0\15\25\4\0\1\25\3\0\6\25\27\0\1\24"+ - "\4\0\1\24\2\0\12\24\1\0\1\24\3\0\5\24\6\0\1\24"+ - "\1\0\1\24\1\0\1\24\1\0\4\24\1\0\3\24\1\0\7\24"+ - "\3\0\3\24\5\0\5\24\26\0\44\24\u0e81\0\3\24\31\0\11\24"+ - "\6\25\1\0\5\24\2\0\5\24\4\0\126\24\2\0\2\25\2\0"+ - "\3\24\1\0\137\24\5\0\50\24\4\0\136\24\21\0\30\24\70\0"+ - "\20\24\u0200\0\u19b6\24\112\0\u51a6\24\132\0\u048d\24\u0773\0\u2ba4\24\u215c\0"+ - "\u012e\24\2\0\73\24\225\0\7\24\14\0\5\24\5\0\1\24\1\25"+ - "\12\24\1\0\15\24\1\0\5\24\1\0\1\24\1\0\2\24\1\0"+ - "\2\24\1\0\154\24\41\0\u016b\24\22\0\100\24\2\0\66\24\50\0"+ - "\15\24\3\0\20\25\20\0\4\25\17\0\2\24\30\0\3\24\31\0"+ - "\1\24\6\0\5\24\1\0\207\24\2\0\1\25\4\0\1\24\13\0"+ - "\12\25\7\0\32\24\4\0\1\24\1\0\32\24\12\0\132\24\3\0"+ - "\6\24\2\0\6\24\2\0\6\24\2\0\3\24\3\0\2\24\3\0"+ - "\2\24\22\0\3\25\4\0"; - - /** - * Translates characters to character classes - */ - private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int [] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 = - "\1\1\1\2\15\0\1\1\2\3\1\1\1\2\3\4"+ - "\1\5\1\6\2\7\1\6\1\10\2\6\1\4\1\11"+ - "\1\12\1\6\1\11\1\13\1\14\1\4\1\15\2\16"+ - "\1\6\2\17\1\20\1\21\1\16\1\22\1\23\1\24"+ - "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ - "\1\35\1\36\1\37\3\4\1\40\1\41\1\6\1\42"+ - "\1\43\1\44\1\4\2\45\1\46\1\16\1\47\1\50"+ - "\1\51\1\52\1\16\1\53\1\54\1\4\2\44\1\4"+ - "\1\55\1\4\1\56\1\13\1\57\1\60\1\61\3\0"+ - "\1\62\1\63\1\0\1\64\1\0\2\11\1\0\15\11"+ - "\3\0\1\65\1\11\1\66\1\11\2\0\1\67\1\6"+ - "\1\70\1\71\2\70\1\71\1\72\1\73\1\74\1\75"+ - "\1\76\1\0\1\77\2\0\1\100\1\101\3\0\2\102"+ - "\10\0\1\103\1\104\2\103\1\104\1\105\1\106\1\107"+ - "\1\110\1\111\1\112\3\0\1\113\5\0\1\114\1\0"+ - "\1\60\1\61\2\6\1\11\2\115\35\11\3\0\2\116"+ - "\1\11\2\117\1\11\1\0\1\71\1\0\1\120\6\0"+ - "\1\121\1\122\1\0\1\37\4\0\1\104\1\0\1\123"+ - "\1\124\2\125\3\0\2\11\1\126\24\11\1\127\12\11"+ - "\3\0\2\11\1\0\2\120\15\0\2\123\3\0\20\11"+ - "\1\130\3\11\1\131\10\11\1\132\6\11\1\133\1\11"+ - "\1\134\1\130\1\0\2\11\1\0\1\120\14\0\1\123"+ - "\5\0\11\11\1\0\1\11\1\135\5\11\1\136\1\137"+ - "\17\11\1\140\1\141\2\11\10\0\2\37\10\0\2\142"+ - "\3\0\11\11\1\143\1\0\11\11\1\144\4\11\1\145"+ - "\1\0\3\11\1\146\1\147\2\11\7\0\1\150\1\37"+ - "\3\0\1\37\6\0\2\151\4\0\1\141\1\11\1\152"+ - "\1\126\3\11\1\153\2\154\1\143\4\0\11\11\2\155"+ - "\2\11\1\156\1\11\2\157\1\11\1\160\7\0\1\37"+ - "\6\0\1\37\13\0\1\11\1\161\2\11\1\154\1\162"+ - "\1\154\1\143\3\0\2\11\1\163\2\11\1\164\3\11"+ - "\1\155\1\165\1\155\1\166\1\0\1\11\1\156\1\0"+ - "\1\167\1\157\2\170\1\157\5\0\1\171\1\172\2\37"+ - "\4\0\2\37\7\0\2\173\1\0\3\11\2\162\2\143"+ - "\1\174\2\175\1\0\1\11\1\0\5\11\2\165\2\0"+ - "\1\11\1\0\2\170\3\0\1\176\2\0\1\37\2\0"+ - "\2\37\4\0\1\37\2\0\2\37\7\0\2\177\1\11"+ - "\1\162\1\0\1\143\1\0\1\174\1\0\1\175\1\200"+ - "\1\175\2\0\2\11\1\201\1\11\1\202\1\203\2\204"+ - "\1\165\1\0\1\205\3\0\1\205\1\0\1\205\1\156"+ - "\20\0\1\206\1\0\4\37\3\0\4\37\3\0\2\207"+ - "\1\0\1\177\1\210\1\177\1\211\3\0\2\200\2\0"+ - "\2\11\1\201\2\212\1\204\1\213\1\204\41\0\3\37"+ - "\5\0\3\37\1\0\2\214\1\0\2\210\2\143\1\174"+ - "\1\200\3\0\2\11\1\212\1\215\1\212\2\213\1\205"+ - "\33\0\1\216\1\217\4\0\1\37\3\0\1\37\2\220"+ - "\1\210\1\0\1\143\1\163\1\0\1\163\1\11\2\215"+ - "\1\213\1\0\2\205\1\0\1\205\35\0\1\37\2\0"+ - "\1\37\2\221\1\215\74\0\1\222\3\205\51\0\1\223"+ - "\44\0\1\224\62\0\1\225\14\0\1\226\57\0\1\227"+ - "\1\230\7\0\1\231\1\232\1\233\33\0\1\234\17\0"+ - "\1\235\2\0\1\236\20\0\1\237\3\0\1\240\1\241"+ - "\2\0\1\242\1\243\3\0\1\244\1\0\1\245\1\246"+ - "\2\0\1\247\5\0\1\250\1\0\1\251\1\0\1\252"+ - "\16\0\1\253\5\0\1\254\2\0\1\255\3\0\1\256"+ - "\1\0\1\257\1\0\1\260"; - - private static int [] zzUnpackAction() { - int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /** - * Translates a state to a row index in the transition table - */ - private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); - - private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\111\0\222\0\333\0\u0124\0\u016d\0\u01b6\0\u01ff"+ - "\0\u0248\0\u0291\0\u02da\0\u0323\0\u036c\0\u03b5\0\u03fe\0\u0447"+ - "\0\u0447\0\u0490\0\u04d9\0\u0522\0\u056b\0\u05b4\0\u0490\0\u05fd"+ - "\0\u0646\0\u0490\0\u068f\0\u06d8\0\u0721\0\u076a\0\u07b3\0\u07fc"+ - "\0\u0845\0\u088e\0\u08d7\0\u0920\0\u0969\0\u09b2\0\u09fb\0\u0490"+ - "\0\u0490\0\u0a44\0\u0a8d\0\u0ad6\0\u0b1f\0\u0490\0\u0b68\0\u0bb1"+ - "\0\u0490\0\u0490\0\u0bfa\0\u0490\0\u0c43\0\u0c8c\0\u0490\0\u0490"+ - "\0\u0490\0\u0490\0\u0490\0\u0490\0\u0490\0\u0cd5\0\u0d1e\0\u0d67"+ - "\0\u0db0\0\u0490\0\u0490\0\u0df9\0\u0490\0\u0e42\0\u0e8b\0\u0ed4"+ - "\0\u0490\0\u0f1d\0\u0490\0\u0f66\0\u0f66\0\u0b68\0\u0490\0\u0490"+ - "\0\u0faf\0\u0490\0\u0ff8\0\u1041\0\u1041\0\u0490\0\u108a\0\u0490"+ - "\0\u10d3\0\u0490\0\u111c\0\u0490\0\u1165\0\u11ae\0\u11f7\0\u1240"+ - "\0\u056b\0\u0490\0\u0490\0\u05b4\0\u0490\0\u1289\0\u12d2\0\u131b"+ - "\0\u1364\0\u13ad\0\u13f6\0\u143f\0\u1488\0\u14d1\0\u151a\0\u1563"+ - "\0\u15ac\0\u15f5\0\u163e\0\u1687\0\u16d0\0\u1719\0\u1762\0\u17ab"+ - "\0\u17f4\0\u0490\0\u183d\0\u1886\0\u18cf\0\u09fb\0\u1918\0\u0490"+ - "\0\u1961\0\u0490\0\u19aa\0\u19f3\0\u1a3c\0\u1a85\0\u0490\0\u0490"+ - "\0\u0490\0\u0490\0\u0490\0\u0ad6\0\u0c43\0\u1ace\0\u1b17\0\u0490"+ - "\0\u1b60\0\u1ba9\0\u0c43\0\u0c8c\0\u0490\0\u1bf2\0\u0d1e\0\u0d67"+ - "\0\u0db0\0\u1c3b\0\u1c84\0\u1ccd\0\u1d16\0\u1d5f\0\u0490\0\u1da8"+ - "\0\u1df1\0\u1e3a\0\u1e83\0\u0490\0\u0490\0\u0490\0\u0490\0\u0490"+ - "\0\u0490\0\u0f66\0\u0b68\0\u1ecc\0\u0490\0\u1041\0\u1f15\0\u1f5e"+ - "\0\u1fa7\0\u1ff0\0\u2039\0\u10d3\0\u2082\0\u0490\0\u1289\0\u0490"+ - "\0\u20cb\0\u1364\0\u0490\0\u2114\0\u215d\0\u21a6\0\u21ef\0\u2238"+ - "\0\u2281\0\u22ca\0\u2313\0\u235c\0\u23a5\0\u23ee\0\u2437\0\u2480"+ - "\0\u24c9\0\u2512\0\u255b\0\u25a4\0\u25ed\0\u2636\0\u267f\0\u26c8"+ - "\0\u2711\0\u275a\0\u27a3\0\u27ec\0\u2835\0\u287e\0\u28c7\0\u2910"+ - "\0\u2959\0\u29a2\0\u29eb\0\u2a34\0\u2a7d\0\u2ac6\0\u2b0f\0\u2b58"+ - "\0\u2ba1\0\u2bea\0\u0490\0\u2c33\0\u2c7c\0\u2cc5\0\u2d0e\0\u2d57"+ - "\0\u2da0\0\u2de9\0\u2e32\0\u0490\0\u0490\0\u2e7b\0\u2ec4\0\u2f0d"+ - "\0\u2f56\0\u2f9f\0\u2fe8\0\u0490\0\u3031\0\u307a\0\u0490\0\u1f15"+ - "\0\u0490\0\u30c3\0\u310c\0\u3155\0\u319e\0\u31e7\0\u3230\0\u3279"+ - "\0\u32c2\0\u330b\0\u3354\0\u339d\0\u33e6\0\u342f\0\u3478\0\u34c1"+ - "\0\u350a\0\u3553\0\u359c\0\u35e5\0\u362e\0\u3677\0\u36c0\0\u3709"+ - "\0\u3752\0\u379b\0\u37e4\0\u382d\0\u3876\0\u38bf\0\u3908\0\u3951"+ - "\0\u399a\0\u39e3\0\u3a2c\0\u3a75\0\u3abe\0\u3b07\0\u3b50\0\u3b99"+ - "\0\u3be2\0\u3c2b\0\u3c74\0\u3cbd\0\u0490\0\u3d06\0\u3d4f\0\u3d98"+ - "\0\u3de1\0\u3e2a\0\u3e73\0\u3ebc\0\u3f05\0\u3f4e\0\u3f97\0\u3fe0"+ - "\0\u4029\0\u4072\0\u40bb\0\u0490\0\u4104\0\u414d\0\u4196\0\u41df"+ - "\0\u4228\0\u4271\0\u42ba\0\u4303\0\u434c\0\u4395\0\u43de\0\u4427"+ - "\0\u4470\0\u44b9\0\u4502\0\u454b\0\u4594\0\u45dd\0\u4626\0\u466f"+ - "\0\u12d2\0\u46b8\0\u4701\0\u474a\0\u12d2\0\u4793\0\u47dc\0\u4825"+ - "\0\u486e\0\u48b7\0\u4900\0\u4949\0\u4992\0\u12d2\0\u49db\0\u4a24"+ - "\0\u4a6d\0\u4ab6\0\u4aff\0\u4b48\0\u12d2\0\u4b91\0\u0490\0\u0490"+ - "\0\u4bda\0\u4c23\0\u4c6c\0\u4cb5\0\u2c33\0\u4cfe\0\u4d47\0\u4d90"+ - "\0\u4dd9\0\u4e22\0\u4e6b\0\u4eb4\0\u4efd\0\u4f46\0\u4f8f\0\u4fd8"+ - "\0\u5021\0\u3031\0\u506a\0\u50b3\0\u50fc\0\u5145\0\u518e\0\u51d7"+ - "\0\u5220\0\u5269\0\u52b2\0\u52fb\0\u5344\0\u538d\0\u53d6\0\u541f"+ - "\0\u5468\0\u54b1\0\u12d2\0\u54fa\0\u5543\0\u558c\0\u55d5\0\u561e"+ - "\0\u12d2\0\u12d2\0\u5667\0\u56b0\0\u56f9\0\u5742\0\u578b\0\u57d4"+ - "\0\u581d\0\u5866\0\u58af\0\u58f8\0\u5941\0\u598a\0\u59d3\0\u5a1c"+ - "\0\u5a65\0\u12d2\0\u0490\0\u5aae\0\u5af7\0\u5b40\0\u5b89\0\u5bd2"+ - "\0\u5c1b\0\u5c64\0\u5cad\0\u5cf6\0\u5d3f\0\u5d88\0\u5dd1\0\u5e1a"+ - "\0\u5e63\0\u5eac\0\u5ef5\0\u5f3e\0\u5f87\0\u5fd0\0\u6019\0\u50b3"+ - "\0\u0490\0\u6062\0\u60ab\0\u60f4\0\u613d\0\u6186\0\u61cf\0\u6218"+ - "\0\u6261\0\u62aa\0\u62f3\0\u633c\0\u6385\0\u63ce\0\u6417\0\u6460"+ - "\0\u64a9\0\u64f2\0\u653b\0\u6584\0\u65cd\0\u6616\0\u665f\0\u66a8"+ - "\0\u12d2\0\u66f1\0\u673a\0\u6783\0\u67cc\0\u12d2\0\u6815\0\u685e"+ - "\0\u68a7\0\u68f0\0\u12d2\0\u12d2\0\u6939\0\u2b58\0\u6982\0\u69cb"+ - "\0\u6a14\0\u6a5d\0\u6aa6\0\u6aef\0\u6b38\0\u6b81\0\u6bca\0\u6c13"+ - "\0\u6c5c\0\u6ca5\0\u6cee\0\u6d37\0\u6d80\0\u6dc9\0\u6e12\0\u6e5b"+ - "\0\u6ea4\0\u5fd0\0\u0490\0\u6eed\0\u6f36\0\u6f7f\0\u6fc8\0\u12d2"+ - "\0\u7011\0\u12d2\0\u12d2\0\u705a\0\u70a3\0\u70ec\0\u12d2\0\u7135"+ - "\0\u717e\0\u71c7\0\u7210\0\u7259\0\u72a2\0\u72eb\0\u7334\0\u737d"+ - "\0\u73c6\0\u740f\0\u7458\0\u74a1\0\u74ea\0\u7533\0\u757c\0\u75c5"+ - "\0\u760e\0\u7657\0\u76a0\0\u76e9\0\u7732\0\u777b\0\u77c4\0\u2a7d"+ - "\0\u0490\0\u780d\0\u7856\0\u789f\0\u78e8\0\u7931\0\u797a\0\u79c3"+ - "\0\u7a0c\0\u7a55\0\u7a9e\0\u7ae7\0\u7b30\0\u7b79\0\u7bc2\0\u7c0b"+ - "\0\u7c54\0\u7c9d\0\u7ce6\0\u7d2f\0\u7d78\0\u7dc1\0\u7e0a\0\u7e53"+ - "\0\u7e9c\0\u7ee5\0\u7f2e\0\u7f77\0\u7fc0\0\u8009\0\u8052\0\u809b"+ - "\0\u80e4\0\u812d\0\u8176\0\u81bf\0\u8208\0\u8251\0\u829a\0\u82e3"+ - "\0\u832c\0\u8375\0\u83be\0\u12d2\0\u8407\0\u8450\0\u8499\0\u84e2"+ - "\0\u852b\0\u8574\0\u12d2\0\u85bd\0\u8606\0\u864f\0\u8698\0\u12d2"+ - "\0\u86e1\0\u872a\0\u8773\0\u87bc\0\u8805\0\u884e\0\u8897\0\u88e0"+ - "\0\u8929\0\u0490\0\u0490\0\u8972\0\u89bb\0\u8a04\0\u8a4d\0\u8a96"+ - "\0\u8adf\0\u8b28\0\u8b71\0\u8bba\0\u8c03\0\u8c4c\0\u8c95\0\u8cde"+ - "\0\u8d27\0\u8d70\0\u7ee5\0\u0490\0\u8db9\0\u8e02\0\u8e4b\0\u8e94"+ - "\0\u8edd\0\u8f26\0\u8f6f\0\u8fb8\0\u9001\0\u904a\0\u9093\0\u90dc"+ - "\0\u9125\0\u916e\0\u91b7\0\u9200\0\u9249\0\u9292\0\u92db\0\u9324"+ - "\0\u936d\0\u93b6\0\u93ff\0\u9448\0\u9491\0\u94da\0\u9523\0\u956c"+ - "\0\u95b5\0\u95fe\0\u0490\0\u9647\0\u9690\0\u96d9\0\u9722\0\u976b"+ - "\0\u97b4\0\u97fd\0\u9846\0\u988f\0\u98d8\0\u9921\0\u996a\0\u99b3"+ - "\0\u99fc\0\u9a45\0\u9a8e\0\u9ad7\0\u9b20\0\u9b69\0\u9bb2\0\u9bfb"+ - "\0\u9c44\0\u9c8d\0\u9cd6\0\u9d1f\0\u9d68\0\u9db1\0\u9dfa\0\u9e43"+ - "\0\u9e8c\0\u9ed5\0\u9f1e\0\u9f67\0\u9fb0\0\u9ff9\0\ua042\0\ua08b"+ - "\0\ua0d4\0\ua11d\0\ua166\0\ua1af\0\u12d2\0\u12d2\0\ua1f8\0\ua241"+ - "\0\ua28a\0\ua2d3\0\ua31c\0\ua365\0\ua3ae\0\ua3f7\0\u93b6\0\ua440"+ - "\0\u9448\0\ua489\0\ua4d2\0\ua51b\0\ua564\0\ua5ad\0\ua5f6\0\ua63f"+ - "\0\ua688\0\ua6d1\0\ua71a\0\ua763\0\ua7ac\0\ua7f5\0\ua83e\0\ua887"+ - "\0\ua8d0\0\ua919\0\u0490\0\ua962\0\ua9ab\0\ua9f4\0\uaa3d\0\uaa86"+ - "\0\uaacf\0\uab18\0\uab61\0\uabaa\0\uabf3\0\uac3c\0\uac85\0\uacce"+ - "\0\uad17\0\uad60\0\u9c44\0\u0490\0\uada9\0\uadf2\0\uae3b\0\uae84"+ - "\0\uaecd\0\uaf16\0\uaf5f\0\uafa8\0\uaff1\0\ub03a\0\ub083\0\ub0cc"+ - "\0\ub115\0\ub15e\0\ub1a7\0\ub1f0\0\ub239\0\ub282\0\ub2cb\0\ub314"+ - "\0\ub35d\0\ub3a6\0\ub3ef\0\ub438\0\ub481\0\ub4ca\0\ub513\0\ub55c"+ - "\0\ub5a5\0\ub5ee\0\ub637\0\ub680\0\ub6c9\0\ub712\0\ub75b\0\ub7a4"+ - "\0\ub7ed\0\ub836\0\ub87f\0\ub8c8\0\ub911\0\ub95a\0\ub9a3\0\ub9ec"+ - "\0\uba35\0\uba7e\0\ubac7\0\ubb10\0\ubb59\0\ubba2\0\ubbeb\0\ubc34"+ - "\0\ubc7d\0\ubcc6\0\ubd0f\0\ubd58\0\ubda1\0\ubdea\0\ube33\0\ube7c"+ - "\0\ubec5\0\ubf0e\0\ubf57\0\ubfa0\0\ubfe9\0\uad60\0\u0490\0\uc032"+ - "\0\uc07b\0\uc0c4\0\uc10d\0\uc156\0\uc19f\0\uc1e8\0\uc231\0\uc27a"+ - "\0\uc2c3\0\uc30c\0\uc355\0\uc39e\0\uc3e7\0\uc430\0\uc479\0\uc4c2"+ - "\0\ub35d\0\uc50b\0\uc554\0\uc59d\0\uc5e6\0\uc62f\0\uc678\0\uc6c1"+ - "\0\uc70a\0\uc753\0\uc79c\0\uc7e5\0\uc82e\0\uc877\0\uc8c0\0\uc909"+ - "\0\uc952\0\uc99b\0\uc9e4\0\uca2d\0\uca76\0\ucabf\0\ucb08\0\ucb51"+ - "\0\ucb9a\0\ucbe3\0\ucc2c\0\ucc75\0\u0490\0\u0490\0\uccbe\0\ucd07"+ - "\0\ucd50\0\ucd99\0\ucde2\0\uce2b\0\uce74\0\ucebd\0\ucf06\0\uc032"+ - "\0\u0490\0\ucf4f\0\ucf98\0\ucfe1\0\u0490\0\ud02a\0\u12d2\0\ud073"+ - "\0\ud0bc\0\ud105\0\ud14e\0\ud197\0\uc50b\0\ud1e0\0\ud229\0\uc554"+ - "\0\ud272\0\ud2bb\0\ud304\0\ud34d\0\ud396\0\ud3df\0\ud428\0\ud471"+ - "\0\ud4ba\0\ud503\0\ud54c\0\ud595\0\ud5de\0\ud627\0\ud670\0\ud6b9"+ - "\0\ud702\0\ud74b\0\ud794\0\ud7dd\0\ud826\0\ud86f\0\ud8b8\0\ud901"+ - "\0\ud94a\0\ud993\0\ud9dc\0\uda25\0\uda6e\0\udab7\0\udb00\0\udb49"+ - "\0\udb92\0\u0490\0\u12d2\0\udbdb\0\udc24\0\udc6d\0\udcb6\0\udcff"+ - "\0\udd48\0\udd91\0\uddda\0\ude23\0\ude6c\0\udeb5\0\udefe\0\udf47"+ - "\0\udf90\0\udfd9\0\ue022\0\ue06b\0\ue0b4\0\ue0fd\0\ue146\0\ue18f"+ - "\0\ue1d8\0\ue221\0\ue26a\0\ue2b3\0\ue2fc\0\ue345\0\ue38e\0\ue3d7"+ - "\0\ue420\0\ue469\0\ue4b2\0\ue4fb\0\ue544\0\ue58d\0\ue5d6\0\ue61f"+ - "\0\ue668\0\ue6b1\0\ue6fa\0\ue743\0\ue78c\0\ue7d5\0\ue81e\0\ue867"+ - "\0\ue8b0\0\ue8f9\0\ue942\0\ue98b\0\ue9d4\0\uea1d\0\uea66\0\ueaaf"+ - "\0\ueaf8\0\ueb41\0\ueb8a\0\uebd3\0\uec1c\0\uec65\0\uecae\0\uecf7"+ - "\0\u0490\0\ue544\0\ued40\0\ue58d\0\ued89\0\uedd2\0\uee1b\0\uee64"+ - "\0\ueead\0\ueef6\0\uef3f\0\uef88\0\uefd1\0\uf01a\0\uf063\0\uf0ac"+ - "\0\uf0f5\0\uf13e\0\uf187\0\uf1d0\0\uf219\0\uf262\0\uf2ab\0\uf2f4"+ - "\0\uf33d\0\uf386\0\uf3cf\0\uf418\0\uf461\0\uf4aa\0\uf4f3\0\uf53c"+ - "\0\uf585\0\uf5ce\0\uf617\0\uf660\0\uf6a9\0\uf6f2\0\uf73b\0\uf784"+ - "\0\uf7cd\0\uf816\0\uf85f\0\uf8a8\0\uf8f1\0\u0490\0\uf93a\0\uf983"+ - "\0\uf9cc\0\ufa15\0\ufa5e\0\ufaa7\0\ufaf0\0\ufb39\0\ufb82\0\ufbcb"+ - "\0\ufc14\0\ufc5d\0\ufca6\0\ufcef\0\ufd38\0\ufd81\0\ufdca\0\ufe13"+ - "\0\ufe5c\0\ufea5\0\ufeee\0\uff37\0\uff80\0\uffc9\1\22\1\133"+ - "\1\244\1\355\1\u0136\1\u017f\1\u01c8\1\u0211\1\u025a\1\u02a3"+ - "\1\u02ec\1\u0335\0\u0490\1\u037e\1\u03c7\1\u0410\1\u0459\1\u04a2"+ - "\1\u04eb\1\u0534\1\u057d\1\u05c6\1\u060f\1\u0658\1\u06a1\1\u06ea"+ - "\1\u0733\1\u077c\1\u07c5\1\u080e\1\u0857\1\u08a0\1\u08e9\1\u0932"+ - "\1\u097b\1\u09c4\1\u0a0d\1\u0a56\1\u0a9f\1\u0ae8\1\u0b31\1\u0b7a"+ - "\1\u0bc3\1\u0c0c\1\u0c55\1\u0c9e\1\u0ce7\1\u0d30\1\u0d79\1\u0dc2"+ - "\1\u0e0b\1\u0e54\1\u0e9d\1\u0ee6\1\u0f2f\1\u0f78\1\u0fc1\1\u100a"+ - "\1\u1053\1\u109c\1\u10e5\1\u112e\1\u1177\0\u0490\1\u11c0\1\u1209"+ - "\1\u1252\1\u129b\1\u12e4\1\u132d\1\u1376\1\u13bf\1\u1408\1\u1451"+ - "\1\u149a\1\u14e3\0\u0490\1\u152c\1\u1575\1\u15be\1\u1607\1\u1650"+ - "\1\u1699\1\u16e2\1\u172b\1\u1774\1\u17bd\1\u1806\1\u184f\1\u1898"+ - "\1\u18e1\1\u192a\1\u1973\1\u19bc\1\u1a05\1\u1a4e\1\u1a97\1\u1ae0"+ - "\1\u1b29\1\u1b72\1\u1bbb\1\u1c04\1\u1c4d\1\u1c96\1\u1cdf\1\u1d28"+ - "\1\u1d71\1\u1dba\1\u1e03\1\u1e4c\1\u1e95\1\u1ede\1\u1f27\1\u1f70"+ - "\1\u1fb9\1\u2002\1\u204b\1\u2094\1\u20dd\1\u2126\1\u216f\1\u21b8"+ - "\1\u2201\1\u224a\0\u0490\0\u0490\1\u2293\1\u22dc\1\u2325\1\u236e"+ - "\1\u23b7\1\u2400\1\u2449\0\u0490\0\u0490\0\u0490\1\u2492\1\u24db"+ - "\1\u2524\1\u256d\1\u25b6\1\u25ff\1\u2648\1\u2691\1\u26da\1\u2723"+ - "\1\u276c\1\u27b5\1\u27fe\1\u2847\1\u2890\1\u28d9\1\u2922\1\u296b"+ - "\1\u29b4\1\u29fd\1\u2a46\1\u2a8f\1\u2ad8\1\u2b21\1\u2b6a\1\u2bb3"+ - "\1\u2bfc\0\u0490\1\u2c45\1\u2c8e\1\u2cd7\1\u2d20\1\u2d69\1\u2db2"+ - "\1\u2dfb\1\u2e44\1\u2e8d\1\u2ed6\1\u2f1f\1\u2f68\1\u2fb1\1\u2ffa"+ - "\1\u3043\0\u0490\1\u308c\1\u30d5\0\u0490\1\u311e\1\u3167\1\u31b0"+ - "\1\u31f9\1\u3242\1\u328b\1\u32d4\1\u331d\1\u3366\1\u33af\1\u33f8"+ - "\1\u3441\1\u348a\1\u34d3\1\u351c\1\u3565\0\u0490\1\u35ae\1\u35f7"+ - "\1\u3640\0\u0490\0\u0490\1\u3689\1\u36d2\0\u0490\0\u0490\1\u371b"+ - "\1\u3764\1\u37ad\0\u0490\1\u37f6\0\u0490\0\u0490\1\u383f\1\u3888"+ - "\0\u0490\1\u38d1\1\u391a\1\u3963\1\u39ac\1\u39f5\0\u0490\1\u3a3e"+ - "\0\u0490\1\u3a87\0\u0490\1\u3ad0\1\u3b19\1\u3b62\1\u3bab\1\u3bf4"+ - "\1\u3c3d\1\u3c86\1\u3ccf\1\u3d18\1\u3d61\1\u3daa\1\u3df3\1\u3e3c"+ - "\1\u3e85\0\u0490\1\u3ece\1\u3f17\1\u3f60\1\u3fa9\1\u3ff2\0\u0490"+ - "\1\u403b\1\u4084\0\u0490\1\u40cd\1\u4116\1\u415f\0\u0490\1\u41a8"+ - "\0\u0490\1\u41f1\0\u0490"; - - private static int [] zzUnpackRowMap() { - int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackRowMap(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int high = packed.charAt(i++) << 16; - result[j++] = high | packed.charAt(i++); - } - return j; - } - - /** - * The transition table of the DFA - */ - private static final int [] ZZ_TRANS = zzUnpackTrans(); - - private static final String ZZ_TRANS_PACKED_0 = - "\11\20\2\21\1\22\13\20\1\21\5\20\1\23\53\20"+ - "\30\24\1\25\1\26\57\24\2\27\1\30\2\27\2\30"+ - "\1\27\1\31\1\32\1\33\1\32\1\27\1\34\6\27"+ - "\1\30\2\27\1\32\7\27\25\30\4\27\1\30\1\27"+ - "\3\30\6\27\1\30\2\27\2\30\3\27\1\35\2\27"+ - "\2\35\1\27\1\36\3\37\10\27\1\35\1\27\1\36"+ - "\1\37\1\27\1\40\3\27\1\41\1\27\25\35\4\27"+ - "\1\35\1\42\3\35\6\27\1\35\2\27\2\35\3\27"+ - "\1\35\2\27\2\35\1\27\1\43\3\37\10\27\1\35"+ - "\1\27\1\43\1\37\1\27\1\40\3\27\1\44\1\27"+ - "\25\35\4\27\1\35\1\42\3\35\6\27\1\35\2\27"+ - "\2\35\11\27\4\45\4\27\1\46\5\27\2\45\1\27"+ - "\1\47\2\27\1\50\54\27\4\51\1\52\3\51\1\53"+ - "\1\54\1\55\1\54\1\56\1\51\1\57\1\51\1\60"+ - "\2\51\1\61\2\51\1\53\1\54\1\62\1\63\1\64"+ - "\3\51\1\65\36\51\1\66\1\67\1\70\1\71\1\72"+ - "\1\73\1\74\1\75\4\51\31\76\1\77\1\100\1\101"+ - "\1\102\1\76\1\103\52\76\2\27\1\35\2\27\2\35"+ - "\1\27\4\104\1\27\1\105\3\27\1\106\2\27\1\35"+ - "\1\27\2\104\7\27\25\35\4\27\1\35\1\27\3\35"+ - "\6\27\1\35\2\27\2\35\1\27\4\107\1\110\4\107"+ - "\1\111\1\112\1\111\13\107\1\111\2\107\1\113\56\107"+ - "\4\51\1\52\3\51\3\114\1\115\2\51\1\116\1\117"+ - "\6\51\2\114\2\51\1\120\3\51\1\121\45\51\1\122"+ - "\3\51\1\123\11\124\2\125\1\126\13\124\1\125\5\124"+ - "\1\127\53\124\10\27\1\36\2\27\1\130\1\27\1\131"+ - "\10\27\1\36\5\27\1\132\64\27\4\133\12\27\2\133"+ - "\61\27\2\134\1\135\2\134\2\135\15\134\1\135\12\134"+ - "\25\135\4\134\1\135\1\134\3\135\6\134\1\135\2\134"+ - "\2\135\1\134\11\20\2\21\1\22\13\20\1\21\61\20"+ - "\111\0\11\20\2\21\1\22\13\20\1\21\5\20\1\136"+ - "\53\20\30\24\1\137\1\140\107\24\1\141\1\142\107\24"+ - "\1\143\1\144\57\24\1\0\3\30\1\0\3\30\14\0"+ - "\4\30\7\0\32\30\1\0\3\30\6\0\1\30\2\0"+ - "\2\30\11\0\1\31\4\0\1\34\106\0\1\32\105\0"+ - "\1\34\101\0\3\35\1\0\3\35\14\0\4\35\7\0"+ - "\32\35\1\0\3\35\6\0\1\35\2\0\2\35\11\0"+ - "\1\36\15\0\1\36\73\0\3\37\13\0\1\37\111\0"+ - "\1\145\1\146\61\0\1\147\2\0\1\147\1\150\15\0"+ - "\1\147\11\0\1\151\1\152\1\153\1\154\4\147\1\155"+ - "\1\156\1\157\1\160\1\147\1\161\1\162\1\163\1\147"+ - "\1\164\1\147\1\165\1\166\1\147\1\167\1\170\1\171"+ - "\1\0\1\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\11\0\1\42\15\0\1\42\72\0\1\43\15\0\1\43"+ - "\6\0\1\172\55\0\1\147\2\0\1\173\1\150\15\0"+ - "\1\147\10\0\1\174\1\151\1\152\1\153\1\154\4\147"+ - "\1\155\1\156\1\157\1\160\1\147\1\161\1\175\1\163"+ - "\1\147\1\164\1\147\1\165\1\166\1\147\1\167\1\170"+ - "\1\171\1\0\1\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\11\0\4\45\4\0\1\46\5\0\2\45\1\0"+ - "\1\176\2\0\1\50\74\0\1\177\120\0\1\200\1\201"+ - "\57\0\3\202\1\203\1\202\1\204\1\205\1\206\3\202"+ - "\1\0\24\202\1\207\1\210\1\202\1\211\3\202\1\212"+ - "\7\202\1\213\4\202\1\203\1\202\1\206\1\203\21\202"+ - "\10\0\1\53\3\214\1\56\1\0\1\57\4\0\1\61"+ - "\2\0\1\53\1\214\1\62\1\63\1\64\3\0\1\215"+ - "\36\0\1\66\1\67\1\70\1\71\1\72\1\73\1\74"+ - "\1\75\14\0\4\214\1\56\1\0\1\57\4\0\1\61"+ - "\2\0\2\214\1\62\1\63\1\64\3\0\1\215\36\0"+ - "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ - "\14\0\3\214\1\54\1\56\1\0\1\57\4\0\1\61"+ - "\2\0\2\214\1\62\1\63\1\64\3\0\1\215\36\0"+ - "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ - "\111\0\1\216\23\0\1\217\120\0\1\220\1\201\60\0"+ - "\1\221\1\222\1\221\1\0\2\222\1\221\1\223\13\0"+ - "\1\222\1\0\1\223\10\0\25\222\4\221\1\222\1\0"+ - "\3\222\6\0\1\222\2\0\2\222\11\0\1\224\1\225"+ - "\1\226\1\225\12\0\1\224\1\225\61\0\31\76\1\227"+ - "\1\230\1\231\1\0\1\76\1\0\102\76\1\232\1\233"+ - "\57\76\4\230\1\234\4\230\3\0\13\230\1\0\2\230"+ - "\1\76\56\230\4\235\1\236\4\235\3\0\13\235\1\0"+ - "\3\235\1\0\55\235\10\0\4\104\12\0\2\104\71\0"+ - "\4\106\12\0\2\106\61\0\4\107\1\0\4\107\3\0"+ - "\13\107\1\0\2\107\1\0\56\107\3\237\1\240\1\237"+ - "\1\241\1\242\1\243\3\237\1\0\16\237\1\244\5\237"+ - "\1\245\1\246\1\237\1\247\3\237\1\250\7\237\1\251"+ - "\4\237\1\240\1\237\1\243\1\240\21\237\13\0\1\111"+ - "\105\0\4\252\2\0\1\253\7\0\2\252\63\0\1\254"+ - "\2\0\2\254\15\0\1\254\12\0\25\254\4\0\1\254"+ - "\1\0\3\254\6\0\1\254\2\0\2\254\20\0\1\255"+ - "\71\0\11\256\2\125\1\126\13\256\1\125\72\256\2\125"+ - "\1\126\13\256\1\125\4\256\1\257\2\256\1\260\6\256"+ - "\1\261\1\256\1\262\40\256\1\0\1\263\1\0\1\263"+ - "\3\0\1\263\1\264\15\0\1\264\35\0\4\263\31\0"+ - "\4\133\12\0\2\133\62\0\3\135\1\0\3\135\1\265"+ - "\13\0\4\135\7\0\32\135\1\0\3\135\6\0\1\135"+ - "\2\0\2\135\1\0\13\136\1\266\75\136\30\24\1\137"+ - "\1\0\107\24\1\0\1\140\57\24\11\146\2\267\1\270"+ - "\13\146\1\267\61\146\1\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\1\147\1\271\30\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\1\0\11\151\2\272\1\273\13\151\1\272\61\151"+ - "\1\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ - "\1\274\15\147\1\275\4\147\1\276\5\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\5\147\1\277\24\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\3\147\1\300\5\147\1\301\2\147"+ - "\1\302\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\1\303\2\147\14\0\4\147\7\0"+ - "\5\147\1\304\24\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\1\147\1\305\1\147\14\0"+ - "\4\147\7\0\1\306\31\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\11\147\1\307\20\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\1\310\31\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\20\147\1\311\1\147\1\312\7\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\2\147\1\313\3\147\1\314\7\147\1\315"+ - "\13\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\1\147\1\316\1\147\14\0\4\147\7\0"+ - "\2\147\1\317\1\320\1\147\1\321\4\147\1\322\1\147"+ - "\1\323\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\1\147\1\324\1\147\14\0\4\147"+ - "\7\0\11\147\1\325\20\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\1\147\1\326\1\147"+ - "\14\0\4\147\7\0\14\147\1\327\15\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\7\147\1\330\22\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\60\0\1\331\110\0\1\332"+ - "\120\0\1\333\22\0\3\147\1\0\3\147\1\334\13\0"+ - "\2\147\1\335\1\147\7\0\15\147\1\336\14\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\1\0\11\174\3\0"+ - "\13\174\1\0\61\174\1\0\3\147\1\0\3\147\1\337"+ - "\13\0\2\147\1\340\1\147\7\0\2\147\1\341\3\147"+ - "\1\314\7\147\1\315\13\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\73\0\1\342\16\0\11\201\3\0\13\201"+ - "\1\0\61\201\3\0\1\343\3\0\1\343\54\0\1\343"+ - "\1\0\2\343\22\0\3\344\3\0\1\344\36\0\2\344"+ - "\3\0\1\344\1\0\1\344\1\0\1\344\2\0\1\344"+ - "\1\0\4\344\2\0\1\344\1\0\1\344\15\0\3\345"+ - "\3\0\1\345\36\0\2\345\3\0\1\345\1\0\1\345"+ - "\1\0\1\345\2\0\1\345\1\0\4\345\2\0\1\345"+ - "\1\0\1\345\17\0\1\203\3\0\1\203\54\0\1\203"+ - "\1\0\2\203\27\0\1\346\42\0\1\347\6\0\1\350"+ - "\1\0\1\351\120\0\1\352\17\0\1\221\1\0\1\221"+ - "\3\0\1\221\54\0\4\221\22\0\3\222\1\0\3\222"+ - "\1\353\13\0\4\222\4\0\1\354\2\0\32\222\1\0"+ - "\3\222\6\0\1\222\2\0\2\222\14\0\1\355\75\0"+ - "\30\232\1\356\60\232\11\233\2\357\1\76\13\233\1\357"+ - "\61\233\11\230\3\0\13\230\1\0\61\230\33\0\1\76"+ - "\55\0\3\235\1\360\1\361\1\235\1\362\1\363\1\235"+ - "\3\0\13\235\1\0\34\235\1\360\1\235\1\363\1\360"+ - "\21\235\3\0\1\364\3\0\1\364\54\0\1\364\1\0"+ - "\2\364\22\0\3\365\3\0\1\365\36\0\2\365\3\0"+ - "\1\365\1\0\1\365\1\0\1\365\2\0\1\365\1\0"+ - "\4\365\2\0\1\365\1\0\1\365\15\0\3\366\3\0"+ - "\1\366\36\0\2\366\3\0\1\366\1\0\1\366\1\0"+ - "\1\366\2\0\1\366\1\0\4\366\2\0\1\366\1\0"+ - "\1\366\17\0\1\240\3\0\1\240\54\0\1\240\1\0"+ - "\2\240\22\0\3\254\1\0\3\254\14\0\4\254\4\0"+ - "\1\367\2\0\32\254\1\0\3\254\6\0\1\254\2\0"+ - "\2\254\1\0\11\257\2\370\1\371\13\257\1\370\61\257"+ - "\11\256\2\125\1\126\13\256\1\125\10\256\1\372\61\256"+ - "\2\125\1\126\13\256\1\125\14\256\1\373\55\256\2\125"+ - "\1\126\13\256\1\125\20\256\1\374\40\256\1\0\1\263"+ - "\1\0\1\263\3\0\1\263\54\0\4\263\31\0\1\265"+ - "\15\0\1\265\63\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\1\375\31\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\1\376\1\147\1\377\13\147\1\u0100\13\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\22\147\1\u0101\7\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\1\147\1\u0102\30\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\2\147\1\u0103\27\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\4\147\1\u0104\25\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\22\147\1\u0105\7\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\20\147\1\u0106\11\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\2\147\1\u0107\27\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\10\147\1\u0108\21\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\1\147\1\u0109\10\147\1\u010a\17\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\1\147\1\u010b\30\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\7\147\1\u010c\2\147"+ - "\1\u010d\17\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ - "\1\u010e\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ - "\1\u010f\14\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\u0110"+ - "\31\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0111"+ - "\15\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\1\u0112\31\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0113\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\22\147\1\u0114\7\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\5\147\1\u0115\24\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0116\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\12\147\1\u0117\17\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0118\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0119\14\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\10\147\1\u011a\21\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u011b\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011c\11\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\16\147\1\u011d\13\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011e\11\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\40\0\1\u011f"+ - "\110\0\1\u0120\130\0\1\u0121\41\0\1\334\15\0\1\334"+ - "\63\0\3\147\1\0\3\147\1\334\13\0\2\147\1\335"+ - "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\2\147\1\u0122\27\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\11\0\1\337\15\0\1\337\63\0\3\147\1\0"+ - "\3\147\1\337\13\0\2\147\1\340\1\147\7\0\32\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0123\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\74\0\1\u0124"+ - "\16\0\3\u0125\3\0\1\u0125\36\0\2\u0125\3\0\1\u0125"+ - "\1\0\1\u0125\1\0\1\u0125\2\0\1\u0125\1\0\4\u0125"+ - "\2\0\1\u0125\1\0\1\u0125\15\0\3\u0126\3\0\1\u0126"+ - "\36\0\2\u0126\3\0\1\u0126\1\0\1\u0126\1\0\1\u0126"+ - "\2\0\1\u0126\1\0\4\u0126\2\0\1\u0126\1\0\1\u0126"+ - "\54\0\1\u0127\20\0\1\u0128\73\0\1\u0129\1\0\1\u012a"+ - "\113\0\1\u012b\76\0\1\u012c\144\0\1\u012d\25\0\1\353"+ - "\15\0\1\353\5\0\1\354\54\0\30\232\1\356\1\76"+ - "\57\232\13\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ - "\1\357\1\233\52\357\3\0\1\235\3\0\1\235\23\0"+ - "\1\76\30\0\1\235\1\0\2\235\25\0\1\u0131\1\0"+ - "\1\u0132\24\0\1\76\56\0\3\u0133\3\0\1\u0133\23\0"+ - "\1\76\12\0\2\u0133\3\0\1\u0133\1\0\1\u0133\1\0"+ - "\1\u0133\2\0\1\u0133\1\0\4\u0133\2\0\1\u0133\1\0"+ - "\1\u0133\17\0\1\360\3\0\1\360\23\0\1\76\30\0"+ - "\1\360\1\0\2\360\22\0\3\u0134\3\0\1\u0134\36\0"+ - "\2\u0134\3\0\1\u0134\1\0\1\u0134\1\0\1\u0134\2\0"+ - "\1\u0134\1\0\4\u0134\2\0\1\u0134\1\0\1\u0134\15\0"+ - "\3\u0135\3\0\1\u0135\36\0\2\u0135\3\0\1\u0135\1\0"+ - "\1\u0135\1\0\1\u0135\2\0\1\u0135\1\0\4\u0135\2\0"+ - "\1\u0135\1\0\1\u0135\14\0\11\256\2\125\1\126\13\256"+ - "\1\125\7\256\1\u0136\62\256\2\125\1\126\13\256\1\125"+ - "\17\256\1\u0137\52\256\2\125\1\126\13\256\1\125\21\256"+ - "\1\u0138\37\256\1\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\16\147\1\u0139\13\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\2\147\1\u013a\27\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\6\147\1\u013b\1\u013c\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\12\147\1\u013d\17\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\12\147\1\u013e\17\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\5\147\1\u013f\24\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\1\147\1\u0140"+ - "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\5\147\1\u0141\24\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0142\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\12\147\1\u0143\17\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0144\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\6\0\1\151\2\147\1\u0145\10\147\1\u0146\2\147"+ - "\1\u0147\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ - "\1\u0148\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\12\147"+ - "\1\u0149\17\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\14\147"+ - "\1\u014a\15\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ - "\1\u014b\24\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ - "\1\u014c\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ - "\1\u014d\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ - "\1\u014e\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ - "\1\u014f\7\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ - "\1\u0150\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ - "\1\u0151\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ - "\1\u0152\30\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ - "\1\u0153\5\147\1\u0154\6\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u0155\25\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u0156\25\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\1\147\1\u0157\1\147"+ - "\14\0\4\147\7\0\32\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\15\147\1\u0158\14\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\7\147\1\u0159\22\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\10\147\1\u015a\21\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\16\147\1\u015b\13\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\12\147\1\u015c\17\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\31\147\1\u015d\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\1\147\1\u015e\1\147\14\0"+ - "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\42\0\1\u015f\110\0\1\u0160\106\0\1\u0161\52\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0162"+ - "\15\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0150"+ - "\1\u0163\27\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\75\0\1\u0164\15\0\3\u0165\3\0\1\u0165\36\0\2\u0165"+ - "\3\0\1\u0165\1\0\1\u0165\1\0\1\u0165\2\0\1\u0165"+ - "\1\0\4\u0165\2\0\1\u0165\1\0\1\u0165\53\0\1\u0166"+ - "\132\0\1\u0167\74\0\1\u0168\104\0\1\u0169\115\0\1\u016a"+ - "\125\0\1\u016b\121\0\1\u016c\14\0\13\357\1\76\14\357"+ - "\1\u016d\1\233\57\357\4\u012f\1\u016e\4\u012f\2\357\1\76"+ - "\13\u012f\1\357\2\u012f\1\357\56\u012f\4\u016f\1\u0170\4\u016f"+ - "\2\357\1\76\13\u016f\1\357\3\u016f\1\233\55\u016f\4\0"+ - "\1\u0131\1\0\1\u0132\103\0\3\u0133\3\0\1\u0133\36\0"+ - "\2\u0133\3\0\1\u0133\1\0\1\u0133\1\0\1\u0133\2\0"+ - "\1\u0133\1\0\4\u0133\2\0\1\u0133\1\0\1\u0133\15\0"+ - "\3\u0171\3\0\1\u0171\36\0\2\u0171\3\0\1\u0171\1\0"+ - "\1\u0171\1\0\1\u0171\2\0\1\u0171\1\0\4\u0171\2\0"+ - "\1\u0171\1\0\1\u0171\15\0\3\u0172\3\0\1\u0172\36\0"+ - "\2\u0172\3\0\1\u0172\1\0\1\u0172\1\0\1\u0172\2\0"+ - "\1\u0172\1\0\4\u0172\2\0\1\u0172\1\0\1\u0172\14\0"+ - "\11\256\2\125\1\126\13\256\1\125\11\256\1\u0173\60\256"+ - "\2\125\1\126\13\256\1\125\4\256\1\u0174\4\256\1\u0175"+ - "\10\256\1\u0176\47\256\2\125\1\126\13\256\1\125\16\256"+ - "\1\u0177\42\256\1\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\5\147\1\u0178\24\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\6\0\1\151\2\147\1\u0179\27\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\4\147\1\u017a\25\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\24\147\1\u017b\5\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\1\147\1\u017c"+ - "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u017d\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\4\147\1\u017e\25\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\1\147\1\u017f\30\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\6\147\1\u0180\23\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\1\u0181"+ - "\13\0\2\147\1\u0182\1\147\7\0\32\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\7\147\1\u0183\22\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\1\147\1\u0184\30\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\3\147\1\u0185\26\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\14\147\1\u0186\15\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\12\147\1\u0187\17\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\2\147\1\u0188\27\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\12\147\1\u0189\17\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\10\147\1\u018a\21\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\1\u018b"+ - "\2\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\4\147\1\u018c\25\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\4\147\1\u018d\25\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\23\147\1\u018e\6\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\16\147\1\u018f\13\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0190\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\11\147\1\u0191\20\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0192\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\14\147\1\u0193\15\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\17\147\1\u0194\12\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\15\147\1\u0195\14\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\12\147\1\u0196\17\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0197\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\16\147\1\u0198\13\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\1\u0199\31\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\24\147\1\u019a\5\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\42\0\1\u019b\50\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\2\147\1\u019c\27\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\7\147\1\u019d\22\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\22\0\1\u019e\144\0\1\u019f"+ - "\101\0\1\u01a0\110\0\1\u01a1\103\0\1\u01a2\110\0\1\u01a3"+ - "\106\0\1\u01a4\72\0\1\u01a5\67\0\11\u016d\2\u01a6\1\u01a7"+ - "\13\u016d\1\u01a6\1\u01a8\60\u016d\11\u012f\2\357\1\76\13\u012f"+ - "\1\357\61\u012f\11\233\2\357\1\76\13\233\1\357\3\233"+ - "\1\357\55\233\3\u016f\1\u01a9\1\u01aa\1\u016f\1\u01ab\1\u01ac"+ - "\1\u016f\2\357\1\76\13\u016f\1\357\34\u016f\1\u01a9\1\u016f"+ - "\1\u01ac\1\u01a9\21\u016f\1\0\3\u01ad\3\0\1\u01ad\36\0"+ - "\2\u01ad\3\0\1\u01ad\1\0\1\u01ad\1\0\1\u01ad\2\0"+ - "\1\u01ad\1\0\4\u01ad\2\0\1\u01ad\1\0\1\u01ad\14\0"+ - "\11\256\2\125\1\126\13\256\1\125\4\256\1\u01ae\4\256"+ - "\1\u01af\47\256\11\u0174\2\u01b0\1\u01b1\13\u0174\1\u01b0\61\u0174"+ - "\11\256\2\125\1\126\13\256\1\125\12\256\1\u01b2\57\256"+ - "\2\125\1\126\13\256\1\125\23\256\1\u01b3\42\256\1\u01b4"+ - "\3\256\2\125\1\126\13\256\1\125\61\256\1\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b5\6\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\3\147\1\u01b6\26\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\14\147\1\u01b7\15\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\7\147\1\u01b8\22\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b9\6\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\17\147\1\u01ba\12\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\7\147\1\u01bb\22\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\14\0\4\147\7\0\1\u01bc\31\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\15\147\1\u01bd\14\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\3\0\1\u01be\2\0"+ - "\2\u01be\1\0\1\u0181\7\0\1\u01bf\3\0\1\u01be\1\0"+ - "\1\u0181\10\0\25\u01be\4\0\1\u01be\1\0\3\u01be\6\0"+ - "\1\u01be\2\0\2\u01be\2\0\1\147\1\u01be\1\147\1\0"+ - "\2\u01be\1\147\1\u0181\7\0\1\u01bf\3\0\1\u01be\1\147"+ - "\1\u0182\1\147\7\0\25\u01be\4\147\1\u01be\1\0\3\u01be"+ - "\6\0\1\u01be\2\0\2\u01be\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\23\147\1\u01c0\6\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\4\147\1\u01c1\25\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\12\147\1\u01c2\17\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\5\147\1\u01c3\24\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\1\u01c4\31\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\2\147\1\u01c5\27\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\14\147\1\u01c6\15\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\1\u01c7\31\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\14\147\1\u01c8\15\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\3\147\1\u01c9\26\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u01ca\25\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\17\147\1\u01cb\12\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\20\147\1\u01cc\11\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u01cd\25\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\1\147\1\u01ce\30\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\1\u01cf\13\0"+ - "\2\147\1\u01d0\1\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u01d1\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\4\147\1\u01d2\25\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\21\147\1\u01d3\10\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\16\147\1\u01d4\13\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u01d5\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\1\337"+ - "\13\0\2\147\1\340\1\147\7\0\15\147\1\u01d6\14\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\22\0\1\u01d7"+ - "\133\0\1\u01d8\107\0\1\u01d9\110\0\1\u01da\113\0\1\u01db"+ - "\103\0\1\u01dc\110\0\1\u01dd\70\0\1\u01de\67\0\13\u01a6"+ - "\1\u01a7\14\u01a6\1\u01df\1\u01e0\1\u01e1\1\u01e2\1\u016d\1\u01a6"+ - "\1\u016d\52\u01a6\30\u01a7\1\u01e3\1\u01e4\1\u01e5\1\u01e6\1\232"+ - "\1\u01a7\1\232\52\u01a7\11\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ - "\1\u01a8\1\357\57\u016d\3\233\1\u016f\3\233\1\u016f\1\233"+ - "\2\357\1\76\13\233\1\357\3\233\1\357\30\233\1\u016f"+ - "\1\233\2\u016f\25\233\1\u01e7\1\233\1\u01e8\2\233\2\357"+ - "\1\76\13\233\1\357\3\233\1\357\56\233\3\u01e9\3\233"+ - "\1\u01e9\1\233\2\357\1\76\13\233\1\357\3\233\1\357"+ - "\12\233\2\u01e9\3\233\1\u01e9\1\233\1\u01e9\1\233\1\u01e9"+ - "\2\233\1\u01e9\1\233\4\u01e9\2\233\1\u01e9\1\233\1\u01e9"+ - "\17\233\1\u01a9\3\233\1\u01a9\1\233\2\357\1\76\13\233"+ - "\1\357\3\233\1\357\30\233\1\u01a9\1\233\2\u01a9\21\233"+ - "\1\0\3\235\3\0\1\235\36\0\2\235\3\0\1\235"+ - "\1\0\1\235\1\0\1\235\2\0\1\235\1\0\4\235"+ - "\2\0\1\235\1\0\1\235\14\0\11\u01ae\2\u01ea\1\u01eb"+ - "\13\u01ae\1\u01ea\61\u01ae\11\256\2\125\1\126\13\256\1\125"+ - "\12\256\1\u01ec\57\256\2\125\1\126\13\256\1\125\13\256"+ - "\1\u01ed\56\256\2\125\1\126\13\256\1\125\21\256\1\u01ee"+ - "\50\256\2\125\1\126\13\256\1\125\11\256\1\u01ef\47\256"+ - "\1\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ - "\1\u01f0\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ - "\1\u01f1\25\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ - "\1\u01f2\7\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ - "\1\u01f3\25\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ - "\1\u01f4\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ - "\1\u01f5\22\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ - "\1\u01f6\13\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\1\u01f7\2\147\14\0\4\147\7\0"+ - "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\1\u01f8\13\0\2\147\1\u01f9\1\147"+ - "\7\0\32\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\u01be\1\0\3\u01be\1\u01fa\3\0\1\u01fb\1\0"+ - "\1\u01fc\1\0\1\u01fd\3\0\4\u01be\7\0\32\u01be\1\0"+ - "\3\u01be\6\0\1\u01be\2\0\2\u01be\2\0\3\u01fe\1\0"+ - "\4\u01fe\3\0\2\u01fe\2\0\10\u01fe\7\0\32\u01fe\1\0"+ - "\3\u01fe\6\0\1\u01fe\2\0\2\u01fe\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\15\147\1\u01ff\14\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\5\147\1\u0200\24\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\6\0\1\151\32\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\15\147\1\u0201\14\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\5\147\1\u0202\24\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\3\147\1\u0203\26\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\16\147\1\u0204\13\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\13\147\1\u0205\16\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\12\147\1\u0206\17\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\4\147\1\u0207\25\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\1\u0208\13\0\2\147\1\u0209\1\147\7\0\32\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\1\147\1\u020a\1\147\14\0\4\147\7\0\32\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\24\147\1\u020b\5\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\3\0\1\u020c\2\0"+ - "\2\u020c\1\0\1\u01cf\13\0\1\u020c\1\0\1\u01cf\10\0"+ - "\25\u020c\4\0\1\u020c\1\0\3\u020c\6\0\1\u020c\2\0"+ - "\2\u020c\2\0\1\147\1\u020c\1\147\1\0\2\u020c\1\147"+ - "\1\u01cf\13\0\1\u020c\1\147\1\u01d0\1\147\7\0\25\u020c"+ - "\4\147\1\u020c\1\0\3\u020c\6\0\1\u020c\2\0\2\u020c"+ - "\2\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ - "\1\u020d\14\147\1\0\3\147\6\0\1\147\2\0\2\147"+ - "\2\0\3\147\1\0\3\147\1\u020e\13\0\2\147\1\u020f"+ - "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\2\0\3\147\1\0\3\147\1\334\13\0\2\147"+ - "\1\335\1\147\7\0\15\147\1\u0210\14\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\11\0\4\u01d7\12\0\2\u01d7"+ - "\6\0\1\u0211\134\0\1\u0212\103\0\1\u0213\110\0\1\u0214"+ - "\76\0\1\u0215\113\0\1\u0216\147\0\1\u0217\13\0\4\u0218"+ - "\12\0\2\u0218\61\0\13\u01a6\1\u01a7\14\u01a6\1\u01df\1\u0219"+ - "\1\u01e1\1\u01e2\1\u016d\1\u01a6\1\u016d\65\u01a6\1\u01a7\14\u01a6"+ - "\1\u021a\1\u016d\57\u01a6\4\u01e1\1\u021b\4\u01e1\2\u01a6\1\u01a7"+ - "\13\u01e1\1\u01a6\1\u021c\1\u01e1\1\u01a6\56\u01e1\4\u021d\1\u021e"+ - "\4\u021d\2\u01a6\1\u01a7\13\u021d\1\u01a6\1\u021f\2\u021d\1\u016d"+ - "\55\u021d\30\u01a7\1\u01e3\1\u0220\1\u01e5\1\u01e6\1\232\1\u01a7"+ - "\1\232\102\u01a7\1\u0221\1\u016d\57\u01a7\4\u01e5\1\u0222\4\u01e5"+ - "\3\232\13\u01e5\1\232\1\u0223\1\u01e5\1\u01a7\56\u01e5\4\u0224"+ - "\1\u0225\4\u0224\3\232\13\u0224\1\232\1\u0226\2\u0224\1\232"+ - "\55\u0224\4\233\1\u01e7\1\233\1\u01e8\2\233\2\357\1\76"+ - "\13\233\1\357\62\233\3\u01e9\3\233\1\u01e9\1\233\2\357"+ - "\1\76\13\233\1\357\16\233\2\u01e9\3\233\1\u01e9\1\233"+ - "\1\u01e9\1\233\1\u01e9\2\233\1\u01e9\1\233\4\u01e9\2\233"+ - "\1\u01e9\1\233\1\u01e9\15\233\3\u0227\3\233\1\u0227\1\233"+ - "\2\357\1\76\13\233\1\357\16\233\2\u0227\3\233\1\u0227"+ - "\1\233\1\u0227\1\233\1\u0227\2\233\1\u0227\1\233\4\u0227"+ - "\2\233\1\u0227\1\233\1\u0227\14\233\11\256\2\125\1\126"+ - "\13\256\1\125\13\256\1\u0228\56\256\2\125\1\126\13\256"+ - "\1\125\14\256\1\u0229\55\256\2\125\1\126\13\256\1\125"+ - "\4\256\1\u022a\65\256\2\125\1\126\13\256\1\125\12\256"+ - "\1\u022b\46\256\1\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\5\147\1\u022c\24\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\1\u022d\13\0"+ - "\2\147\1\u022d\1\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\1\147\1\u022e\30\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\14\147\1\u022f\15\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\1\0\2\u0230\1\u0231\2\u0230\2\u0231"+ - "\1\u0230\1\u01f8\3\0\10\u0230\1\u0231\1\u0230\1\u01f8\1\0"+ - "\7\u0230\25\u0231\4\u0230\1\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ - "\2\u0230\2\u0231\2\u0230\1\u0232\1\u0231\1\u0232\1\u0230\2\u0231"+ - "\1\u0232\1\u01f8\3\0\10\u0230\1\u0231\1\u0232\1\u01f9\1\147"+ - "\7\u0230\25\u0231\4\u0232\1\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ - "\2\u0230\2\u0231\1\u0230\10\0\1\u01fa\3\0\1\u01fb\1\0"+ - "\1\u01fc\1\0\1\u01fd\5\0\1\u01fa\64\0\1\u01be\2\0"+ - "\2\u01be\1\0\1\u01fb\13\0\1\u01be\1\0\1\u01fb\10\0"+ - "\25\u01be\4\0\1\u01be\1\0\3\u01be\6\0\1\u01be\2\0"+ - "\2\u01be\11\0\1\u01fc\6\0\1\u0233\6\0\1\u01fc\63\0"+ - "\3\u0234\1\0\4\u0234\3\0\2\u0234\2\0\10\u0234\7\0"+ - "\32\u0234\1\0\3\u0234\6\0\1\u0234\2\0\2\u0234\2\0"+ - "\3\u01fe\1\0\4\u01fe\3\0\2\u01fe\2\0\1\u01fe\1\u0235"+ - "\6\u01fe\7\0\32\u01fe\1\0\3\u01fe\6\0\1\u01fe\2\0"+ - "\2\u01fe\2\0\3\147\1\0\3\147\1\u0236\13\0\2\147"+ - "\1\u0237\1\147\7\0\32\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\6\147\1\u0238\23\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\7\147\1\u0239\22\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\1\147\1\u023a\30\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\4\147\1\u023b\25\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\2\147\1\u023c\27\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\14\147\1\u023d\15\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\5\147\1\u023e\24\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\5\147\1\u023f\24\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\1\0\2\u0240\1\u0241\2\u0240\2\u0241\1\u0240"+ - "\1\u0208\3\0\10\u0240\1\u0241\1\u0240\1\u0208\1\0\7\u0240"+ - "\25\u0241\4\u0240\1\u0241\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240"+ - "\2\u0241\2\u0240\1\u0242\1\u0241\1\u0242\1\u0240\2\u0241\1\u0242"+ - "\1\u0208\3\0\10\u0240\1\u0241\1\u0242\1\u0209\1\147\7\u0240"+ - "\25\u0241\4\u0242\1\u0241\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240"+ - "\2\u0241\1\u0240\1\0\3\147\1\0\3\147\14\0\4\147"+ - "\7\0\24\147\1\u0243\5\147\1\0\3\147\6\0\1\147"+ - "\2\0\2\147\2\0\3\147\1\0\3\147\1\u0244\13\0"+ - "\2\147\1\u0245\1\147\7\0\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\u020c\1\0\3\u020c\1\u0246"+ - "\7\0\1\u0247\3\0\4\u020c\7\0\32\u020c\1\0\3\u020c"+ - "\6\0\1\u020c\2\0\2\u020c\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\15\147\1\u0248\14\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\1\0\1\u0249\1\u024a\1\u0249"+ - "\1\u024a\3\u0249\1\u024a\1\u020e\3\0\12\u0249\1\u020e\1\0"+ - "\34\u0249\4\u024a\22\u0249\1\u024b\1\u024c\1\u024b\1\u0249\2\u024c"+ - "\1\u024b\1\u020e\3\0\10\u0249\2\u024c\1\u020f\1\147\7\u0249"+ - "\25\u024c\4\u024b\1\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249"+ - "\2\u024c\1\u0249\46\0\1\u024d\115\0\1\u024e\110\0\1\u024f"+ - "\142\0\1\u0250\46\0\1\u0251\64\0\1\u0252\101\0\4\u0218"+ - "\12\0\2\u0218\6\0\1\u0253\52\0\13\357\1\76\14\357"+ - "\1\u01a6\1\u012e\1\u0254\1\u0255\55\357\11\u016d\2\u01a6\1\u01a7"+ - "\13\u016d\1\u01a6\1\u01a8\1\u01a6\57\u016d\11\u01e1\2\u01a6\1\u01a7"+ - "\13\u01e1\1\u01a6\1\u021c\64\u01e1\1\u021b\4\u01e1\2\u01a6\1\u01a7"+ - "\13\u01e1\1\u01a6\1\u021c\1\u0254\1\u01a6\56\u01e1\11\u016d\2\u01a6"+ - "\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\55\u016d\3\u021d"+ - "\1\u0256\1\u0257\1\u021d\1\u0258\1\u0259\1\u021d\2\u01a6\1\u01a7"+ - "\13\u021d\1\u01a6\1\u021f\33\u021d\1\u0256\1\u021d\1\u0259\1\u0256"+ - "\21\u021d\11\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\1\357"+ - "\1\u016d\1\u01a6\55\u016d\30\76\1\u01a7\1\u012e\1\u025a\1\u025b"+ - "\55\76\30\232\1\356\1\u01a7\57\232\11\u01e5\3\232\13\u01e5"+ - "\1\232\1\u0223\64\u01e5\1\u0222\4\u01e5\3\232\13\u01e5\1\232"+ - "\1\u0223\1\u025a\1\u01a7\56\u01e5\30\232\1\356\2\232\1\u01a7"+ - "\55\232\3\u0224\1\u025c\1\u025d\1\u0224\1\u025e\1\u025f\1\u0224"+ - "\3\232\13\u0224\1\232\1\u0226\33\u0224\1\u025c\1\u0224\1\u025f"+ - "\1\u025c\21\u0224\30\232\1\356\1\76\1\232\1\u01a7\55\232"+ - "\1\233\3\u0260\3\233\1\u0260\1\233\2\357\1\76\13\233"+ - "\1\357\16\233\2\u0260\3\233\1\u0260\1\233\1\u0260\1\233"+ - "\1\u0260\2\233\1\u0260\1\233\4\u0260\2\233\1\u0260\1\233"+ - "\1\u0260\14\233\11\256\2\125\1\126\13\256\1\125\14\256"+ - "\1\u0261\55\256\2\125\1\126\13\256\1\125\15\256\1\u0262"+ - "\43\256\11\u022a\2\u0263\1\u0264\13\u022a\1\u0263\61\u022a\11\256"+ - "\2\125\1\126\13\256\1\125\13\256\1\u0265\45\256\1\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\6\147\1\u0266"+ - "\23\147\1\0\3\147\6\0\1\147\2\0\2\147\1\0"+ - "\13\u022d\1\0\75\u022d\1\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\2\147\1\u0267\27\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\15\147\1\u0268\14\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\1\0\11\u0230\3\0\13\u0230\1\0"+ - "\62\u0230\3\u0231\1\u0230\3\u0231\1\u0269\3\0\2\u01f8\6\u0230"+ - "\3\u0231\1\u026a\7\u0230\32\u0231\1\u0230\3\u0231\6\u0230\1\u0231"+ - "\2\u0230\2\u0231\2\u0230\3\u0232\1\u0230\3\u0232\1\u0230\3\0"+ - "\10\u0230\3\u0232\1\147\7\u0230\32\u0232\1\u0230\3\u0232\6\u0230"+ - "\1\u0232\2\u0230\2\u0232\1\u0230\10\0\1\u0233\5\0\1\u01fc"+ - "\7\0\1\u0233\63\0\3\u0234\1\0\4\u0234\3\0\2\u0234"+ - "\2\0\1\u0234\1\u026b\6\u0234\7\0\32\u0234\1\0\3\u0234"+ - "\6\0\1\u0234\2\0\2\u0234\2\0\1\u01fe\1\u026c\1\u01fe"+ - "\1\0\2\u026c\1\u01fe\1\u0235\3\0\2\u01fe\2\0\1\u01fe"+ - "\1\u0235\2\u01fe\1\u026c\1\u01fe\1\u0235\1\u01fe\7\0\25\u026c"+ - "\4\u01fe\1\u026c\1\0\3\u026c\6\0\1\u026c\2\0\2\u026c"+ - "\3\0\1\u026d\2\0\2\u026d\1\0\1\u0236\13\0\1\u026d"+ - "\1\0\1\u0236\10\0\25\u026d\4\0\1\u026d\1\0\3\u026d"+ - "\6\0\1\u026d\2\0\2\u026d\2\0\1\147\1\u026d\1\147"+ - "\1\0\2\u026d\1\147\1\u0236\13\0\1\u026d\1\147\1\u0237"+ - "\1\147\7\0\25\u026d\4\147\1\u026d\1\0\3\u026d\6\0"+ - "\1\u026d\2\0\2\u026d\2\0\3\147\1\0\3\147\1\u026e"+ - "\13\0\2\147\1\u026f\1\147\6\0\1\151\32\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\1\u0270\13\0\2\147\1\u0271\1\147\7\0\32\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\2\0\3\147"+ - "\1\0\3\147\1\u0272\13\0\2\147\1\u0273\1\147\7\0"+ - "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\5\147\1\u0274"+ - "\24\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\2\147\1\u0275"+ - "\27\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0276"+ - "\30\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u0277"+ - "\25\147\1\0\3\147\6\0\1\147\2\0\2\147\1\0"+ - "\11\u0240\3\0\13\u0240\1\0\62\u0240\3\u0241\1\u0240\3\u0241"+ - "\1\u0278\3\0\1\u0208\7\u0240\3\u0241\1\u0279\7\u0240\32\u0241"+ - "\1\u0240\3\u0241\6\u0240\1\u0241\2\u0240\2\u0241\2\u0240\3\u0242"+ - "\1\u0240\3\u0242\1\u0240\3\0\10\u0240\3\u0242\1\147\7\u0240"+ - "\32\u0242\1\u0240\3\u0242\6\u0240\1\u0242\2\u0240\2\u0242\1\u0240"+ - "\2\0\1\u027a\2\0\2\u027a\1\0\1\u0244\7\0\1\u027b"+ - "\3\0\1\u027a\1\0\1\u0244\10\0\25\u027a\4\0\1\u027a"+ - "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\2\0\1\147"+ - "\1\u027c\1\147\1\0\2\u027c\1\147\1\u0244\7\0\1\u027b"+ - "\3\0\1\u027c\1\147\1\u0245\1\147\7\0\25\u027c\4\147"+ - "\1\u027c\1\0\3\u027c\6\0\1\u027c\2\0\2\u027c\11\0"+ - "\1\u0246\7\0\1\u0247\5\0\1\u0246\63\0\3\u027d\1\0"+ - "\4\u027d\3\0\2\u027d\2\0\10\u027d\7\0\32\u027d\1\0"+ - "\3\u027d\6\0\1\u027d\2\0\2\u027d\1\0\11\u0249\3\0"+ - "\13\u0249\1\0\62\u0249\1\u024a\1\u0249\1\u024a\3\u0249\1\u024a"+ - "\1\u027e\3\0\12\u0249\1\u027e\1\0\34\u0249\4\u024a\22\u0249"+ - "\1\u024b\1\u024c\1\u024b\1\u0249\2\u024c\1\u024b\1\u027e\3\0"+ - "\10\u0249\2\u024c\1\u027f\1\147\7\u0249\25\u024c\4\u024b\1\u024c"+ - "\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c\2\u0249\3\u024c"+ - "\1\u0249\3\u024c\1\u0249\3\0\10\u0249\3\u024c\1\147\7\u0249"+ - "\32\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c\1\u0249"+ - "\106\0\1\u0280\56\0\1\u0281\110\0\1\u0282\53\0\1\u0283"+ - "\153\0\1\u0284\22\0\1\u0285\3\0\4\u0254\1\u0286\4\u0254"+ - "\2\357\1\76\13\u0254\1\357\1\u0254\1\u0287\1\u0254\1\u0288"+ - "\1\u012f\1\u0254\1\u012f\52\u0254\4\u0289\1\u028a\4\u0289\2\357"+ - "\1\76\13\u0289\1\357\1\u0289\1\u012e\1\u028b\1\u0130\1\u016f"+ - "\1\u0289\1\u016f\52\u0289\3\u016d\1\u021d\3\u016d\1\u021d\1\u016d"+ - "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\30\u016d"+ - "\1\u021d\1\u016d\2\u021d\25\u016d\1\u028c\1\u016d\1\u028d\2\u016d"+ - "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\56\u016d"+ - "\3\u028e\3\u016d\1\u028e\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ - "\1\u01a8\2\u016d\1\u01a6\12\u016d\2\u028e\3\u016d\1\u028e\1\u016d"+ - "\1\u028e\1\u016d\1\u028e\2\u016d\1\u028e\1\u016d\4\u028e\2\u016d"+ - "\1\u028e\1\u016d\1\u028e\17\u016d\1\u0256\3\u016d\1\u0256\1\u016d"+ - "\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\2\u016d\1\u01a6\30\u016d"+ - "\1\u0256\1\u016d\2\u0256\21\u016d\4\u025a\1\u028f\4\u025a\3\76"+ - "\13\u025a\1\76\1\u025a\1\u0290\1\u025a\1\u0291\1\230\1\u025a"+ - "\1\230\52\u025a\4\u0292\1\u0293\4\u0292\3\76\13\u0292\1\76"+ - "\1\u0292\1\227\1\u0294\1\231\1\235\1\u0292\1\235\52\u0292"+ - "\3\232\1\u0224\3\232\1\u0224\20\232\1\356\2\232\1\u01a7"+ - "\30\232\1\u0224\1\232\2\u0224\25\232\1\u0295\1\232\1\u0296"+ - "\21\232\1\356\2\232\1\u01a7\56\232\3\u0297\3\232\1\u0297"+ - "\20\232\1\356\2\232\1\u01a7\12\232\2\u0297\3\232\1\u0297"+ - "\1\232\1\u0297\1\232\1\u0297\2\232\1\u0297\1\232\4\u0297"+ - "\2\232\1\u0297\1\232\1\u0297\17\232\1\u025c\3\232\1\u025c"+ - "\20\232\1\356\2\232\1\u01a7\30\232\1\u025c\1\232\2\u025c"+ - "\21\232\1\233\3\u016f\3\233\1\u016f\1\233\2\357\1\76"+ - "\13\233\1\357\16\233\2\u016f\3\233\1\u016f\1\233\1\u016f"+ - "\1\233\1\u016f\2\233\1\u016f\1\233\4\u016f\2\233\1\u016f"+ - "\1\233\1\u016f\14\233\11\256\2\125\1\126\13\256\1\125"+ - "\15\256\1\u0298\54\256\2\125\1\126\13\256\1\125\4\256"+ - "\1\u0299\65\256\2\125\1\126\13\256\1\125\14\256\1\u029a"+ - "\44\256\1\0\3\147\1\0\3\147\1\u029b\13\0\2\147"+ - "\1\u029c\1\147\6\0\1\151\32\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\15\147\1\u029d\14\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\2\0\3\147\1\0\3\147\14\0"+ - "\4\147\7\0\7\147\1\u0248\22\147\1\0\3\147\6\0"+ - "\1\147\2\0\2\147\1\0\10\u0230\1\u0269\3\0\2\u01f8"+ - "\10\u0230\1\u0269\1\0\61\u0230\1\0\3\u026a\1\0\3\u026a"+ - "\1\u029e\3\0\2\u029f\6\0\4\u026a\7\0\32\u026a\1\0"+ - "\3\u026a\6\0\1\u026a\2\0\2\u026a\2\0\3\u0234\1\0"+ - "\3\u0234\1\u026b\3\0\2\u0234\1\u01fc\1\0\1\u0234\1\u026b"+ - "\4\u0234\1\u026b\1\u0234\7\0\32\u0234\1\0\3\u0234\6\0"+ - "\1\u0234\2\0\2\u0234\2\0\3\u026c\1\0\3\u026c\1\u02a0"+ - "\3\0\1\u0235\1\u01fe\1\u01fc\1\0\1\u02a1\1\u0235\2\u01fe"+ - "\4\u026c\7\0\32\u026c\1\0\3\u026c\6\0\1\u026c\2\0"+ - "\2\u026c\2\0\3\u026d\1\0\3\u026d\1\u02a2\3\0\1\u0236"+ - "\3\0\1\u02a3\3\0\4\u026d\7\0\32\u026d\1\0\3\u026d"+ - "\6\0\1\u026d\2\0\2\u026d\1\0\2\u02a4\1\u02a5\2\u02a4"+ - "\2\u02a5\1\u02a4\1\u026e\3\0\10\u02a4\1\u02a5\1\u02a4\1\u026e"+ - "\1\0\7\u02a4\25\u02a5\4\u02a4\1\u02a5\1\u02a4\3\u02a5\6\u02a4"+ - "\1\u02a5\2\u02a4\2\u02a5\2\u02a4\1\u02a6\1\u02a5\1\u02a6\1\u02a4"+ - "\2\u02a5\1\u02a6\1\u026e\3\0\10\u02a4\1\u02a5\1\u02a6\1\u026f"+ - "\1\147\7\u02a4\25\u02a5\4\u02a6\1\u02a5\1\u02a4\3\u02a5\6\u02a4"+ - "\1\u02a5\2\u02a4\2\u02a5\1\u02a4\10\0\1\u0270\15\0\1\u0270"+ - "\12\0\1\u02a7\5\0\1\u02a8\42\0\3\147\1\0\3\147"+ - "\1\u0270\13\0\2\147\1\u0271\1\147\7\0\2\147\1\u02a9"+ - "\5\147\1\u02aa\21\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\3\0\1\u02ab\2\0\2\u02ab\1\0\1\u0272\13\0"+ - "\1\u02ab\1\0\1\u0272\10\0\25\u02ab\4\0\1\u02ab\1\0"+ - "\3\u02ab\6\0\1\u02ab\2\0\2\u02ab\2\0\1\147\1\u02ab"+ - "\1\147\1\0\2\u02ab\1\147\1\u0272\13\0\1\u02ab\1\147"+ - "\1\u0273\1\147\7\0\25\u02ab\4\147\1\u02ab\1\0\3\u02ab"+ - "\6\0\1\u02ab\2\0\2\u02ab\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\6\147\1\u02ac\23\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\7\147\1\u02ad\22\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\14\0\4\147\7\0\7\147\1\u02ae\22\147\1\0\3\147"+ - "\6\0\1\147\2\0\2\147\2\0\3\147\1\0\3\147"+ - "\1\u02af\13\0\2\147\1\u02b0\1\147\7\0\32\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\1\0\10\u0240\1\u0278"+ - "\3\0\1\u0208\11\u0240\1\u0278\1\0\61\u0240\1\0\3\u0279"+ - "\1\0\3\u0279\1\u02b1\3\0\1\u02b2\7\0\4\u0279\7\0"+ - "\32\u0279\1\0\3\u0279\6\0\1\u0279\2\0\2\u0279\2\0"+ - "\3\u027a\1\0\3\u027a\1\u02b3\3\0\1\u02b4\1\0\1\u02b5"+ - "\1\0\1\u02b6\3\0\2\u027a\1\u02b7\1\u027a\7\0\32\u027a"+ - "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\2\0\3\u02b8"+ - "\1\0\4\u02b8\3\0\2\u02b8\2\0\10\u02b8\7\0\32\u02b8"+ - "\1\0\3\u02b8\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u027c"+ - "\1\0\3\u027c\1\u02b3\3\0\1\u02b4\1\0\1\u02b5\1\0"+ - "\1\u02b6\3\0\2\u027c\1\u02b9\1\u027c\7\0\32\u027c\1\0"+ - "\3\u027c\6\0\1\u027c\2\0\2\u027c\2\0\3\u027d\1\0"+ - "\4\u027d\3\0\2\u027d\2\0\1\u027d\1\u02ba\6\u027d\7\0"+ - "\32\u027d\1\0\3\u027d\6\0\1\u027d\2\0\2\u027d\1\0"+ - "\10\u0249\1\u027e\3\0\12\u0249\1\u027e\1\0\62\u0249\3\u024c"+ - "\1\u0249\3\u024c\1\u027e\3\0\10\u0249\2\u024c\1\u027f\1\147"+ - "\7\u0249\32\u024c\1\u0249\3\u024c\6\u0249\1\u024c\2\u0249\2\u024c"+ - "\1\u0249\6\0\1\u02bb\30\0\1\u02bc\1\u02bd\1\u02be\2\0"+ - "\1\u02bf\1\0\1\u02c0\1\u02c1\1\0\1\u02c2\2\0\1\u02c3"+ - "\1\u02c4\1\u02c5\2\0\1\u02c6\1\u02c7\74\0\1\u02c8\110\0"+ - "\1\u02c9\101\0\1\u02ca\70\0\1\u02cb\71\0\11\u0254\2\357"+ - "\1\76\13\u0254\1\357\1\u0254\1\u0287\1\u012f\1\u0288\1\u012f"+ - "\1\u0254\1\u012f\56\u0254\1\u0286\4\u0254\2\357\1\76\13\u0254"+ - "\1\357\1\u01e1\1\u012f\1\357\56\u0254\4\u028b\1\u02cc\4\u028b"+ - "\2\357\1\76\13\u028b\1\357\2\u028b\1\u0289\1\u012f\55\u028b"+ - "\13\357\1\76\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357"+ - "\1\233\52\357\3\u0289\1\u02cd\1\u02ce\1\u0289\1\u02cf\1\u02d0"+ - "\1\u0289\2\357\1\76\13\u0289\1\357\1\u0289\1\u012e\1\u028b"+ - "\1\u02d1\1\u016f\1\u0289\1\u016f\25\u0289\1\u02cd\1\u0289\1\u02d0"+ - "\1\u02cd\21\u0289\4\u012f\1\u016e\4\u012f\2\357\1\76\13\u012f"+ - "\1\357\2\u012f\1\357\1\u0254\55\u012f\4\u016d\1\u028c\1\u016d"+ - "\1\u028d\2\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\61\u016d"+ - "\3\u028e\3\u016d\1\u028e\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6"+ - "\1\u01a8\15\u016d\2\u028e\3\u016d\1\u028e\1\u016d\1\u028e\1\u016d"+ - "\1\u028e\2\u016d\1\u028e\1\u016d\4\u028e\2\u016d\1\u028e\1\u016d"+ - "\1\u028e\15\u016d\3\u02d2\3\u016d\1\u02d2\1\u016d\2\u01a6\1\u01a7"+ - "\13\u016d\1\u01a6\1\u01a8\15\u016d\2\u02d2\3\u016d\1\u02d2\1\u016d"+ - "\1\u02d2\1\u016d\1\u02d2\2\u016d\1\u02d2\1\u016d\4\u02d2\2\u016d"+ - "\1\u02d2\1\u016d\1\u02d2\14\u016d\11\u025a\3\76\13\u025a\1\76"+ - "\1\u025a\1\u0290\1\230\1\u0291\1\230\1\u025a\1\230\56\u025a"+ - "\1\u028f\4\u025a\3\76\13\u025a\1\76\1\u01e5\1\u012f\1\76"+ - "\56\u025a\4\u0294\1\u02d3\4\u0294\3\0\13\u0294\1\0\2\u0294"+ - "\1\u0292\1\230\55\u0294\31\76\1\227\1\230\1\u025b\1\0"+ - "\1\76\1\0\52\76\3\u0292\1\u02d4\1\u02d5\1\u0292\1\u02d6"+ - "\1\u02d7\1\u0292\3\76\13\u0292\1\76\1\u0292\1\227\1\u0294"+ - "\1\u02d8\1\235\1\u0292\1\235\25\u0292\1\u02d4\1\u0292\1\u02d7"+ - "\1\u02d4\21\u0292\4\230\1\234\4\230\3\0\13\230\1\0"+ - "\2\230\1\76\1\u025a\55\230\4\232\1\u0295\1\232\1\u0296"+ - "\21\232\1\356\61\232\3\u0297\3\232\1\u0297\20\232\1\356"+ - "\15\232\2\u0297\3\232\1\u0297\1\232\1\u0297\1\232\1\u0297"+ - "\2\232\1\u0297\1\232\4\u0297\2\232\1\u0297\1\232\1\u0297"+ - "\15\232\3\u02d9\3\232\1\u02d9\20\232\1\356\15\232\2\u02d9"+ - "\3\232\1\u02d9\1\232\1\u02d9\1\232\1\u02d9\2\232\1\u02d9"+ - "\1\232\4\u02d9\2\232\1\u02d9\1\232\1\u02d9\14\232\11\256"+ - "\2\125\1\126\13\256\1\125\4\256\1\u02da\54\256\11\u0299"+ - "\2\u02db\1\u02dc\13\u0299\1\u02db\61\u0299\11\256\2\125\1\126"+ - "\13\256\1\125\15\256\1\u02dd\43\256\2\u02de\1\u02df\2\u02de"+ - "\2\u02df\1\u02de\1\u029b\3\0\10\u02de\1\u02df\1\u02de\1\u029b"+ - "\1\0\7\u02de\25\u02df\4\u02de\1\u02df\1\u02de\3\u02df\6\u02de"+ - "\1\u02df\2\u02de\2\u02df\2\u02de\1\u02e0\1\u02df\1\u02e0\1\u02de"+ - "\2\u02df\1\u02e0\1\u029b\3\0\10\u02de\1\u02df\1\u02e0\1\u029c"+ - "\1\147\7\u02de\25\u02df\4\u02e0\1\u02df\1\u02de\3\u02df\6\u02de"+ - "\1\u02df\2\u02de\2\u02df\1\u02de\1\0\3\147\1\0\3\147"+ - "\1\u02e1\13\0\2\147\1\u02e1\1\147\7\0\32\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\11\0\1\u029e\3\0"+ - "\2\u029f\10\0\1\u029e\64\0\1\u026a\2\0\2\u026a\1\0"+ - "\1\u029f\13\0\1\u026a\1\0\1\u029f\10\0\25\u026a\4\0"+ - "\1\u026a\1\0\3\u026a\6\0\1\u026a\2\0\2\u026a\2\0"+ - "\3\u01fe\1\0\3\u01fe\1\u02a0\3\0\1\u0235\1\u01fe\1\u01fc"+ - "\1\0\1\u02a1\1\u0235\4\u01fe\1\u02a0\1\u01fe\7\0\32\u01fe"+ - "\1\0\3\u01fe\6\0\1\u01fe\2\0\2\u01fe\2\0\3\u02e2"+ - "\1\0\4\u02e2\3\0\2\u02e2\2\0\1\u02e2\1\u02e3\6\u02e2"+ - "\7\0\32\u02e2\1\0\3\u02e2\6\0\1\u02e2\2\0\2\u02e2"+ - "\11\0\1\u02a2\3\0\1\u0236\3\0\1\u02a3\5\0\1\u02a2"+ - "\63\0\3\u02e4\1\0\4\u02e4\3\0\2\u02e4\2\0\10\u02e4"+ - "\7\0\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0\2\u02e4"+ - "\1\0\11\u02a4\3\0\13\u02a4\1\0\62\u02a4\3\u02a5\1\u02a4"+ - "\3\u02a5\1\u02e5\3\0\2\u026e\6\u02a4\3\u02a5\1\u02e6\7\u02a4"+ - "\32\u02a5\1\u02a4\3\u02a5\6\u02a4\1\u02a5\2\u02a4\2\u02a5\2\u02a4"+ - "\3\u02a6\1\u02a4\3\u02a6\1\u02a4\3\0\10\u02a4\3\u02a6\1\147"+ - "\7\u02a4\32\u02a6\1\u02a4\3\u02a6\6\u02a4\1\u02a6\2\u02a4\2\u02a6"+ - "\1\u02a4\43\0\1\u02e7\120\0\1\u02e8\36\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\4\147\1\u02e9\25\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\14\147\1\u02ea\15\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\u02ab\1\0"+ - "\3\u02ab\1\u02eb\13\0\4\u02ab\7\0\32\u02ab\1\0\3\u02ab"+ - "\6\0\1\u02ab\2\0\2\u02ab\2\0\3\147\1\0\3\147"+ - "\1\u02ec\13\0\2\147\1\u02ed\1\147\6\0\1\151\32\147"+ - "\1\0\3\147\6\0\1\147\2\0\2\147\1\0\2\u02ee"+ - "\1\u02ef\2\u02ee\2\u02ef\1\u02ee\1\u02af\3\0\10\u02ee\1\u02ef"+ - "\1\u02ee\1\u02af\1\0\7\u02ee\25\u02ef\4\u02ee\1\u02ef\1\u02ee"+ - "\3\u02ef\6\u02ee\1\u02ef\2\u02ee\2\u02ef\2\u02ee\1\u02f0\1\u02ef"+ - "\1\u02f0\1\u02ee\2\u02ef\1\u02f0\1\u02af\3\0\10\u02ee\1\u02ef"+ - "\1\u02f0\1\u02b0\1\147\7\u02ee\25\u02ef\4\u02f0\1\u02ef\1\u02ee"+ - "\3\u02ef\6\u02ee\1\u02ef\2\u02ee\2\u02ef\1\u02ee\10\0\1\u02b1"+ - "\3\0\1\u02b2\11\0\1\u02b1\64\0\1\u0279\2\0\2\u0279"+ - "\1\0\1\u02b2\13\0\1\u0279\1\0\1\u02b2\10\0\25\u0279"+ - "\4\0\1\u0279\1\0\3\u0279\6\0\1\u0279\2\0\2\u0279"+ - "\11\0\1\u02b3\3\0\1\u02b4\1\0\1\u02b5\1\0\1\u02b6"+ - "\5\0\1\u02b3\64\0\1\u027a\2\0\2\u027a\1\0\1\u02b4"+ - "\13\0\1\u027a\1\0\1\u02b4\10\0\25\u027a\4\0\1\u027a"+ - "\1\0\3\u027a\6\0\1\u027a\2\0\2\u027a\11\0\1\u02b5"+ - "\6\0\1\u02f1\6\0\1\u02b5\63\0\3\u02f2\1\0\4\u02f2"+ - "\3\0\2\u02f2\2\0\10\u02f2\7\0\32\u02f2\1\0\3\u02f2"+ - "\6\0\1\u02f2\2\0\2\u02f2\2\0\3\u02b8\1\0\4\u02b8"+ - "\3\0\2\u02b8\2\0\1\u02b8\1\u02f3\6\u02b8\7\0\32\u02b8"+ - "\1\0\3\u02b8\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u027d"+ - "\1\0\3\u027d\1\u02ba\3\0\2\u027d\2\0\1\u027d\1\u02ba"+ - "\4\u027d\1\u02ba\1\u027d\7\0\32\u027d\1\0\3\u027d\6\0"+ - "\1\u027d\2\0\2\u027d\41\0\1\u02f4\20\0\1\u02f5\67\0"+ - "\1\u02f6\114\0\1\u02f7\103\0\1\u02f8\112\0\1\u02f9\107\0"+ - "\1\u02fa\107\0\1\u02fb\4\0\1\u02fc\103\0\1\u02fd\4\0"+ - "\1\u02fe\1\0\1\u02ff\50\0\1\u0300\32\0\1\u0301\17\0"+ - "\1\u0302\35\0\1\u0303\35\0\1\u0304\110\0\1\u0305\6\0"+ - "\1\u0306\100\0\1\u0307\7\0\1\u0308\103\0\1\u0309\4\0"+ - "\1\u030a\142\0\1\u030b\110\0\1\u030c\66\0\1\u030d\25\0"+ - "\3\u028b\1\u030e\1\u030f\1\u028b\1\u0310\1\u0311\1\u028b\2\357"+ - "\1\76\13\u028b\1\357\34\u028b\1\u030e\1\u028b\1\u0311\1\u030e"+ - "\21\u028b\3\357\1\u0289\3\357\1\u0289\3\357\1\76\15\357"+ - "\1\u012e\1\u012f\1\u0255\1\233\1\357\1\233\25\357\1\u0289"+ - "\1\357\2\u0289\25\357\1\u0312\1\357\1\u0313\4\357\1\76"+ - "\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357\1\233\53\357"+ - "\3\u0314\3\357\1\u0314\3\357\1\76\15\357\1\u012e\1\u012f"+ - "\1\u0255\1\233\1\357\1\233\7\357\2\u0314\3\357\1\u0314"+ - "\1\357\1\u0314\1\357\1\u0314\2\357\1\u0314\1\357\4\u0314"+ - "\2\357\1\u0314\1\357\1\u0314\17\357\1\u02cd\3\357\1\u02cd"+ - "\3\357\1\76\15\357\1\u012e\1\u012f\1\u0255\1\233\1\357"+ - "\1\233\25\357\1\u02cd\1\357\2\u02cd\21\357\4\u016f\1\u0170"+ - "\4\u016f\2\357\1\76\13\u016f\1\357\3\u016f\1\357\55\u016f"+ - "\1\u016d\3\u0315\3\u016d\1\u0315\1\u016d\2\u01a6\1\u01a7\13\u016d"+ - "\1\u01a6\1\u01a8\15\u016d\2\u0315\3\u016d\1\u0315\1\u016d\1\u0315"+ - "\1\u016d\1\u0315\2\u016d\1\u0315\1\u016d\4\u0315\2\u016d\1\u0315"+ - "\1\u016d\1\u0315\14\u016d\3\u0294\1\u0316\1\u0317\1\u0294\1\u0318"+ - "\1\u0319\1\u0294\3\0\13\u0294\1\0\34\u0294\1\u0316\1\u0294"+ - "\1\u0319\1\u0316\21\u0294\3\76\1\u0292\3\76\1\u0292\21\76"+ - "\1\227\1\230\1\u025b\1\0\1\76\1\0\25\76\1\u0292"+ - "\1\76\2\u0292\25\76\1\u031a\1\76\1\u031b\22\76\1\227"+ - "\1\230\1\u025b\1\0\1\76\1\0\53\76\3\u031c\3\76"+ - "\1\u031c\21\76\1\227\1\230\1\u025b\1\0\1\76\1\0"+ - "\7\76\2\u031c\3\76\1\u031c\1\76\1\u031c\1\76\1\u031c"+ - "\2\76\1\u031c\1\76\4\u031c\2\76\1\u031c\1\76\1\u031c"+ - "\17\76\1\u02d4\3\76\1\u02d4\21\76\1\227\1\230\1\u025b"+ - "\1\0\1\76\1\0\25\76\1\u02d4\1\76\2\u02d4\21\76"+ - "\4\235\1\236\4\235\3\0\13\235\1\0\3\235\1\76"+ - "\55\235\1\232\3\u031d\3\232\1\u031d\20\232\1\356\15\232"+ - "\2\u031d\3\232\1\u031d\1\232\1\u031d\1\232\1\u031d\2\232"+ - "\1\u031d\1\232\4\u031d\2\232\1\u031d\1\232\1\u031d\14\232"+ - "\11\u02da\2\u031e\1\u031f\13\u02da\1\u031e\61\u02da\11\256\2\125"+ - "\1\126\13\256\1\125\4\256\1\u0320\54\256\11\u02de\3\0"+ - "\13\u02de\1\0\62\u02de\3\u02df\1\u02de\3\u02df\1\u0321\3\0"+ - "\2\u029b\6\u02de\3\u02df\1\u0322\7\u02de\32\u02df\1\u02de\3\u02df"+ - "\6\u02de\1\u02df\2\u02de\2\u02df\2\u02de\3\u02e0\1\u02de\3\u02e0"+ - "\1\u02de\3\0\10\u02de\3\u02e0\1\147\7\u02de\32\u02e0\1\u02de"+ - "\3\u02e0\6\u02de\1\u02e0\2\u02de\2\u02e0\1\u02de\13\u02e1\1\0"+ - "\75\u02e1\1\0\3\u02e2\1\0\4\u02e2\3\0\2\u02e2\2\0"+ - "\1\u02e2\1\u0323\6\u02e2\7\0\32\u02e2\1\0\3\u02e2\6\0"+ - "\1\u02e2\2\0\2\u02e2\2\0\1\u02e2\1\u0324\1\u02e2\1\0"+ - "\2\u0324\1\u02e2\1\u02e3\3\0\2\u02e2\2\0\1\u02e2\1\u0323"+ - "\2\u02e2\1\u0324\1\u02e2\1\u02e3\1\u02e2\7\0\25\u0324\4\u02e2"+ - "\1\u0324\1\0\3\u0324\6\0\1\u0324\2\0\2\u0324\2\0"+ - "\3\u02e4\1\0\4\u02e4\3\0\2\u02e4\2\0\1\u02e4\1\u0325"+ - "\6\u02e4\7\0\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0"+ - "\2\u02e4\1\0\10\u02a4\1\u02e5\3\0\2\u026e\10\u02a4\1\u02e5"+ - "\1\0\61\u02a4\1\0\3\u02e6\1\0\3\u02e6\1\u0326\3\0"+ - "\2\u0327\6\0\4\u02e6\7\0\32\u02e6\1\0\3\u02e6\6\0"+ - "\1\u02e6\2\0\2\u02e6\7\0\1\u0328\153\0\1\u0329\40\0"+ - "\3\147\1\0\1\147\1\u032a\1\147\14\0\4\147\7\0"+ - "\32\147\1\0\3\147\6\0\1\147\2\0\2\147\2\0"+ - "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u032b"+ - "\17\147\1\0\3\147\6\0\1\147\2\0\2\147\11\0"+ - "\1\u02eb\15\0\1\u02eb\62\0\2\u032c\1\u032d\2\u032c\2\u032d"+ - "\1\u032c\1\u02ec\3\0\10\u032c\1\u032d\1\u032c\1\u02ec\1\0"+ - "\7\u032c\25\u032d\4\u032c\1\u032d\1\u032c\3\u032d\6\u032c\1\u032d"+ - "\2\u032c\2\u032d\2\u032c\1\u032e\1\u032d\1\u032e\1\u032c\2\u032d"+ - "\1\u032e\1\u02ec\3\0\10\u032c\1\u032d\1\u032e\1\u02ed\1\147"+ - "\7\u032c\25\u032d\4\u032e\1\u032d\1\u032c\3\u032d\6\u032c\1\u032d"+ - "\2\u032c\2\u032d\1\u032c\11\u02ee\3\0\13\u02ee\1\0\62\u02ee"+ - "\3\u02ef\1\u02ee\3\u02ef\1\u032f\3\0\1\u02af\7\u02ee\3\u02ef"+ - "\1\u0330\7\u02ee\32\u02ef\1\u02ee\3\u02ef\6\u02ee\1\u02ef\2\u02ee"+ - "\2\u02ef\2\u02ee\3\u02f0\1\u02ee\3\u02f0\1\u02ee\3\0\10\u02ee"+ - "\3\u02f0\1\147\7\u02ee\32\u02f0\1\u02ee\3\u02f0\6\u02ee\1\u02f0"+ - "\2\u02ee\2\u02f0\1\u02ee\10\0\1\u0331\5\0\1\u02b5\7\0"+ - "\1\u0331\63\0\3\u02f2\1\0\4\u02f2\3\0\2\u02f2\2\0"+ - "\1\u02f2\1\u0332\6\u02f2\7\0\32\u02f2\1\0\3\u02f2\6\0"+ - "\1\u02f2\2\0\2\u02f2\2\0\1\u02b8\1\u0333\1\u02b8\1\0"+ - "\2\u0333\1\u02b8\1\u02f3\3\0\2\u02b8\2\0\1\u02b8\1\u02f3"+ - "\2\u02b8\1\u0333\1\u02b8\1\u02f3\1\u02b8\7\0\25\u0333\4\u02b8"+ - "\1\u0333\1\0\3\u0333\6\0\1\u0333\2\0\2\u0333\54\0"+ - "\1\u0334\116\0\1\u0335\66\0\1\u0336\111\0\1\u0337\111\0"+ - "\1\u0338\111\0\1\u0339\123\0\1\u033a\4\0\1\u033b\66\0"+ - "\1\u033c\113\0\1\u033d\105\0\1\u033e\115\0\1\u033f\104\0"+ - "\1\u0340\112\0\1\u0341\120\0\1\u0342\110\0\1\u0343\100\0"+ - "\1\u0344\105\0\1\u0345\15\0\1\u0346\114\0\1\u0347\67\0"+ - "\1\u0348\106\0\1\u0349\114\0\1\u034a\122\0\1\u034b\107\0"+ - "\1\u034c\53\0\1\u034d\110\0\1\u034e\130\0\1\u034f\51\0"+ - "\3\u012f\1\u028b\1\u016e\2\u012f\1\u028b\1\u012f\2\357\1\76"+ - "\13\u012f\1\357\2\u012f\1\357\1\u0254\30\u012f\1\u028b\1\u012f"+ - "\2\u028b\25\u012f\1\u0350\1\u012f\1\u0351\2\u012f\2\357\1\76"+ - "\13\u012f\1\357\2\u012f\1\357\1\u0254\56\u012f\3\u0352\1\u016e"+ - "\2\u012f\1\u0352\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f"+ - "\1\357\1\u0254\12\u012f\2\u0352\3\u012f\1\u0352\1\u012f\1\u0352"+ - "\1\u012f\1\u0352\2\u012f\1\u0352\1\u012f\4\u0352\2\u012f\1\u0352"+ - "\1\u012f\1\u0352\17\u012f\1\u030e\1\u016e\2\u012f\1\u030e\1\u012f"+ - "\2\357\1\76\13\u012f\1\357\2\u012f\1\357\1\u0254\30\u012f"+ - "\1\u030e\1\u012f\2\u030e\21\u012f\4\357\1\u0312\1\357\1\u0313"+ - "\4\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233\1\357"+ - "\1\233\53\357\3\u0314\3\357\1\u0314\3\357\1\76\15\357"+ - "\1\u012e\1\u012f\1\u0130\1\233\1\357\1\233\7\357\2\u0314"+ - "\3\357\1\u0314\1\357\1\u0314\1\357\1\u0314\2\357\1\u0314"+ - "\1\357\4\u0314\2\357\1\u0314\1\357\1\u0314\15\357\3\u0353"+ - "\3\357\1\u0353\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130"+ - "\1\233\1\357\1\233\7\357\2\u0353\3\357\1\u0353\1\357"+ - "\1\u0353\1\357\1\u0353\2\357\1\u0353\1\357\4\u0353\2\357"+ - "\1\u0353\1\357\1\u0353\14\357\1\u016d\3\u021d\3\u016d\1\u021d"+ - "\1\u016d\2\u01a6\1\u01a7\13\u016d\1\u01a6\1\u01a8\15\u016d\2\u021d"+ - "\3\u016d\1\u021d\1\u016d\1\u021d\1\u016d\1\u021d\2\u016d\1\u021d"+ - "\1\u016d\4\u021d\2\u016d\1\u021d\1\u016d\1\u021d\14\u016d\3\230"+ - "\1\u0294\1\234\2\230\1\u0294\1\230\3\0\13\230\1\0"+ - "\2\230\1\76\1\u025a\30\230\1\u0294\1\230\2\u0294\25\230"+ - "\1\u0354\1\230\1\u0355\2\230\3\0\13\230\1\0\2\230"+ - "\1\76\1\u025a\56\230\3\u0356\1\234\2\230\1\u0356\1\230"+ - "\3\0\13\230\1\0\2\230\1\76\1\u025a\12\230\2\u0356"+ - "\3\230\1\u0356\1\230\1\u0356\1\230\1\u0356\2\230\1\u0356"+ - "\1\230\4\u0356\2\230\1\u0356\1\230\1\u0356\17\230\1\u0316"+ - "\1\234\2\230\1\u0316\1\230\3\0\13\230\1\0\2\230"+ - "\1\76\1\u025a\30\230\1\u0316\1\230\2\u0316\21\230\4\76"+ - "\1\u031a\1\76\1\u031b\22\76\1\227\1\230\1\231\1\0"+ - "\1\76\1\0\53\76\3\u031c\3\76\1\u031c\21\76\1\227"+ - "\1\230\1\231\1\0\1\76\1\0\7\76\2\u031c\3\76"+ - "\1\u031c\1\76\1\u031c\1\76\1\u031c\2\76\1\u031c\1\76"+ - "\4\u031c\2\76\1\u031c\1\76\1\u031c\15\76\3\u0357\3\76"+ - "\1\u0357\21\76\1\227\1\230\1\231\1\0\1\76\1\0"+ - "\7\76\2\u0357\3\76\1\u0357\1\76\1\u0357\1\76\1\u0357"+ - "\2\76\1\u0357\1\76\4\u0357\2\76\1\u0357\1\76\1\u0357"+ - "\14\76\1\232\3\u0224\3\232\1\u0224\20\232\1\356\15\232"+ - "\2\u0224\3\232\1\u0224\1\232\1\u0224\1\232\1\u0224\2\232"+ - "\1\u0224\1\232\4\u0224\2\232\1\u0224\1\232\1\u0224\14\232"+ - "\11\u0320\2\u0358\1\u0359\13\u0320\1\u0358\61\u0320\10\u02de\1\u0321"+ - "\3\0\2\u029b\10\u02de\1\u0321\1\0\61\u02de\1\0\3\u0322"+ - "\1\0\3\u0322\1\u035a\3\0\2\u035b\6\0\4\u0322\7\0"+ - "\32\u0322\1\0\3\u0322\6\0\1\u0322\2\0\2\u0322\2\0"+ - "\1\u02e2\1\u0324\1\u02e2\1\0\2\u0324\1\u02e2\1\u0323\3\0"+ - "\2\u02e2\1\u01fc\1\0\1\u02e2\1\u0323\2\u02e2\1\u0324\1\u02e2"+ - "\1\u0323\1\u02e2\7\0\25\u0324\4\u02e2\1\u0324\1\0\3\u0324"+ - "\6\0\1\u0324\2\0\2\u0324\2\0\3\u0324\1\0\3\u0324"+ - "\1\u035c\3\0\1\u02e3\1\u02e2\1\u01fc\1\0\1\u02e2\1\u0323"+ - "\2\u02e2\4\u0324\7\0\32\u0324\1\0\3\u0324\6\0\1\u0324"+ - "\2\0\2\u0324\2\0\3\u02e4\1\0\3\u02e4\1\u0325\3\0"+ - "\2\u02e4\2\0\1\u02e4\1\u0325\4\u02e4\1\u0325\1\u02e4\7\0"+ - "\32\u02e4\1\0\3\u02e4\6\0\1\u02e4\2\0\2\u02e4\11\0"+ - "\1\u0326\3\0\2\u0327\10\0\1\u0326\64\0\1\u02e6\2\0"+ - "\2\u02e6\1\0\1\u0327\13\0\1\u02e6\1\0\1\u0327\10\0"+ - "\25\u02e6\4\0\1\u02e6\1\0\3\u02e6\6\0\1\u02e6\2\0"+ - "\2\u02e6\47\0\1\u035d\116\0\1\u035e\35\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\7\147\1\u035f\22\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\2\0\3\147\1\0"+ - "\3\147\14\0\4\147\7\0\15\147\1\u0360\14\147\1\0"+ - "\3\147\6\0\1\147\2\0\2\147\1\0\11\u032c\3\0"+ - "\13\u032c\1\0\62\u032c\3\u032d\1\u032c\3\u032d\1\u0361\3\0"+ - "\2\u02ec\6\u032c\3\u032d\1\u0362\7\u032c\32\u032d\1\u032c\3\u032d"+ - "\6\u032c\1\u032d\2\u032c\2\u032d\2\u032c\3\u032e\1\u032c\3\u032e"+ - "\1\u032c\3\0\10\u032c\3\u032e\1\147\7\u032c\32\u032e\1\u032c"+ - "\3\u032e\6\u032c\1\u032e\2\u032c\2\u032e\1\u032c\10\u02ee\1\u032f"+ - "\3\0\1\u02af\11\u02ee\1\u032f\1\0\61\u02ee\1\0\3\u0330"+ - "\1\0\3\u0330\1\u0363\3\0\1\u0364\7\0\4\u0330\7\0"+ - "\32\u0330\1\0\3\u0330\6\0\1\u0330\2\0\2\u0330\2\0"+ - "\3\u02f2\1\0\3\u02f2\1\u0365\3\0\2\u02f2\1\u02b5\1\0"+ - "\1\u02f2\1\u0332\4\u02f2\1\u0365\1\u02f2\7\0\32\u02f2\1\0"+ - "\3\u02f2\6\0\1\u02f2\2\0\2\u02f2\2\0\3\u0333\1\0"+ - "\3\u0333\1\u0366\3\0\1\u02f3\1\u02b8\1\u02b5\1\0\1\u0367"+ - "\1\u02f3\2\u02b8\2\u0333\1\u0368\1\u0333\7\0\32\u0333\1\0"+ - "\3\u0333\6\0\1\u0333\2\0\2\u0333\55\0\1\u0369\102\0"+ - "\1\u036a\103\0\1\u036b\155\0\1\u036c\53\0\1\u036d\105\0"+ - "\1\u036e\113\0\1\u036f\145\0\1\u0370\55\0\1\u0371\113\0"+ - "\1\u0372\100\0\1\u0373\110\0\1\u0374\103\0\1\u0375\112\0"+ - "\1\u0376\110\0\1\u0377\122\0\1\u0378\76\0\1\u0379\105\0"+ - "\1\u037a\1\u037b\126\0\1\u037c\70\0\1\u037d\113\0\1\u037e"+ - "\120\0\1\u037f\111\0\1\u0380\74\0\1\u0381\113\0\1\u0382"+ - "\107\0\1\u0383\47\0\4\u012f\1\u0384\1\u012f\1\u0351\2\u012f"+ - "\2\357\1\76\13\u012f\1\357\62\u012f\3\u0352\1\u016e\2\u012f"+ - "\1\u0352\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ - "\13\u012f\2\u0352\3\u012f\1\u0352\1\u012f\1\u0352\1\u012f\1\u0352"+ - "\2\u012f\1\u0352\1\u012f\4\u0352\2\u012f\1\u0352\1\u012f\1\u0352"+ - "\15\u012f\3\u0385\1\u016e\2\u012f\1\u0385\1\u012f\2\357\1\76"+ - "\13\u012f\1\357\2\u012f\1\357\13\u012f\2\u0385\3\u012f\1\u0385"+ - "\1\u012f\1\u0385\1\u012f\1\u0385\2\u012f\1\u0385\1\u012f\4\u0385"+ - "\2\u012f\1\u0385\1\u012f\1\u0385\14\u012f\1\357\3\u0386\3\357"+ - "\1\u0386\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ - "\1\357\1\233\7\357\2\u0386\3\357\1\u0386\1\357\1\u0386"+ - "\1\357\1\u0386\2\357\1\u0386\1\357\4\u0386\2\357\1\u0386"+ - "\1\357\1\u0386\14\357\4\230\1\u0387\1\230\1\u0355\2\230"+ - "\3\0\13\230\1\0\62\230\3\u0356\1\234\2\230\1\u0356"+ - "\1\230\3\0\13\230\1\0\2\230\1\76\13\230\2\u0356"+ - "\3\230\1\u0356\1\230\1\u0356\1\230\1\u0356\2\230\1\u0356"+ - "\1\230\4\u0356\2\230\1\u0356\1\230\1\u0356\15\230\3\u0388"+ - "\1\234\2\230\1\u0388\1\230\3\0\13\230\1\0\2\230"+ - "\1\76\13\230\2\u0388\3\230\1\u0388\1\230\1\u0388\1\230"+ - "\1\u0388\2\230\1\u0388\1\230\4\u0388\2\230\1\u0388\1\230"+ - "\1\u0388\14\230\1\76\3\u0389\3\76\1\u0389\21\76\1\227"+ - "\1\230\1\231\1\0\1\76\1\0\7\76\2\u0389\3\76"+ - "\1\u0389\1\76\1\u0389\1\76\1\u0389\2\76\1\u0389\1\76"+ - "\4\u0389\2\76\1\u0389\1\76\1\u0389\14\76\10\0\1\u035a"+ - "\3\0\2\u035b\10\0\1\u035a\64\0\1\u0322\2\0\2\u0322"+ - "\1\0\1\u035b\13\0\1\u0322\1\0\1\u035b\10\0\25\u0322"+ - "\4\0\1\u0322\1\0\3\u0322\6\0\1\u0322\2\0\2\u0322"+ - "\2\0\3\u02e2\1\0\3\u02e2\1\u035c\3\0\1\u02e3\1\u02e2"+ - "\1\u01fc\1\0\1\u02e2\1\u0323\4\u02e2\1\u035c\1\u02e2\7\0"+ - "\32\u02e2\1\0\3\u02e2\6\0\1\u02e2\2\0\2\u02e2\47\0"+ - "\1\u038a\43\0\3\147\1\0\3\147\14\0\4\147\7\0"+ - "\7\147\1\u038b\22\147\1\0\3\147\6\0\1\147\2\0"+ - "\2\147\1\0\10\u032c\1\u0361\3\0\2\u02ec\10\u032c\1\u0361"+ - "\1\0\61\u032c\1\0\3\u0362\1\0\3\u0362\1\u038c\3\0"+ - "\2\u038d\6\0\4\u0362\7\0\32\u0362\1\0\3\u0362\6\0"+ - "\1\u0362\2\0\2\u0362\11\0\1\u0363\3\0\1\u0364\11\0"+ - "\1\u0363\64\0\1\u0330\2\0\2\u0330\1\0\1\u0364\13\0"+ - "\1\u0330\1\0\1\u0364\10\0\25\u0330\4\0\1\u0330\1\0"+ - "\3\u0330\6\0\1\u0330\2\0\2\u0330\2\0\3\u02b8\1\0"+ - "\3\u02b8\1\u0366\3\0\1\u02f3\1\u02b8\1\u02b5\1\0\1\u0367"+ - "\1\u02f3\4\u02b8\1\u0366\1\u02b8\7\0\32\u02b8\1\0\3\u02b8"+ - "\6\0\1\u02b8\2\0\2\u02b8\2\0\3\u038e\1\0\4\u038e"+ - "\3\0\2\u038e\2\0\1\u038e\1\u038f\6\u038e\7\0\32\u038e"+ - "\1\0\3\u038e\6\0\1\u038e\2\0\2\u038e\55\0\1\u0390"+ - "\77\0\1\u0391\104\0\1\u0392\125\0\1\u0393\102\0\1\u0394"+ - "\105\0\1\u0395\111\0\1\u0396\125\0\1\u0397\100\0\1\u0398"+ - "\112\0\1\u0399\143\0\1\u039a\45\0\1\u039b\113\0\1\u039c"+ - "\106\0\1\u039d\105\0\1\u039e\115\0\1\u039f\110\0\1\u03a0"+ - "\110\0\1\u03a1\105\0\1\u03a2\104\0\1\u03a3\120\0\1\u03a4"+ - "\147\0\1\u03a5\55\0\1\u03a6\120\0\1\u03a7\103\0\1\u03a8"+ - "\140\0\1\u03a9\107\0\1\u03aa\3\0\4\u012f\1\u0350\1\u012f"+ - "\1\u0351\2\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ - "\57\u012f\3\u03ab\1\u016e\2\u012f\1\u03ab\1\u012f\2\357\1\76"+ - "\13\u012f\1\357\2\u012f\1\357\13\u012f\2\u03ab\3\u012f\1\u03ab"+ - "\1\u012f\1\u03ab\1\u012f\1\u03ab\2\u012f\1\u03ab\1\u012f\4\u03ab"+ - "\2\u012f\1\u03ab\1\u012f\1\u03ab\14\u012f\1\357\3\u0289\3\357"+ - "\1\u0289\3\357\1\76\15\357\1\u012e\1\u012f\1\u0130\1\233"+ - "\1\357\1\233\7\357\2\u0289\3\357\1\u0289\1\357\1\u0289"+ - "\1\357\1\u0289\2\357\1\u0289\1\357\4\u0289\2\357\1\u0289"+ - "\1\357\1\u0289\14\357\4\230\1\u0354\1\230\1\u0355\2\230"+ - "\3\0\13\230\1\0\2\230\1\76\57\230\3\u03ac\1\234"+ - "\2\230\1\u03ac\1\230\3\0\13\230\1\0\2\230\1\76"+ - "\13\230\2\u03ac\3\230\1\u03ac\1\230\1\u03ac\1\230\1\u03ac"+ - "\2\230\1\u03ac\1\230\4\u03ac\2\230\1\u03ac\1\230\1\u03ac"+ - "\14\230\1\76\3\u0292\3\76\1\u0292\21\76\1\227\1\230"+ - "\1\231\1\0\1\76\1\0\7\76\2\u0292\3\76\1\u0292"+ - "\1\76\1\u0292\1\76\1\u0292\2\76\1\u0292\1\76\4\u0292"+ - "\2\76\1\u0292\1\76\1\u0292\14\76\10\0\1\u038c\3\0"+ - "\2\u038d\10\0\1\u038c\64\0\1\u0362\2\0\2\u0362\1\0"+ - "\1\u038d\13\0\1\u0362\1\0\1\u038d\10\0\25\u0362\4\0"+ - "\1\u0362\1\0\3\u0362\6\0\1\u0362\2\0\2\u0362\2\0"+ - "\3\u038e\1\0\4\u038e\3\0\2\u038e\2\0\1\u038e\1\u03ad"+ - "\6\u038e\7\0\32\u038e\1\0\3\u038e\6\0\1\u038e\2\0"+ - "\2\u038e\2\0\1\u038e\1\u03ae\1\u038e\1\0\2\u03ae\1\u038e"+ - "\1\u038f\3\0\2\u038e\2\0\1\u038e\1\u03ad\2\u038e\1\u03ae"+ - "\1\u038e\1\u038f\1\u038e\7\0\25\u03ae\4\u038e\1\u03ae\1\0"+ - "\3\u03ae\6\0\1\u03ae\2\0\2\u03ae\40\0\1\u03af\126\0"+ - "\1\u03b0\106\0\1\u03b1\116\0\1\u03b2\104\0\1\u03b3\141\0"+ - "\1\u03b4\56\0\1\u03b5\42\0\1\u03b6\210\0\1\u03b7\43\0"+ - "\1\u03b8\123\0\1\u03b9\111\0\1\u03ba\76\0\1\u03bb\130\0"+ - "\1\u03bc\133\0\1\u03bd\110\0\1\u03be\42\0\1\u03bf\125\0"+ - "\1\u03c0\77\0\1\u03c1\104\0\1\u03c2\107\0\1\u03c3\125\0"+ - "\1\u03c4\75\0\1\u03c5\112\0\1\u03c6\120\0\1\u03c7\116\0"+ - "\1\u03c8\46\0\1\u03c9\71\0\1\u012f\3\u028b\1\u016e\2\u012f"+ - "\1\u028b\1\u012f\2\357\1\76\13\u012f\1\357\2\u012f\1\357"+ - "\13\u012f\2\u028b\3\u012f\1\u028b\1\u012f\1\u028b\1\u012f\1\u028b"+ - "\2\u012f\1\u028b\1\u012f\4\u028b\2\u012f\1\u028b\1\u012f\1\u028b"+ - "\14\u012f\1\230\3\u0294\1\234\2\230\1\u0294\1\230\3\0"+ - "\13\230\1\0\2\230\1\76\13\230\2\u0294\3\230\1\u0294"+ - "\1\230\1\u0294\1\230\1\u0294\2\230\1\u0294\1\230\4\u0294"+ - "\2\230\1\u0294\1\230\1\u0294\14\230\1\0\1\u038e\1\u03ae"+ - "\1\u038e\1\0\2\u03ae\1\u038e\1\u03ca\3\0\2\u038e\1\u02b5"+ - "\1\0\1\u038e\1\u03ad\2\u038e\1\u03ae\1\u038e\1\u03ca\1\u038e"+ - "\7\0\25\u03ae\4\u038e\1\u03ae\1\0\3\u03ae\6\0\1\u03ae"+ - "\2\0\2\u03ae\2\0\3\u03ae\1\0\3\u03ae\1\u03cb\3\0"+ - "\1\u038f\1\u038e\1\u02b5\1\0\1\u038e\1\u03ad\2\u038e\2\u03ae"+ - "\1\u03cc\1\u03ae\7\0\32\u03ae\1\0\3\u03ae\6\0\1\u03ae"+ - "\2\0\2\u03ae\64\0\1\u03cd\100\0\1\u03ce\106\0\1\u03cf"+ - "\112\0\1\u03d0\110\0\1\u03d1\75\0\1\u03d2\10\0\1\u03d3"+ - "\2\0\1\u03d4\4\0\1\u03d5\66\0\1\u03d6\111\0\1\u03d7"+ - "\157\0\1\u03d8\106\0\1\u03d9\51\0\1\u03da\115\0\1\u03db"+ - "\143\0\1\u03dc\55\0\1\u03dd\116\0\1\u03de\103\0\1\u03df"+ - "\111\0\1\u03e0\74\0\1\u03e1\120\0\1\u03e2\76\0\1\u03e3"+ - "\117\0\1\u03e4\112\0\1\u03e5\106\0\1\u03e6\115\0\1\u03e7"+ - "\106\0\1\u03e8\45\0\1\u03e9\103\0\3\u038e\1\0\3\u038e"+ - "\1\u03cb\3\0\1\u038f\1\u038e\1\u02b5\1\0\1\u038e\1\u03ad"+ - "\4\u038e\1\u03cb\1\u038e\7\0\32\u038e\1\0\3\u038e\6\0"+ - "\1\u038e\2\0\2\u038e\41\0\1\u03ea\124\0\1\u03eb\142\0"+ - "\1\u03ec\57\0\1\u03ed\107\0\1\u03ee\42\0\1\u03ef\150\0"+ - "\1\u03f0\112\0\1\u03f1\46\0\1\u03f2\142\0\1\u03f3\125\0"+ - "\1\u03f4\41\0\1\u03f5\121\0\1\u03f6\152\0\1\u03f7\103\0"+ - "\1\u03f8\74\0\1\u03f9\111\0\1\u03fa\55\0\1\u03fb\150\0"+ - "\1\u03fc\112\0\1\u03fd\104\0\1\u03fe\151\0\1\u03ff\43\0"+ - "\1\u0400\113\0\1\u0401\123\0\1\u0402\140\0\1\u0403\63\0"+ - "\1\u0404\135\0\1\u0405\42\0\1\u0406\116\0\1\u0407\110\0"+ - "\1\u0408\151\0\1\u0409\40\0\1\u040a\117\0\1\u040b\120\0"+ - "\1\u040c\73\0\1\u040d\125\0\1\u040e\72\0\1\u040f\133\0"+ - "\1\u0410\66\0\1\u0411\113\0\1\u0412\117\0\1\u0413\103\0"+ - "\1\u0414\50\0\1\u0415\150\0\1\u0416\102\0\1\u0417\131\0"+ - "\1\u0418\135\0\1\u0419\45\0\1\u041a\64\0\1\u041b\154\0"+ - "\1\u041c\133\0\1\u041d\61\0\1\u041e\37\0\1\u041f\144\0"+ - "\1\u0420\130\0\1\u0421\103\0\1\u0422\115\0\1\u0423\134\0"+ - "\1\u0424\10\0\1\u0425\142\0\1\u0426\156\0\1\u0427\61\0"+ - "\1\u0428\72\0\1\u0429\126\0\1\u042a\106\0\1\u042b\141\0"+ - "\1\u042c\10\0\1\u042d\143\0\1\u042e\112\0\1\u042f\153\0"+ - "\1\u0430\60\0\1\u0431\137\0\1\u0432\60\0\1\u0433\106\0"+ - "\1\u0434\111\0\1\u0435\142\0\1\u0436\110\0\1\u0437\53\0"+ - "\1\u0438\2\0\1\u0439\100\0\1\u043a\120\0\1\u043b\142\0"+ - "\1\u043c\41\0\1\u043d\112\0\1\u043e\154\0\1\u043f\54\0"+ - "\1\u0440\103\0\1\u0441\127\0\1\u0442\76\0\1\u0443\105\0"+ - "\1\u0444\110\0\1\u0445\106\0\1\u0446\105\0\1\u0447\125\0"+ - "\1\u0448\105\0\1\u0449\103\0\1\u044a\115\0\1\u044b\106\0"+ - "\1\u044c\116\0\1\u044d\50\0\1\u044e\132\0\1\u044f\112\0"+ - "\1\u0450\115\0\1\u0451\121\0\1\u0452\103\0\1\u0453\102\0"+ - "\1\u0454\112\0\1\u0455\111\0\1\u0456\105\0\1\u0457\116\0"+ - "\1\u0458\117\0\1\u0459\33\0\1\u045a\121\0\1\u045b\137\0"+ - "\1\u045c\103\0\1\u045d\155\0\1\u045e\50\0\1\u045f\105\0"+ - "\1\u0460\110\0\1\u0461\116\0\1\u0462\45\0\1\u0463\155\0"+ - "\1\u0464\76\0\1\u0465\155\0\1\u0466\43\0\1\u0467\115\0"+ - "\1\u0468\110\0\1\u0469\50\0\1\u046a\155\0\1\u046b\113\0"+ - "\1\u046c\40\0\1\u046d\163\0\1\u046e\70\0\1\u046f\125\0"+ - "\1\u0470\137\0\1\u0471\110\0\1\u0472\51\0\1\u0473\101\0"+ - "\1\u0474\124\0\1\u0475\76\0\1\u0476\115\0\1\u0477\120\0"+ - "\1\u0478\73\0\1\u0479\154\0\1\u047a\110\0\1\u047b\110\0"+ - "\1\u047c\56\0\1\u047d\100\0\1\u047e\104\0\1\u047f\132\0"+ - "\1\u0480\73\0\1\u0481\105\0\1\u0482\112\0\1\u0483\120\0"+ - "\1\u0484\76\0\1\u0485\126\0\1\u0486\71\0\1\u0487\123\0"+ - "\1\u0488\76\0\1\u0489\126\0\1\u048a\50\0\1\u048b\110\0"+ - "\1\u048c\152\0\1\u048d\70\0\1\u048e\110\0\1\u048f\110\0"+ - "\1\u0490\155\0\1\u0491\55\0\1\u0492\76\0\1\u0493\66\0"+ - "\1\u0494\110\0\1\u0495\110\0\1\u0496\132\0\1\u0497\137\0"+ - "\1\u0498\64\0\1\u0499\52\0\1\u049a\145\0\1\u049b\106\0"+ - "\1\u049c\154\0\1\u049d\44\0\1\u049e\113\0\1\u049f\110\0"+ - "\1\u04a0\121\0\1\u04a1\110\0\1\u04a2\101\0\1\u04a3\106\0"+ - "\1\u04a4\117\0\1\u04a5\143\0\1\u04a6\41\0\1\u04a7\117\0"+ - "\1\u04a8\123\0\1\u04a9\72\0\1\u04aa\113\0\1\u04ab\101\0"+ - "\1\u04ac\156\0\1\u04ad\43\0\1\u04ae\110\0\1\u04af\155\0"+ - "\1\u04b0\51\0\1\u04b1\61\0\1\u04b2\130\0\1\u04b3\114\0"+ - "\1\u04b4\116\0\1\u04b5\100\0\1\u04b6\106\0\1\u04b7\114\0"+ - "\1\u04b8\116\0\1\u04b9\102\0\1\u04ba\105\0\1\u04bb\114\0"+ - "\1\u04bc\107\0\1\u04bd\53\0\1\u04be\172\0\1\u04bf\63\0"+ - "\1\u04c0\111\0\1\u04c1\63\0\1\u04c2\176\0\1\u04c3\60\0"+ - "\1\u04c4\52\0\1\u04c5\134\0\1\u04c6\111\0\1\u04c7\151\0"+ - "\1\u04c8\110\0\1\u04c9\11\0\1\u04ca\142\0\1\u04cb\155\0"+ - "\1\u04cc\110\0\1\u04cd\56\0\1\u04ce\43\0\1\u04cf\142\0"+ - "\1\u04d0\155\0\1\u04d1\43\0\1\u04d2\155\0\1\u04d3\110\0"+ - "\1\u04d4\43\0\1\u04d5\67\0\1\u04d6\132\0\1\u04d7\154\0"+ - "\1\u04d8\43\0\1\u04d9\67\0\1\u04da\110\0\1\u04db\144\0"+ - "\1\u04dc\120\0\1\u04dd\44\0\1\u04de\110\0\1\u04df\132\0"+ - "\1\u04e0\125\0\1\u04e1\137\0\1\u04e2\22\0\1\u04e3\146\0"+ - "\1\u04e4\52\0\1\u04e5\110\0\1\u04e6\176\0\1\u04e7\11\0"+ - "\1\u04e8\121\0\1\u04e9\176\0\1\u04ea\44\0\1\u04eb\155\0"+ - "\1\u04ec\46\0\1\u04ed\123\0\1\u04ee\50\0\1\u04ef\132\0"+ - "\1\u04f0\66\0\1\u04f1\144\0\1\u04f2\54\0\1\u04f3\130\0"+ - "\1\u04f4\127\0\1\u04f5\75\0\1\u04f6\113\0\1\u04f7\50\0"+ - "\1\u04f8\143\0\1\u04f9\113\0\1\u04fa\117\0\1\u04fb\142\0"+ - "\1\u04fc\46\0\1\u04fd\120\0\1\u04fe\74\0\1\u04ff\111\0"+ - "\1\u0500\113\0\1\u0501\64\0\1\u0502\176\0\1\u0503\44\0"+ - "\1\u0504\113\0\1\u0505\151\0\1\u0506\73\0\1\u0507\37\0"+ - "\1\u0508\130\0\1\u0509\111\0\1\u050a\67\0\1\u050b\176\0"+ - "\1\u050c\47\0\1\u050d\151\0\1\u050e\22\0\1\u050f\131\0"+ - "\1\u0510\67\0\1\u0511\176\0\1\u0512\22\0\1\u0513\71\0"; - - private static int [] zzUnpackTrans() { - int [] result = new int[82490]; - int offset = 0; - offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackTrans(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - value--; - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** - * ZZ_ATTRIBUTE[aState] contains the attributes of state aState - */ - private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); - - private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\2\1\15\0\2\1\1\11\4\1\1\11\2\1\1\11"+ - "\15\1\2\11\4\1\1\11\2\1\2\11\1\1\1\11"+ - "\2\1\7\11\4\1\2\11\1\1\1\11\3\1\1\11"+ - "\1\1\1\11\3\1\2\11\1\1\1\11\3\1\1\11"+ - "\1\1\1\11\1\1\1\11\1\1\1\11\2\1\3\0"+ - "\2\11\1\0\1\11\1\0\2\1\1\0\15\1\3\0"+ - "\1\11\3\1\2\0\1\11\1\1\1\11\4\1\5\11"+ - "\1\0\1\1\2\0\1\11\1\1\3\0\1\11\1\1"+ - "\10\0\1\11\4\1\6\11\3\0\1\11\5\0\1\1"+ - "\1\0\1\1\1\11\1\1\1\11\2\1\1\11\35\1"+ - "\3\0\6\1\1\0\1\11\1\0\1\1\6\0\2\11"+ - "\1\0\1\1\4\0\1\11\1\0\1\1\1\11\1\1"+ - "\1\11\3\0\42\1\3\0\2\1\1\0\1\11\1\1"+ - "\15\0\1\11\1\1\3\0\46\1\2\11\1\0\2\1"+ - "\1\0\1\1\14\0\1\1\5\0\11\1\1\0\31\1"+ - "\1\11\2\1\10\0\2\1\10\0\1\1\1\11\3\0"+ - "\12\1\1\0\17\1\1\0\7\1\7\0\2\1\3\0"+ - "\1\1\6\0\1\1\1\11\4\0\13\1\4\0\22\1"+ - "\1\11\7\0\1\1\6\0\1\1\13\0\10\1\3\0"+ - "\15\1\1\0\2\1\1\0\5\1\5\0\2\11\2\1"+ - "\4\0\2\1\7\0\1\1\1\11\1\0\12\1\1\0"+ - "\1\1\1\0\7\1\2\0\1\1\1\0\2\1\3\0"+ - "\1\11\2\0\1\1\2\0\2\1\4\0\1\1\2\0"+ - "\2\1\7\0\4\1\1\0\1\1\1\0\1\1\1\0"+ - "\3\1\2\0\11\1\1\0\1\1\3\0\1\1\1\0"+ - "\2\1\20\0\1\11\1\0\4\1\3\0\4\1\3\0"+ - "\1\1\1\11\1\0\4\1\3\0\2\1\2\0\10\1"+ - "\41\0\3\1\5\0\3\1\1\0\1\1\1\11\1\0"+ - "\6\1\3\0\10\1\33\0\2\11\4\0\1\1\3\0"+ - "\2\1\1\11\1\1\1\0\1\1\1\11\1\0\5\1"+ - "\1\0\2\1\1\0\1\1\35\0\1\1\2\0\1\1"+ - "\1\11\2\1\74\0\1\11\3\1\51\0\1\11\44\0"+ - "\1\11\62\0\1\11\14\0\1\11\57\0\2\11\7\0"+ - "\3\11\33\0\1\11\17\0\1\11\2\0\1\11\20\0"+ - "\1\11\3\0\2\11\2\0\2\11\3\0\1\11\1\0"+ - "\2\11\2\0\1\11\5\0\1\11\1\0\1\11\1\0"+ - "\1\11\16\0\1\11\5\0\1\11\2\0\1\11\3\0"+ - "\1\11\1\0\1\11\1\0\1\11"; - - private static int [] zzUnpackAttribute() { - int [] result = new int[1299]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAttribute(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /** denotes if the user-EOF-code has already been executed */ - private boolean zzEOFDone; - - /** the stack of open (nested) input streams to read from */ - private java.util.Stack zzStreams = new java.util.Stack(); - - /** - * inner class used to store info for nested - * input streams - */ - private static final class ZzFlexStreamInfo { - java.io.Reader zzReader; - int zzEndRead; - int zzStartRead; - int zzCurrentPos; - int zzMarkedPos; - int yyline; - int yycolumn; - char [] zzBuffer; - boolean zzAtEOF; - boolean zzEOFDone; - - /** sets all values stored in this class */ - ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead, - int zzCurrentPos, int zzMarkedPos, - char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) { - this.zzReader = zzReader; - this.zzEndRead = zzEndRead; - this.zzStartRead = zzStartRead; - this.zzCurrentPos = zzCurrentPos; - this.zzMarkedPos = zzMarkedPos; - this.zzBuffer = zzBuffer; - this.zzAtEOF = zzAtEOF; - this.zzEOFDone = zzEOFDone; - this.yyline = yyline; - this.yycolumn = yycolumn; - } - } - - /* user code: */ - int balance = 0; - int commentbalance = 0; - int action_line = 0; - int bufferSize = 16384; - - File file; - Stack files = new Stack(); - - StringBuffer userCode = new StringBuffer(); - - String classCode; - String initCode; - String initThrow; - String eofCode; - String eofThrow; - String lexThrow; - String eofVal; - String scanErrorException; - String cupSymbol = "sym"; - - StringBuffer actionText = new StringBuffer(); - StringBuffer string = new StringBuffer(); - - boolean charCount; - boolean lineCount; - boolean columnCount; - boolean cupCompatible; - boolean cupDebug; - boolean isInteger; - boolean isIntWrap; - boolean isYYEOF; - boolean notUnix; - boolean isPublic; - boolean isFinal; - boolean isAbstract; - boolean bolUsed; - boolean standalone; - boolean debugOption; - boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE; - boolean packed = Options.gen_method == Options.PACK; - boolean caseless; - boolean inclusive_states; - boolean eofclose; - boolean emitInputStreamCtor = Options.emitInputStreamCtor; - - String isImplementing; - String isExtending; - String className = "Yylex"; - String functionName; - String tokenType; - String visibility = "public"; - - Vector /* String */ ctorArgs = new Vector(); - Vector /* String */ ctorTypes = new Vector(); - - LexicalStates states = new LexicalStates(); - - Vector actions = new Vector(); - - private int nextState; - - boolean macroDefinition; - - Timer t = new Timer(); - - public int currentLine() { - return yyline; - } - - public void setFile(File file) { - this.file = file; - } - - private Symbol symbol(int type, Object value) { - return new Symbol(type, yyline, yycolumn, value); - } - - private Symbol symbol(int type) { - return new Symbol(type, yyline, yycolumn); - } - - // updates line and column count to the beginning of the first - // non whitespace character in yytext, but leaves yyline+yycolumn - // untouched - private Symbol symbol_countUpdate(int type, Object value) { - int lc = yyline; - int cc = yycolumn; - String text = yytext(); - - for (int i=0; i < text.length(); i++) { - char c = text.charAt(i); - - if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) - return new Symbol(type, lc, cc, value); - - if (c == '\n') { - lc++; - cc = 0; - } - else - cc++; - } - - return new Symbol(type, yyline, yycolumn, value); - } - - private String makeMacroIdent() { - String matched = yytext().trim(); - return matched.substring(1, matched.length()-1).trim(); - } - - public static String conc(Object a, Object b) { - if (a == null && b == null) return null; - if (a == null) return b.toString(); - if (b == null) return a.toString(); - - return a.toString()+b.toString(); - } - - public static String concExc(Object a, Object b) { - if (a == null && b == null) return null; - if (a == null) return b.toString(); - if (b == null) return a.toString(); - - return a.toString()+", "+b.toString(); - } - - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ - public LexScan(java.io.Reader in) { - states.insert("YYINITIAL", true); - this.zzReader = in; - } - - /** - * Creates a new scanner. - * There is also java.io.Reader version of this constructor. - * - * @param in the java.io.Inputstream to read input from. - */ - public LexScan(java.io.InputStream in) { - this(new java.io.InputStreamReader(in)); - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char [] zzUnpackCMap(String packed) { - char [] map = new char[0x10000]; - int i = 0; /* index in packed string */ - int j = 0; /* index in unpacked array */ - while (i < 1788) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do map[j++] = value; while (--count > 0); - } - return map; - } - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead > 0) { - zzEndRead+= numRead; - return false; - } - // unlikely but not impossible: read 0 characters, but not at end of stream - if (numRead == 0) { - int c = zzReader.read(); - if (c == -1) { - return true; - } else { - zzBuffer[zzEndRead++] = (char) c; - return false; - } - } - - // numRead < 0) - return true; - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Stores the current input stream on a stack, and - * reads from a new stream. Lexical state, line, - * char, and column counting remain untouched. - * - * The current input stream can be restored with - * yypopstream (usually in an <> action). - * - * @param reader the new input stream to read from - * - * @see #yypopStream() - */ - public final void yypushStream(java.io.Reader reader) { - zzStreams.push( - new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos, - zzMarkedPos, zzBuffer, zzAtEOF, - yyline, yycolumn) - ); - zzAtEOF = false; - zzBuffer = new char[ZZ_BUFFERSIZE]; - zzReader = reader; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yycolumn = 0; - } - - - /** - * Closes the current input stream and continues to - * read from the one on top of the stream stack. - * - * @throws java.util.EmptyStackException - * if there is no further stream to read from. - * - * @throws java.io.IOException - * if there was an error in closing the stream. - * - * @see #yypushStream(java.io.Reader) - */ - public final void yypopStream() throws java.io.IOException { - zzReader.close(); - ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop(); - zzBuffer = s.zzBuffer; - zzReader = s.zzReader; - zzEndRead = s.zzEndRead; - zzStartRead = s.zzStartRead; - zzCurrentPos = s.zzCurrentPos; - zzMarkedPos = s.zzMarkedPos ; - zzAtEOF = s.zzAtEOF; - zzEOFDone = s.zzEOFDone; - yyline = s.yyline; - yycolumn = s.yycolumn; - } - - - /** - * Returns true iff there are still streams left - * to read from on the stream stack. - */ - public final boolean yymoreStreams() { - return !zzStreams.isEmpty(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - * - * @see #yypushStream(java.io.Reader) - * @see #yypopStream() - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - - /** - * Contains user EOF-code, which will be executed exactly once, - * when the end of file is reached - */ - private void zzDoEOF() throws java.io.IOException { - if (!zzEOFDone) { - zzEOFDone = true; - yyclose(); - } - } - - - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ - public Symbol next_token() throws java.io.IOException { - int zzInput; - int zzAction; - - int [] zzTransL = ZZ_TRANS; - int [] zzRowMapL = ZZ_ROWMAP; - int [] zzAttrL = ZZ_ATTRIBUTE; - - while (true) { - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL = zzMarkedPos; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - - boolean zzR = false; - for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; - zzCurrentPosL++) { - switch (zzBufferL[zzCurrentPosL]) { - case '\u000B': - case '\u000C': - case '\u0085': - case '\u2028': - case '\u2029': - yyline++; - yycolumn = 0; - zzR = false; - break; - case '\r': - yyline++; - yycolumn = 0; - zzR = true; - break; - case '\n': - if (zzR) - zzR = false; - else { - yyline++; - yycolumn = 0; - } - break; - default: - zzR = false; - yycolumn++; - } - } - - if (zzR) { - // peek one character ahead if it is \n (if we have counted one line too much) - boolean zzPeek; - if (zzMarkedPosL < zzEndReadL) - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - else if (zzAtEOF) - zzPeek = false; - else { - boolean eof = zzRefill(); - zzEndReadL = zzEndRead; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - if (eof) - zzPeek = false; - else - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - } - if (zzPeek) yyline--; - } - if (zzMarkedPosL > zzStartRead) { - switch (zzBufferL[zzMarkedPosL-1]) { - case '\n': - case '\u000B': - case '\u000C': - case '\u0085': - case '\u2028': - case '\u2029': - zzAtBOL = true; - break; - case '\r': - if (zzMarkedPosL < zzEndReadL) - zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; - else if (zzAtEOF) - zzAtBOL = false; - else { - boolean eof = zzRefill(); - zzMarkedPosL = zzMarkedPos; - zzEndReadL = zzEndRead; - zzBufferL = zzBuffer; - if (eof) - zzAtBOL = false; - else - zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; - } - break; - default: - zzAtBOL = false; - } - } - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - if (zzAtBOL) - zzState = ZZ_LEXSTATE[zzLexicalState+1]; - else - zzState = ZZ_LEXSTATE[zzLexicalState]; - - - zzForAction: { - while (true) { - - if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferL[zzCurrentPosL++]; - else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } - else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } - else { - zzInput = zzBufferL[zzCurrentPosL++]; - } - } - int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; - if (zzNext == -1) break zzForAction; - zzState = zzNext; - - int zzAttributes = zzAttrL[zzState]; - if ( (zzAttributes & 1) == 1 ) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ( (zzAttributes & 8) == 8 ) break zzForAction; - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 118: - { cupDebug = true; - } - case 177: break; - case 175: - { return symbol(UNICODE_FINAL_QUOTE_PUNCTUATION); - } - case 178: break; - case 168: - { return symbol(UNICODE_DASH_PUNCTUATION); - } - case 179: break; - case 122: - { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); - } - case 180: break; - case 113: - { File f = new File(yytext().substring(9).trim()); - if ( !f.canRead() ) - throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); - // check for cycle - if (files.search(f) > 0) - throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline); - try { - yypushStream( new FileReader(f) ); - files.push(file); - file = f; - Out.println("Including \""+file+"\""); - } - catch (FileNotFoundException e) { - throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); - } - } - case 181: break; - case 88: - { return symbol(FULL); - } - case 182: break; - case 158: - { return symbol(UNICODE_LINE_SEPARATOR); - } - case 183: break; - case 92: - { return symbol(ASCII); - } - case 184: break; - case 21: - { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); - } - case 185: break; - case 142: - { return symbol(UPPERCLASS); - } - case 186: break; - case 34: - { return symbol(COMMA); - } - case 187: break; - case 61: - { return symbol(CHAR,new Character('\f')); - } - case 188: break; - case 111: - { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); - } - case 189: break; - case 153: - { return symbol(UNICODE_OTHER_NUMBER); - } - case 190: break; - case 104: - { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); - } - case 191: break; - case 143: - { return symbol(LOWERCLASS); - } - case 192: break; - case 176: - { return symbol(UNICODE_INITIAL_QUOTE_PUNCTUATION); - } - case 193: break; - case 72: - { string.append('\r'); - } - case 194: break; - case 43: - { return symbol(HAT); - } - case 195: break; - case 48: - { yybegin(MACROS); ctorArgs.add(yytext().trim()); - } - case 196: break; - case 1: - { return symbol(EOF); - } - case 197: break; - case 59: - { return symbol(CHAR,new Character('\t')); - } - case 198: break; - case 145: - { eofclose = false; - } - case 199: break; - case 103: - { isPublic = true; - } - case 200: break; - case 164: - { return symbol(UNICODE_UPPERCASE_LETTER); - } - case 201: break; - case 112: - { actionText.setLength(0); yybegin(JAVA_CODE); - Symbol s = symbol_countUpdate(EOFRULE, null); - action_line = s.left+1; - return s; - } - case 202: break; - case 40: - { balance++; return symbol(OPENCLASS); - } - case 203: break; - case 147: - { return symbol(UNICODE_FORMAT); - } - case 204: break; - case 11: - { yybegin(REGEXP); - } - case 205: break; - case 12: - { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); - } - case 206: break; - case 68: - { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); - } - case 207: break; - case 62: - { return symbol(CHAR,new Character('\b')); - } - case 208: break; - case 39: - { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); - } - case 209: break; - case 5: - { states.insert(yytext(),inclusive_states); - } - case 210: break; - case 70: - { string.append('\n'); - } - case 211: break; - case 10: - { yybegin(REGEXP); return symbol(EQUALS); - } - case 212: break; - case 146: - { return symbol(JLETTERDIGITCLASS); - } - case 213: break; - case 19: - { return symbol(STAR); - } - case 214: break; - case 42: - { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); - } - case 215: break; - case 116: - { isAbstract = true; - } - case 216: break; - case 75: - { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); - } - case 217: break; - case 114: - { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); - } - case 218: break; - case 109: - { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); - } - case 219: break; - case 93: - { packed = false; useRowMap = true; - } - case 220: break; - case 87: - { cupCompatible = true; - isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner"); - if (functionName == null) - functionName = "next_token"; - if (tokenType == null) - tokenType = "java_cup.runtime.Symbol"; - if (eofVal == null) - eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);"; - if (!Options.jlex) eofclose = true; - } - case 221: break; - case 171: - { return symbol(UNICODE_PARAGRAPH_SEPARATOR); - } - case 222: break; - case 30: - { bolUsed = true; return symbol(HAT); - } - case 223: break; - case 4: - { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); - } - case 224: break; - case 35: - { yybegin(REGEXP); return symbol(MORETHAN); - } - case 225: break; - case 100: - { packed = false; useRowMap = false; - } - case 226: break; - case 119: - { caseless = true; - } - case 227: break; - case 38: - { yybegin(nextState); return symbol(STRING, string.toString()); - } - case 228: break; - case 76: - { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); - } - case 229: break; - case 13: - { return symbol_countUpdate(RBRACE, null); - } - case 230: break; - case 139: - { scanErrorException = yytext().substring(11).trim(); - } - case 231: break; - case 141: - { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); - } - case 232: break; - case 84: - { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); - } - case 233: break; - case 2: - { /* ignore */ - } - case 234: break; - case 150: - { return symbol(UNICODE_UNASSIGNED); - } - case 235: break; - case 156: - { return symbol(UNICODE_LETTER_NUMBER); - } - case 236: break; - case 127: - { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); - } - case 237: break; - case 47: - { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); - } - case 238: break; - case 161: - { return symbol(UNICODE_CURRENCY_SYMBOL); - } - case 239: break; - case 108: - { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); - } - case 240: break; - case 31: - { actionText.append(yytext()); - } - case 241: break; - case 83: - { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); - } - case 242: break; - case 174: - { return symbol(UNICODE_COMBINING_SPACING_MARK); - } - case 243: break; - case 107: - { notUnix = true; - } - case 244: break; - case 89: - { lineCount = true; - } - case 245: break; - case 136: - { initThrow = concExc(initThrow,yytext().substring(11).trim()); - } - case 246: break; - case 131: - { standalone = true; isInteger = true; - } - case 247: break; - case 52: - { nextState = MACROS; yybegin(COMMENT); - } - case 248: break; - case 25: - { return symbol(TILDE); - } - case 249: break; - case 37: - { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); - } - case 250: break; - case 110: - { className = yytext().substring(7).trim(); - } - case 251: break; - case 9: - { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); - } - case 252: break; - case 162: - { return symbol(UNICODE_MODIFIER_LETTER); - } - case 253: break; - case 55: - { nextState = REGEXPSTART; yybegin(COMMENT); - } - case 254: break; - case 173: - { return symbol(UNICODE_CONNECTOR_PUNCTUATION); - } - case 255: break; - case 16: - { return symbol(POINT); - } - case 256: break; - case 73: - { string.append('\f'); - } - case 257: break; - case 65: - { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); - } - case 258: break; - case 80: - { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); - } - case 259: break; - case 140: - { initThrow = concExc(initThrow,string); yybegin(MACROS); - } - case 260: break; - case 135: - { eofThrow = concExc(eofThrow,string); yybegin(MACROS); - } - case 261: break; - case 71: - { string.append('\t'); - } - case 262: break; - case 67: - { string.append(yytext().charAt(1)); - } - case 263: break; - case 7: - { yybegin(MACROS); - } - case 264: break; - case 98: - { eofCode = conc(eofCode,string); yybegin(MACROS); - } - case 265: break; - case 56: - { return symbol(CHAR, new Character(yytext().charAt(1))); - } - case 266: break; - case 154: - { return symbol(UNICODE_OTHER_LETTER); - } - case 267: break; - case 28: - { return symbol(PLUS); - } - case 268: break; - case 101: - { columnCount = true; - } - case 269: break; - case 124: - { isExtending = yytext().substring(9).trim(); - } - case 270: break; - case 123: - { eofVal = string.toString(); yybegin(MACROS); - } - case 271: break; - case 36: - { string.append(yytext()); - } - case 272: break; - case 97: - { return symbol(UNICODE); - } - case 273: break; - case 152: - { return symbol(UNICODE_PRIVATE_USE); - } - case 274: break; - case 163: - { return symbol(UNICODE_MODIFIER_SYMBOL); - } - case 275: break; - case 74: - { string.append('\b'); - } - case 276: break; - case 24: - { return symbol(BANG); - } - case 277: break; - case 132: - { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); - } - case 278: break; - case 91: - { packed = true; useRowMap = true; - } - case 279: break; - case 26: - { return symbol(OPENBRACKET); - } - case 280: break; - case 155: - { return symbol(UNICODE_OTHER_SYMBOL); - } - case 281: break; - case 60: - { return symbol(CHAR,new Character('\r')); - } - case 282: break; - case 94: - { isFinal = true; - } - case 283: break; - case 27: - { return symbol(CLOSEBRACKET); - } - case 284: break; - case 86: - { isInteger = true; - } - case 285: break; - case 166: - { return symbol(UNICODE_TITLECASE_LETTER); - } - case 286: break; - case 20: - { return symbol(LOOKAHEAD); - } - case 287: break; - case 51: - { commentbalance++; - } - case 288: break; - case 49: - { t.start(); - yybegin(MACROS); - macroDefinition = true; - return symbol(USERCODE,userCode); - } - case 289: break; - case 44: - { return symbol(DASH); - } - case 290: break; - case 138: - { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); - } - case 291: break; - case 96: - { debugOption = true; - } - case 292: break; - case 64: - { nextState = REGEXP; yybegin(COMMENT); - } - case 293: break; - case 32: - { if (balance > 0) { - balance--; - actionText.append('}'); - } - else { - yybegin(REGEXPSTART); - Action a = new Action(actionText.toString(), action_line); - actions.addElement(a); - return symbol(ACTION, a); - } - } - case 294: break; - case 157: - { return symbol(UNICODE_ENCLOSING_MARK); - } - case 295: break; - case 29: - { return symbol(DOLLAR); - } - case 296: break; - case 169: - { return symbol(UNICODE_OTHER_PUNCTUATION); - } - case 297: break; - case 17: - { yybegin(CHARCLASS); return symbol(OPENCLASS); - } - case 298: break; - case 105: - { initCode = conc(initCode,string); yybegin(MACROS); - } - case 299: break; - case 69: - { string.append('\"'); - } - case 300: break; - case 137: - { isImplementing = concExc(isImplementing, yytext().substring(12).trim()); - } - case 301: break; - case 126: - { return symbol(LETTERCLASS); - } - case 302: break; - case 151: - { return symbol(UNICODE_MATH_SYMBOL); - } - case 303: break; - case 102: - { isInteger = true; - if (eofVal == null) - eofVal = "return 0;"; - eofclose = true; - } - case 304: break; - case 41: - { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); - } - case 305: break; - case 77: - { string.setLength(0); yybegin(COPY); - } - case 306: break; - case 8: - { return symbol(IDENT, yytext()); - } - case 307: break; - case 121: - { return symbol(DIGITCLASS); - } - case 308: break; - case 144: - { lexThrow = concExc(lexThrow,string); yybegin(MACROS); - } - case 309: break; - case 53: - { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); - } - case 310: break; - case 23: - { return symbol(BAR); - } - case 311: break; - case 148: - { return symbol(UNICODE_CONTROL); - } - case 312: break; - case 45: - { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); - } - case 313: break; - case 117: - { cupSymbol = yytext().substring(8).trim(); - if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); - } - case 314: break; - case 58: - { return symbol(CHAR,new Character('\n')); - } - case 315: break; - case 95: - { isYYEOF = true; - } - case 316: break; - case 14: - { return symbol(CHAR, new Character(yytext().charAt(0))); - } - case 317: break; - case 99: - { tokenType = yytext().substring(6).trim(); - } - case 318: break; - case 160: - { return symbol(UNICODE_SPACE_SEPARATOR); - } - case 319: break; - case 33: - { balance++; actionText.append('{'); - } - case 320: break; - case 128: - { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); - } - case 321: break; - case 63: - { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); - } - case 322: break; - case 81: - { return symbol_countUpdate(MACROUSE, makeMacroIdent()); - } - case 323: break; - case 170: - { return symbol(UNICODE_START_PUNCTUATION); - } - case 324: break; - case 149: - { return symbol(UNICODE_SURROGATE); - } - case 325: break; - case 15: - { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); - } - case 326: break; - case 125: - { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); - } - case 327: break; - case 167: - { return symbol(UNICODE_LOWERCASE_LETTER); - } - case 328: break; - case 90: - { charCount = true; - } - case 329: break; - case 165: - { return symbol(UNICODE_NON_SPACING_MARK); - } - case 330: break; - case 130: - { visibility = "private"; Skeleton.makePrivate(); - } - case 331: break; - case 134: - { return symbol(JLETTERCLASS); - } - case 332: break; - case 22: - { yybegin(REGEXPSTART); return symbol(LBRACE); - } - case 333: break; - case 115: - { eofclose = true; - } - case 334: break; - case 66: - // lookahead expression with fixed lookahead length - yypushback(1); - { if (macroDefinition) { - yybegin(EATWSPNL); - return symbol(BAR); - } - else { - yybegin(REGEXPSTART); - return symbol(NOACTION); - } - } - case 335: break; - case 82: - // lookahead expression with fixed lookahead length - yypushback(2); - { if (macroDefinition) { - yybegin(EATWSPNL); - return symbol(BAR); - } - else { - yybegin(REGEXPSTART); - return symbol(NOACTION); - } - } - case 336: break; - case 46: - { yybegin(REGEXP); return symbol(RBRACE); - } - case 337: break; - case 78: - { inclusive_states = false; yybegin(STATELIST); - } - case 338: break; - case 120: - { bufferSize = Integer.parseInt(yytext().substring(8).trim()); - } - case 339: break; - case 106: - { isIntWrap = true; - } - case 340: break; - case 133: - { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); - } - case 341: break; - case 3: - { userCode.append(yytext()); - } - case 342: break; - case 159: - { return symbol(UNICODE_END_PUNCTUATION); - } - case 343: break; - case 54: - { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); - } - case 344: break; - case 129: - { functionName = yytext().substring(10).trim(); - } - case 345: break; - case 85: - { classCode = conc(classCode,string); yybegin(MACROS); - } - case 346: break; - case 18: - { return symbol(QUESTION); - } - case 347: break; - case 50: - { if (commentbalance > 0) - commentbalance--; - else - yybegin(nextState); - } - case 348: break; - case 79: - { inclusive_states = true; yybegin(STATELIST); - } - case 349: break; - case 57: - { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); - } - case 350: break; - case 172: - { return symbol(UNICODE_DECIMAL_DIGIT_NUMBER); - } - case 351: break; - case 6: - { - } - case 352: break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - zzDoEOF(); - switch (zzLexicalState) { - case STRING_CONTENT: { - throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); - } - case 1300: break; - case MACROS: { - if ( yymoreStreams() ) { - file = (File) files.pop(); - yypopStream(); - } - else - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } - case 1301: break; - case STATELIST: { - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } - case 1302: break; - case CHARCLASS: { - throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); - } - case 1303: break; - case JAVA_CODE: { - throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); - } - case 1304: break; - case REPEATEXP: { - throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); - } - case 1305: break; - case COMMENT: { - throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); - } - case 1306: break; - case STATES: { - throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); - } - case 1307: break; - case COPY: { - throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); - } - case 1308: break; - default: - { - if ( yymoreStreams() ) { - file = (File) files.pop(); - yypopStream(); - } - else - return symbol(EOF); - } - } - } - else { - zzScanError(ZZ_NO_MATCH); - } - } - } - } - - /** - * Converts an int token code into the name of the - * token by reflection on the cup symbol class/interface sym - * - * This code was contributed by Karl Meissner - */ - private String getTokenName(int token) { - try { - java.lang.reflect.Field [] classFields = sym.class.getFields(); - for (int i = 0; i < classFields.length; i++) { - if (classFields[i].getInt(null) == token) { - return classFields[i].getName(); - } - } - } catch (Exception e) { - e.printStackTrace(System.err); - } - - return "UNKNOWN TOKEN"; - } - - /** - * Same as next_token but also prints the token to standard out - * for debugging. - * - * This code was contributed by Karl Meissner - */ - public Symbol debug_next_token() throws java.io.IOException { - java_cup.runtime.Symbol s = next_token(); - System.out.println( "line:" + (yyline+1) + " col:" + (yycolumn+1) + " --"+ yytext() + "--" + getTokenName(s.sym) + "--"); - return s; - } - - /** - * Runs the scanner on input files. - * - * This main method is the debugging routine for the scanner. - * It prints debugging information about each returned token to - * System.out until the end of file is reached, or an error occured. - * - * @param argv the command line, contains the filenames to run - * the scanner on. - */ - public static void main(String argv[]) { - if (argv.length == 0) { - System.out.println("Usage : java LexScan "); - } - else { - for (int i = 0; i < argv.length; i++) { - LexScan scanner = null; - try { - scanner = new LexScan( new java.io.FileReader(argv[i]) ); - while ( !scanner.zzAtEOF ) scanner.debug_next_token(); - } - catch (java.io.FileNotFoundException e) { - System.out.println("File not found : \""+argv[i]+"\""); - } - catch (java.io.IOException e) { - System.out.println("IO error scanning file \""+argv[i]+"\""); - System.out.println(e); - } - catch (Exception e) { - System.out.println("Unexpected exception:"); - e.printStackTrace(); - } - } - } - } - - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/LexicalStates.java b/tools/lexer/jflex-1.4/src/JFlex/LexicalStates.java deleted file mode 100644 index 1efcdb79ecb9..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/LexicalStates.java +++ /dev/null @@ -1,97 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - - -/** - * Simple symbol table, mapping lexical state names to integers. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class LexicalStates { - - /** maps state name to state number */ - Hashtable states; - - /** codes of inclusive states (subset of states) */ - Vector inclusive; - - /** number of declared states */ - int numStates; - - - /** - * constructs a new lexical state symbol table - */ - public LexicalStates() { - states = new Hashtable(); - inclusive = new Vector(); - } - - - /** - * insert a new state declaration - */ - public void insert(String name, boolean is_inclusive) { - if ( states.containsKey(name) ) return; - - Integer code = new Integer(numStates++); - states.put(name, code); - - if (is_inclusive) - inclusive.addElement(code); - } - - - /** - * returns the number (code) of a declared state, - * null if no such state has been declared. - */ - public Integer getNumber(String name) { - return (Integer) states.get(name); - } - - - /** - * returns the number of declared states - */ - public int number() { - return numStates; - } - - - /** - * returns the names of all states - */ - public Enumeration names() { - return states.keys(); - } - - /** - * returns the code of all inclusive states - */ - public Enumeration getInclusiveStates() { - return inclusive.elements(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/MacroException.java b/tools/lexer/jflex-1.4/src/JFlex/MacroException.java deleted file mode 100644 index 56ff910793cb..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/MacroException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * This Exception is used in the macro expander to report cycles or - * undefined macro usages. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class MacroException extends RuntimeException { - - /** - * Creates a new MacroException without message - */ - public MacroException() { - } - - - /** - * Creates a new MacroException with the specified message - * - * @param message the error description presented to the user. - */ - public MacroException(String message) { - super(message); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Macros.java b/tools/lexer/jflex-1.4/src/JFlex/Macros.java deleted file mode 100644 index 02c0b4d370e2..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Macros.java +++ /dev/null @@ -1,217 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.*; - - -/** - * Symbol table and expander for macros. - * - * Maps macros to their (expanded) definitions, detects cycles and - * unused macros. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class Macros { - - /** Maps names of macros to their definition */ - private Hashtable macros; - - /** Maps names of macros to their "used" flag */ - private Hashtable used; - - - /** - * Creates a new macro expander. - */ - public Macros() { - macros = new Hashtable(); - used = new Hashtable(); - } - - - /** - * Stores a new macro and its definition. - * - * @param name the name of the new macro - * @param definition the definition of the new macro - * - * @return true, iff the macro name has not been - * stored before. - */ - public boolean insert(String name, RegExp definition) { - - if (Options.DEBUG) - Out.debug("inserting macro "+name+" with definition :"+Out.NL+definition); //$NON-NLS-1$ //$NON-NLS-2$ - - used.put(name, Boolean.FALSE); - return macros.put(name,definition) == null; - } - - - /** - * Marks a makro as used. - * - * @return true, iff the macro name has been - * stored before. - */ - public boolean markUsed(String name) { - return used.put(name, Boolean.TRUE) != null; - } - - - /** - * Tests if a macro has been used. - * - * @return true, iff the macro has been used in - * a regular expression. - */ - public boolean isUsed(String name) { - return ((Boolean)used.get(name)).booleanValue(); - } - - - /** - * Returns all unused macros. - * - * @return the enumeration of macro names that have not been used. - */ - public Enumeration unused() { - - Vector unUsed = new Vector(); - - Enumeration names = used.keys(); - while ( names.hasMoreElements() ) { - String name = (String) names.nextElement(); - Boolean isUsed = (Boolean) used.get( name ); - if ( !isUsed.booleanValue() ) unUsed.addElement(name); - } - - return unUsed.elements(); - } - - - /** - * Fetches the definition of the macro with the specified name, - *

- * The definition will either be the same as stored (expand() not - * called), or an equivalent one, that doesn't contain any macro - * usages (expand() called before). - * - * @param name the name of the macro - * - * @return the definition of the macro, null if - * no macro with the specified name has been stored. - * - * @see JFlex.Macros#expand - */ - public RegExp getDefinition(String name) { - return (RegExp) macros.get(name); - } - - - /** - * Expands all stored macros, so that getDefinition always returns - * a defintion that doesn't contain any macro usages. - * - * @throws MacroException if there is a cycle in the macro usage graph. - */ - public void expand() throws MacroException { - - Enumeration names; - - names = macros.keys(); - - while ( names.hasMoreElements() ) { - String name = (String) names.nextElement(); - if ( isUsed(name) ) - macros.put(name, expandMacro(name, getDefinition(name))); - // this put doesn't get a new key, so only a new value - // is set for the key "name" (without changing the enumeration - // "names"!) - } - } - - - /** - * Expands the specified macro by replacing each macro usage - * with the stored definition. - * - * @param name the name of the macro to expand (for detecting cycles) - * @param definition the definition of the macro to expand - * - * @return the expanded definition of the macro. - * - * @throws MacroException when an error (such as a cyclic definition) - * occurs during expansion - */ - private RegExp expandMacro(String name, RegExp definition) throws MacroException { - - // Out.print("checking macro "+name); - // Out.print("definition is "+definition); - - switch ( definition.type ) { - case sym.BAR: - case sym.CONCAT: - RegExp2 binary = (RegExp2) definition; - binary.r1 = expandMacro(name, binary.r1); - binary.r2 = expandMacro(name, binary.r2); - return definition; - - case sym.STAR: - case sym.PLUS: - case sym.QUESTION: - case sym.BANG: - case sym.TILDE: - RegExp1 unary = (RegExp1) definition; - unary.content = expandMacro(name, (RegExp) unary.content); - return definition; - - case sym.MACROUSE: - String usename = (String) ((RegExp1) definition).content; - - if ( name.equals(usename) ) - throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_CYCLE, name)); - - RegExp usedef = getDefinition(usename); - - if ( usedef == null ) - throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_DEF_MISSING, usename, name)); - - markUsed(usename); - - return expandMacro(name, usedef); - - case sym.STRING: - case sym.STRING_I: - case sym.CHAR: - case sym.CHAR_I: - case sym.CCLASS: - case sym.CCLASSNOT: - return definition; - - default: - throw new MacroException("unknown expression type "+definition.type+" in macro expansion"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Main.java b/tools/lexer/jflex-1.4/src/JFlex/Main.java deleted file mode 100644 index 5b7068692b2d..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Main.java +++ /dev/null @@ -1,342 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.io.*; -import java.util.*; -import JFlex.gui.MainFrame; - - -/** - * This is the main class of JFlex controlling the scanner generation process. - * It is responsible for parsing the commandline, getting input files, - * starting up the GUI if necessary, etc. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class Main { - - /** JFlex version */ - final public static String version = "1.4.3"; //$NON-NLS-1$ - - /** - * Generates a scanner for the specified input file. - * - * @param inputFile a file containing a lexical specification - * to generate a scanner for. - */ - public static void generate(File inputFile) { - - Out.resetCounters(); - - Timer totalTime = new Timer(); - Timer time = new Timer(); - - LexScan scanner = null; - LexParse parser = null; - FileReader inputReader = null; - - totalTime.start(); - - try { - Out.println(ErrorMessages.READING, inputFile.toString()); - inputReader = new FileReader(inputFile); - scanner = new LexScan(inputReader); - scanner.setFile(inputFile); - parser = new LexParse(scanner); - } - catch (FileNotFoundException e) { - Out.error(ErrorMessages.CANNOT_OPEN, inputFile.toString()); - throw new GeneratorException(); - } - - try { - NFA nfa = (NFA) parser.parse().value; - - Out.checkErrors(); - - if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.NFA_IS)+ - Out.NL+nfa+Out.NL); - - if (Options.dot) - nfa.writeDot(Emitter.normalize("nfa.dot", null)); //$NON-NLS-1$ - - Out.println(ErrorMessages.NFA_STATES, nfa.numStates); - - time.start(); - DFA dfa = nfa.getDFA(); - time.stop(); - Out.time(ErrorMessages.DFA_TOOK, time); - - dfa.checkActions(scanner, parser); - - nfa = null; - - if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.DFA_IS)+ - Out.NL+dfa+Out.NL); - - if (Options.dot) - dfa.writeDot(Emitter.normalize("dfa-big.dot", null)); //$NON-NLS-1$ - - Out.checkErrors(); - - time.start(); - dfa.minimize(); - time.stop(); - - Out.time(ErrorMessages.MIN_TOOK, time); - - if (Options.dump) - Out.dump(ErrorMessages.get(ErrorMessages.MIN_DFA_IS)+ - Out.NL+dfa); - - if (Options.dot) - dfa.writeDot(Emitter.normalize("dfa-min.dot", null)); //$NON-NLS-1$ - - time.start(); - - Emitter e = new Emitter(inputFile, parser, dfa); - e.emit(); - - time.stop(); - - Out.time(ErrorMessages.WRITE_TOOK, time); - - totalTime.stop(); - - Out.time(ErrorMessages.TOTAL_TIME, totalTime); - } - catch (ScannerException e) { - Out.error(e.file, e.message, e.line, e.column); - throw new GeneratorException(); - } - catch (MacroException e) { - Out.error(e.getMessage()); - throw new GeneratorException(); - } - catch (IOException e) { - Out.error(ErrorMessages.IO_ERROR, e.toString()); - throw new GeneratorException(); - } - catch (OutOfMemoryError e) { - Out.error(ErrorMessages.OUT_OF_MEMORY); - throw new GeneratorException(); - } - catch (GeneratorException e) { - throw new GeneratorException(); - } - catch (Exception e) { - e.printStackTrace(); - throw new GeneratorException(); - } - - } - - public static Vector parseOptions(String argv[]) throws SilentExit { - Vector files = new Vector(); - - for (int i = 0; i < argv.length; i++) { - - if ( argv[i].equals("-d") || argv[i].equals("--outdir") ) { //$NON-NLS-1$ //$NON-NLS-2$ - if ( ++i >= argv.length ) { - Out.error(ErrorMessages.NO_DIRECTORY); - throw new GeneratorException(); - } - Options.setDir(argv[i]); - continue; - } - - if ( argv[i].equals("--skel") || argv[i].equals("-skel") ) { //$NON-NLS-1$ //$NON-NLS-2$ - if ( ++i >= argv.length ) { - Out.error(ErrorMessages.NO_SKEL_FILE); - throw new GeneratorException(); - } - - Options.setSkeleton(new File(argv[i])); - continue; - } - - if ( argv[i].equals("-jlex") || argv[i].equals("--jlex") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.jlex = true; - continue; - } - - if ( argv[i].equals("-v") || argv[i].equals("--verbose") || argv[i].equals("-verbose") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Options.verbose = true; - Options.progress = true; - continue; - } - - if ( argv[i].equals("-q") || argv[i].equals("--quiet") || argv[i].equals("-quiet") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - Options.verbose = false; - Options.progress = false; - continue; - } - - if ( argv[i].equals("--dump") || argv[i].equals("-dump") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.dump = true; - continue; - } - - if ( argv[i].equals("--time") || argv[i].equals("-time") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.time = true; - continue; - } - - if ( argv[i].equals("--version") || argv[i].equals("-version") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Out.println(ErrorMessages.THIS_IS_JFLEX, version); - throw new SilentExit(); - } - - if ( argv[i].equals("--dot") || argv[i].equals("-dot") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.dot = true; - continue; - } - - if ( argv[i].equals("--help") || argv[i].equals("-h") || argv[i].equals("/h") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - printUsage(); - throw new SilentExit(); - } - - if ( argv[i].equals("--info") || argv[i].equals("-info") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Out.printSystemInfo(); - throw new SilentExit(); - } - - if ( argv[i].equals("--nomin") || argv[i].equals("-nomin") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.no_minimize = true; - continue; - } - - if ( argv[i].equals("--pack") || argv[i].equals("-pack") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.gen_method = Options.PACK; - continue; - } - - if ( argv[i].equals("--table") || argv[i].equals("-table") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.gen_method = Options.TABLE; - continue; - } - - if ( argv[i].equals("--switch") || argv[i].equals("-switch") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.gen_method = Options.SWITCH; - continue; - } - - if ( argv[i].equals("--nobak") || argv[i].equals("-nobak") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.no_backup = true; - continue; - } - - if ( argv[i].equals("--charat") || argv[i].equals("-charat") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.char_at = true; - continue; - } - - if ( argv[i].equals("--sliceandcharat") || argv[i].equals("-sliceandcharat") ) { //$NON-NLS-1$ //$NON-NLS-2$ - Options.sliceAndCharAt = true; - continue; - } - - if ( argv[i].startsWith("-") ) { //$NON-NLS-1$ - Out.error(ErrorMessages.UNKNOWN_COMMANDLINE, argv[i]); - printUsage(); - throw new SilentExit(); - } - - // if argv[i] is not an option, try to read it as file - File f = new File(argv[i]); - if ( f.isFile() && f.canRead() ) - files.addElement(f); - else { - Out.error("Sorry, couldn't open \""+f+"\""); //$NON-NLS-2$ - throw new GeneratorException(); - } - } - - return files; - } - - - public static void printUsage() { - Out.println(""); //$NON-NLS-1$ - Out.println("Usage: jflex "); - Out.println(""); - Out.println("Where can be one or more of"); - Out.println("-d write generated file to "); - Out.println("--skel use external skeleton "); - Out.println("--switch"); - Out.println("--table"); - Out.println("--pack set default code generation method"); - Out.println("--jlex strict JLex compatibility"); - Out.println("--nomin skip minimization step"); - Out.println("--nobak don't create backup files"); - Out.println("--dump display transition tables"); - Out.println("--dot write graphviz .dot files for the generated automata (alpha)"); - Out.println("--verbose"); - Out.println("-v display generation progress messages (default)"); - Out.println("--quiet"); - Out.println("-q display errors only"); - Out.println("--time display generation time statistics"); - Out.println("--version print the version number of this copy of jflex"); - Out.println("--info print system + JDK information"); - Out.println("--help"); - Out.println("-h print this message"); - Out.println(""); - Out.println(ErrorMessages.THIS_IS_JFLEX, version); - Out.println("Have a nice day!"); - } - - - public static void generate(String argv[]) throws SilentExit { - Vector files = parseOptions(argv); - - if (files.size() > 0) { - for (int i = 0; i < files.size(); i++) - generate((File) files.elementAt(i)); - } - else { - new MainFrame(); - } - } - - - /** - * Starts the generation process with the files in argv or - * pops up a window to choose a file, when argv doesn't have - * any file entries. - * - * @param argv the commandline. - */ - public static void main(String argv[]) { - try { - generate(argv); - } - catch (GeneratorException e) { - Out.statistics(); - System.exit(1); - } - catch (SilentExit e) { - System.exit(1); - } - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Messages.properties b/tools/lexer/jflex-1.4/src/JFlex/Messages.properties deleted file mode 100644 index c90ff55a95cd..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Messages.properties +++ /dev/null @@ -1,74 +0,0 @@ -UNTERMINATED_STR = Unterminated string at end of line. -EOF_WO_ACTION = <> must be followed by an action. -EOF_SINGLERULE = <> can only be used as a single rule. -UNKNOWN_OPTION = Unkown %-option -UNEXPECTED_CHAR = Unexpected character -UNEXPECTED_NL = Unexpected character -LEXSTATE_UNDECL = Lexical state has not been declared. -STATE_IDENT_EXP = State identifier expected. -REPEAT_ZERO = Illegal repeat statement. At least one operand must be > 0 -REPEAT_GREATER = Illegal repeat statement. First operand must not be greater than second one. -REGEXP_EXPECTED = Regular expression expected. -MACRO_UNDECL = Macro has not been declared. -CHARSET_2_SMALL = Character set is too small for this class. -CS2SMALL_STRING = Character set is too small for a charactor of this string. -CS2SMALL_CHAR = Character set is too small for this character. -CHARCLASS_MACRO = Macros in character classes are not supported. -UNKNOWN_SYNTAX = Syntax error. -SYNTAX_ERROR = Syntax error. -NOT_AT_BOL = %-option is not at the beginning of the line. -NO_MATCHING_BR = Didn't find matching bracket -EOF_IN_ACTION = Unexpected end of file in action code -EOF_IN_COMMENT = Unexpected end of file in comment -EOF_IN_STRING = Unexpected end of file in string -EOF_IN_MACROS = Unexpected end of file in macros -EOF_IN_STATES = Unexpected end of file in state list -EOF_IN_REGEXP = Unexpected end of file in regular expression -UNEXPECTED_EOF = Unexpected end of file (maybe missing "*/" ")" "]" or "}") -NO_LEX_SPEC = This seems not to be a lexical specification (first %% is missing) -NO_LAST_ACTION = Last action in the specification must not be "|" -NO_DIRECTORY = No directory for -d option -NO_SKEL_FILE = No file provided for -skel option -WRONG_SKELETON = Incorrect skeleton file (wrong number of sections). -OUT_OF_MEMORY = JFlex has run out of memory. Please try increasing the maximum JVM heap size -QUIL_INITTHROW = %initthrow needs a list of (qualified) identifiers -QUIL_EOFTHROW = %eofthrow needs a list of (qualified) identifiers -QUIL_YYLEXTHROW = %yylexthrow needs a list of (qualified) identifiers -ZERO_STATES = Your scanner has zero states. Very funny. -NO_BUFFER_SIZE = %buffer expects the size of the scanner buffer as decimal number -NOT_READABLE = Could not open file. -FILE_CYCLE = Cyclic file inclusion. -FILE_WRITE = Error writing to file -QUIL_SCANERROR = %scannerror needs a (qualified) identifier -NEVER_MATCH = Rule can never be matched: -QUIL_THROW = %throws needs a list of (qualified) identifiers -EOL_IN_CHARCLASS = Unexpected newline in character class (closing "]" is missing) -QUIL_CUPSYM = %cupsym needs a (qualified) identifier -CUPSYM_AFTER_CUP = %cupsym should be used before %cup -ALREADY_RUNNING = The generator is already running -CANNOT_READ_SKEL = Cannot read skeleton file "{0}". -READING_SKEL = Reading skeleton file "{0}". -SKEL_IO_ERROR = IO problem reading skeleton file. -SKEL_IO_ERROR_DEFAULT = IO problem reading default skeleton file. -READING=Reading "{0}" -CANNOT_OPEN=Sorry, couldn''t find the file "{0}". -NFA_IS=NFA is -NFA_STATES={0} states in NFA -DFA_TOOK=DFA construction took {0} -DFA_IS=DFA is -MIN_TOOK=Minimization took {0} -MIN_DFA_IS=Miniminal DFA is -WRITE_TOOK=Writing took {0} -TOTAL_TIME=Overall scanner generation time: {0} -IO_ERROR=An I/O-Error occured: {0} -THIS_IS_JFLEX=This is JFlex {0} -UNKNOWN_COMMANDLINE=Error: unknown option "{0}". -MACRO_CYCLE=Macro {0} contains a cycle. -MACRO_DEF_MISSING=Found no definition for macro "{0}" while expanding "{1}" -PARSING_TOOK=Parsing took {0} -NFA_TOOK=NFA construction took {0} -LOOKAHEAD_NEEDS_ACTION="|" action cannot be used with lookahead expressions -EMPTY_MATCH = Lookahead expression must have match with at least length 1. -CTOR_ARG = Expected an identifier for constructor argument name. -CTOR_DEBUG = Emitting default constructor without parameters and init code for debug/standalone. -INT_AND_TYPE = Scanner can't have int and reference return type at the same time. diff --git a/tools/lexer/jflex-1.4/src/JFlex/NFA.java b/tools/lexer/jflex-1.4/src/JFlex/NFA.java deleted file mode 100644 index 728e0203efd0..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/NFA.java +++ /dev/null @@ -1,1052 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -import java.util.*; -import java.io.*; - - -/** - * NFA representation in JFlex. - * - * Contains algorithms RegExp -> NFA and NFA -> DFA. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class NFA { - - /** table[current_state][next_char] is the set of states that can be reached - /* from current_state with an input next_char */ - StateSet [][] table; - - /** epsilon[current_state] is the set of states that can be reached - /* from current_state via epsilon edges */ - StateSet [] epsilon; - - /** isFinal[state] == true <=> state is a final state of the NFA */ - boolean [] isFinal; - - /** action[current_state]: the action associated with the state - /* current_state (null, if there is no action for the state) */ - Action [] action; - - /** the number of states in this NFA */ - int numStates; - - /** the current maximum number of input characters */ - int numInput; - - /** the number of lexical States. Lexical states have the indices - /* 0..numLexStates-1 in the transition table */ - int numLexStates; - - /** estimated size of the NFA (before actual construction) */ - int estSize = 256; - - Macros macros; - CharClasses classes; - - LexScan scanner; - RegExps regExps; - - // will be reused by several methods (avoids excessive object creation) - private static StateSetEnumerator states = new StateSetEnumerator(); - private static StateSet tempStateSet = new StateSet(); - - public NFA(int numInput, int estSize) { - this.numInput = numInput; - this.estSize = estSize; - numStates = 0; - epsilon = new StateSet [estSize]; - action = new Action [estSize]; - isFinal = new boolean [estSize]; - table = new StateSet [estSize][numInput]; - } - - /** - * Construct new NFA. - * - * Assumes that lookahead cases and numbers are already resolved in RegExps. - * @see RegExps#checkLookAheads() - */ - public NFA(int numInput, LexScan scanner, RegExps regExps, - Macros macros, CharClasses classes) { - this(numInput, regExps.NFASize(macros)+2*scanner.states.number()); - - this.scanner = scanner; - this.regExps = regExps; - this.macros = macros; - this.classes = classes; - - numLexStates = scanner.states.number(); - - // ensureCapacity assumes correctly set up numStates. - int new_num = numEntryStates(); - ensureCapacity(new_num); - numStates = new_num; - } - - public int numEntryStates() { - return 2*(numLexStates+regExps.gen_look_count); - } - - /** - * Add a standalone rule that has minimum priority, fires a transition - * on all single input characters and has a "print yytext" action. - */ - public void addStandaloneRule() { - int start = numStates; - int end = numStates+1; - - for (int c = 0; c < classes.getNumClasses(); c++) - addTransition(start, c, end); - - for (int i = 0; i < numLexStates*2; i++) - addEpsilonTransition(i, start); - - action[end] = new Action("System.out.print(yytext());", Integer.MAX_VALUE); - isFinal[end] = true; - } - - /** - * Add a regexp to this NFA. - * - * @param regExpNum the number of the regexp to add. - */ - public void addRegExp(int regExpNum) { - - if (Options.DEBUG) - Out.debug("Adding nfa for regexp "+regExpNum+" :"+Out.NL+regExps.getRegExp(regExpNum)); - - IntPair nfa = insertNFA( regExps.getRegExp(regExpNum) ); - - Enumeration lexStates = regExps.getStates(regExpNum).elements(); - - if ( !lexStates.hasMoreElements() ) - lexStates = scanner.states.getInclusiveStates(); - - while ( lexStates.hasMoreElements() ) { - int stateNum = ((Integer)lexStates.nextElement()).intValue(); - - if ( !regExps.isBOL(regExpNum) ) - addEpsilonTransition(2*stateNum, nfa.start); - - addEpsilonTransition(2*stateNum+1, nfa.start); - } - - - if ( regExps.getLookAhead(regExpNum) != null ) { - Action a = regExps.getAction(regExpNum); - - if (a.lookAhead() == Action.FINITE_CHOICE) { - insertLookAheadChoices(nfa.end, a, regExps.getLookAhead(regExpNum)); - // remove the original action from the collection: it will never - // be matched directly, only its copies will. - scanner.actions.remove(a); - } - else { - RegExp r1 = regExps.getRegExp(regExpNum); - RegExp r2 = regExps.getLookAhead(regExpNum); - - IntPair look = insertNFA(r2); - - addEpsilonTransition(nfa.end, look.start); - - action[look.end] = a; - isFinal[look.end] = true; - - if (a.lookAhead() == Action.GENERAL_LOOK) { - // base forward pass - IntPair forward = insertNFA(r1); - // lookahead backward pass - IntPair backward = insertNFA(r2.rev(macros)); - - isFinal[forward.end] = true; - action[forward.end] = new Action(Action.FORWARD_ACTION); - - isFinal[backward.end] = true; - action[backward.end] = new Action(Action.BACKWARD_ACTION); - - int entry = 2*(regExps.getLookEntry(regExpNum) + numLexStates); - addEpsilonTransition(entry, forward.start); - addEpsilonTransition(entry+1, backward.start); - - a.setEntryState(entry); - } - } - } - else { - action[nfa.end] = regExps.getAction(regExpNum); - isFinal[nfa.end] = true; - } - } - - /** - * Insert NFAs for the (finitely many) fixed length lookahead choices. - * - * @param lookAhead a lookahead of which isFiniteChoice is true - * @param baseEnd the end state of the base expression NFA - * @param a the action of the expression - * - * @see SemCheck#isFiniteChoice(RegExp) - */ - private void insertLookAheadChoices(int baseEnd, Action a, RegExp lookAhead) { - if (lookAhead.type == sym.BAR) { - RegExp2 r = (RegExp2) lookAhead; - insertLookAheadChoices(baseEnd, a, r.r1); - insertLookAheadChoices(baseEnd, a, r.r2); - } - else if (lookAhead.type == sym.MACROUSE) { - RegExp1 r = (RegExp1) lookAhead; - insertLookAheadChoices(baseEnd, a, macros.getDefinition((String) r.content)); - } - else { - int len = SemCheck.length(lookAhead); - - if (len >= 0) { - // termination case - IntPair look = insertNFA(lookAhead); - - addEpsilonTransition(baseEnd, look.start); - - Action x = a.copyChoice(len); - action[look.end] = x; - isFinal[look.end] = true; - - // add new copy to the collection of known actions such that - // it can be checked for the NEVER_MATCH warning. - scanner.actions.add(x); - } - else { - // should never happen - throw new Error("When inserting lookahead expression: unkown expression type "+lookAhead.type+" in "+lookAhead); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - - /** - * Make sure the NFA can contain at least newNumStates states. - * - * @param newNumStates the minimu number of states. - */ - private void ensureCapacity(int newNumStates) { - int oldLength = epsilon.length; - - if ( newNumStates < oldLength ) return; - - int newStatesLength = Math.max(oldLength*2, newNumStates); - - boolean [] newFinal = new boolean [newStatesLength]; - boolean [] newIsPush = new boolean [newStatesLength]; - Action [] newAction = new Action [newStatesLength]; - StateSet [] [] newTable = new StateSet [newStatesLength] [numInput]; - StateSet [] newEpsilon = new StateSet [newStatesLength]; - - System.arraycopy(isFinal,0,newFinal,0,numStates); - System.arraycopy(action,0,newAction,0,numStates); - System.arraycopy(epsilon,0,newEpsilon,0,numStates); - System.arraycopy(table,0,newTable,0,numStates); - - isFinal = newFinal; - action = newAction; - epsilon = newEpsilon; - table = newTable; - } - - public void addTransition(int start, int input, int dest) { - Out.debug("Adding transition ("+start+", "+input+", "+dest+")"); - - int maxS = Math.max(start,dest)+1; - - ensureCapacity( maxS ); - - if (maxS > numStates) numStates = maxS; - - if ( table[start][input] != null ) - table[start][input].addState(dest); - else - table[start][input] = new StateSet(estSize,dest); - } - - public void addEpsilonTransition(int start, int dest) { - int max = Math.max(start,dest)+1; - ensureCapacity( max ); - if (max > numStates) numStates = max; - - if (epsilon[start] != null) - epsilon[start].addState(dest); - else - epsilon[start] = new StateSet(estSize,dest); - } - - - /** - * Returns true, iff the specified set of states - * contains a final state. - * - * @param set the set of states that is tested for final states. - */ - private boolean containsFinal(StateSet set) { - states.reset(set); - - while ( states.hasMoreElements() ) - if ( isFinal[states.nextElement()] ) return true; - - return false; - } - - - /** - * Returns true, iff the specified set of states - * contains a pushback-state. - * - * @param set the set of states that is tested for pushback-states. - private boolean containsPushback(StateSet set) { - states.reset(set); - - while ( states.hasMoreElements() ) - if ( isPushback[states.nextElement()] ) return true; - - return false; - } - */ - - /** - * Returns the action with highest priority in the specified - * set of states. - * - * @param set the set of states for which to determine the action - */ - private Action getAction(StateSet set) { - - states.reset(set); - - Action maxAction = null; - - Out.debug("Determining action of : "+set); - - while ( states.hasMoreElements() ) { - - Action currentAction = action[ states.nextElement() ]; - - if ( currentAction != null ) { - if (maxAction == null) - maxAction = currentAction; - else - maxAction = maxAction.getHigherPriority(currentAction); - } - - } - - return maxAction; - } - - - /** - * Calculates the epsilon closure for a specified set of states. - * - * The epsilon closure for set a is the set of states that can be reached - * by epsilon edges from a. - * - * @param set the set of states to calculate the epsilon closure for - * - * @return the epsilon closure of the specified set of states - * in this NFA - */ - private StateSet closure(int startState) { - - // Out.debug("Calculating closure of "+set); - - StateSet notvisited = tempStateSet; - StateSet closure = new StateSet(numStates,startState); - - notvisited.clear(); - notvisited.addState(startState); - - while ( notvisited.containsElements() ) { - // Out.debug("closure is now "+closure); - // Out.debug("notvisited is "+notvisited); - int state = notvisited.getAndRemoveElement(); - // Out.debug("removed element "+state+" of "+notvisited); - // Out.debug("epsilon[states] = "+epsilon[state]); - notvisited.add(closure.complement(epsilon[state])); - closure.add(epsilon[state]); - } - - // Out.debug("Closure is : "+closure); - - return closure; - } - - /** - * Returns the epsilon closure of a set of states - */ - private StateSet closure(StateSet startStates) { - StateSet result = new StateSet(numStates); - - if (startStates != null) { - states.reset(startStates); - while (states.hasMoreElements()) - result.add( closure(states.nextElement()) ); - } - - return result; - } - - - private void epsilonFill() { - for (int i = 0; i < numStates; i++) { - epsilon[i] = closure(i); - } - } - - /** - * Calculates the set of states that can be reached from another - * set of states start with an specified input - * character input - * - * @param start the set of states to start from - * @param input the input character for which to search the next states - * - * @return the set of states that are reached from start - * via input - */ - private StateSet DFAEdge(StateSet start, char input) { - // Out.debug("Calculating DFAEdge for state set "+start+" and input '"+input+"'"); - - tempStateSet.clear(); - - states.reset(start); - while ( states.hasMoreElements() ) - tempStateSet.add( table[states.nextElement()][input] ); - - StateSet result = new StateSet(tempStateSet); - - states.reset(tempStateSet); - while ( states.hasMoreElements() ) - result.add( epsilon[states.nextElement()] ); - - // Out.debug("DFAEdge is : "+result); - - return result; - } - - - /** - * Returns an DFA that accepts the same language as this NFA. - * This DFA is usually not minimal. - */ - public DFA getDFA() { - - Hashtable dfaStates = new Hashtable(numStates); - Vector dfaVector = new Vector(numStates); - - DFA dfa = new DFA(numEntryStates(), numInput, numLexStates); - - int numDFAStates = 0; - int currentDFAState = 0; - - Out.println("Converting NFA to DFA : "); - - epsilonFill(); - - StateSet currentState, newState; - - // create the initial states of the DFA - for ( int i = 0; i < numEntryStates(); i++ ) { - newState = epsilon[i]; - - dfaStates.put(newState, new Integer(numDFAStates)); - dfaVector.addElement(newState); - - dfa.setEntryState( i, numDFAStates ); - - dfa.setFinal( numDFAStates, containsFinal(newState) ); - dfa.setAction( numDFAStates, getAction(newState) ); - - numDFAStates++; - } - - numDFAStates--; - - if (Options.DEBUG) - Out.debug("DFA start states are :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector); - - currentDFAState = 0; - - StateSet tempStateSet = NFA.tempStateSet; - StateSetEnumerator states = NFA.states; - - // will be reused - newState = new StateSet(numStates); - - while ( currentDFAState <= numDFAStates ) { - - currentState = (StateSet) dfaVector.elementAt(currentDFAState); - - for (char input = 0; input < numInput; input++) { - - // newState = DFAEdge(currentState, input); - - // inlining DFAEdge for performance: - - // Out.debug("Calculating DFAEdge for state set "+currentState+" and input '"+input+"'"); - - tempStateSet.clear(); - states.reset(currentState); - while ( states.hasMoreElements() ) - tempStateSet.add( table[states.nextElement()][input] ); - - newState.copy(tempStateSet); - - states.reset(tempStateSet); - while ( states.hasMoreElements() ) - newState.add( epsilon[states.nextElement()] ); - - // Out.debug("DFAEdge is : "+newState); - - - if ( newState.containsElements() ) { - - // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState); - - // Out.debug("Looking for state set "+newState); - Integer nextDFAState = (Integer) dfaStates.get(newState); - - if ( nextDFAState != null ) { - // Out.debug("FOUND!"); - dfa.addTransition(currentDFAState, input, nextDFAState.intValue()); - } - else { - if (Options.progress) Out.print("."); - // Out.debug("NOT FOUND!"); - // Out.debug("Table was "+dfaStates); - numDFAStates++; - - // make a new copy of newState to store in dfaStates - StateSet storeState = new StateSet(newState); - - dfaStates.put(storeState, new Integer(numDFAStates)); - dfaVector.addElement(storeState); - - dfa.addTransition(currentDFAState, input, numDFAStates); - dfa.setFinal( numDFAStates, containsFinal(storeState) ); - dfa.setAction( numDFAStates, getAction(storeState) ); - } - } - } - - currentDFAState++; - } - - if (Options.verbose) Out.println(""); - - return dfa; - } - - - public void dumpTable() { - Out.dump(toString()); - } - - public String toString() { - StringBuffer result = new StringBuffer(); - - for (int i=0; i < numStates; i++) { - result.append("State"); - if ( isFinal[i] ) { - result.append("[FINAL"); - String l = action[i].lookString(); - if (!l.equals("")) { - result.append(", "); - result.append(l); - } - result.append("]"); - } - result.append(" "+i+Out.NL); - - for (char input = 0; input < numInput; input++) { - if ( table[i][input] != null && table[i][input].containsElements() ) - result.append(" with "+((int) input)+" in "+table[i][input]+Out.NL); - } - - if ( epsilon[i] != null && epsilon[i].containsElements() ) - result.append(" with epsilon in "+epsilon[i]+Out.NL); - } - - return result.toString(); - } - - public void writeDot(File file) { - try { - PrintWriter writer = new PrintWriter(new FileWriter(file)); - writer.println(dotFormat()); - writer.close(); - } - catch (IOException e) { - Out.error(ErrorMessages.FILE_WRITE, file); - throw new GeneratorException(); - } - } - - public String dotFormat() { - StringBuffer result = new StringBuffer(); - - result.append("digraph NFA {"+Out.NL); - result.append("rankdir = LR"+Out.NL); - - for (int i=0; i < numStates; i++) { - if ( isFinal[i] ) { - result.append(i); - result.append(" [shape = doublecircle]"); - result.append(Out.NL); - } - } - - for (int i=0; i < numStates; i++) { - for (int input = 0; input < numInput; input++) { - if ( table[i][input] != null ) { - StateSetEnumerator states = table[i][input].states(); - - while (states.hasMoreElements()) { - int s = states.nextElement(); - result.append(i+" -> "+s); - result.append(" [label=\""+classes.toString(input)+"\"]"+Out.NL); - } - } - } - if ( epsilon[i] != null ) { - StateSetEnumerator states = epsilon[i].states(); - while (states.hasMoreElements()) { - int s = states.nextElement(); - result.append(i+" -> "+s+" [style=dotted]"+Out.NL); - } - } - } - - result.append("}"+Out.NL); - - return result.toString(); - } - - - //----------------------------------------------------------------------- - // Functions for constructing NFAs out of regular expressions. - - private void insertLetterNFA(boolean caseless, char letter, int start, int end) { - if (caseless) { - int lower = classes.getClassCode(Character.toLowerCase(letter)); - int upper = classes.getClassCode(Character.toUpperCase(letter)); - addTransition(start, lower, end); - if (upper != lower) addTransition(start, upper, end); - } - else { - addTransition(start, classes.getClassCode(letter), end); - } - } - - private IntPair insertStringNFA(boolean caseless, String letters) { - int start = numStates; - int i; - - for (i = 0; i < letters.length(); i++) { - if (caseless) { - char c = letters.charAt(i); - int lower = classes.getClassCode(Character.toLowerCase(c)); - int upper = classes.getClassCode(Character.toUpperCase(c)); - addTransition(i+start, lower, i+start+1); - if (upper != lower) addTransition(i+start, upper, i+start+1); - } - else { - addTransition(i+start, classes.getClassCode(letters.charAt(i)), i+start+1); - } - } - - return new IntPair(start, i+start); - } - - - private void insertClassNFA(Vector intervalls, int start, int end) { - // empty char class is ok: - if (intervalls == null) return; - - int [] cl = classes.getClassCodes(intervalls); - for (int i = 0; i < cl.length; i++) - addTransition(start, cl[i], end); - } - - private void insertNotClassNFA(Vector intervalls, int start, int end) { - int [] cl = classes.getNotClassCodes(intervalls); - - for (int i = 0; i < cl.length; i++) - addTransition(start, cl[i], end); - } - - - /** - * Constructs an NFA accepting the complement of the language - * of a given NFA. - * - * Converts the NFA into a DFA, then negates that DFA. - * Exponential state blowup possible and common. - * - * @param the NFA to construct the complement for. - * - * @return a pair of integers denoting the index of start - * and end state of the complement NFA. - */ - private IntPair complement(IntPair nfa) { - - if (Options.DEBUG) { - Out.debug("complement for "+nfa); - Out.debug("NFA is :"+Out.NL+this); - } - - int dfaStart = nfa.end+1; - - // FIXME: only need epsilon closure of states reachable from nfa.start - epsilonFill(); - - Hashtable dfaStates = new Hashtable(numStates); - Vector dfaVector = new Vector(numStates); - - int numDFAStates = 0; - int currentDFAState = 0; - - StateSet currentState, newState; - - newState = epsilon[nfa.start]; - dfaStates.put(newState, new Integer(numDFAStates)); - dfaVector.addElement(newState); - - if (Options.DEBUG) - Out.debug("pos DFA start state is :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector); - - currentDFAState = 0; - - while ( currentDFAState <= numDFAStates ) { - - currentState = (StateSet) dfaVector.elementAt(currentDFAState); - - for (char input = 0; input < numInput; input++) { - newState = DFAEdge(currentState, input); - - if ( newState.containsElements() ) { - - // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState); - - // Out.debug("Looking for state set "+newState); - Integer nextDFAState = (Integer) dfaStates.get(newState); - - if ( nextDFAState != null ) { - // Out.debug("FOUND!"); - addTransition(dfaStart+currentDFAState, input, dfaStart+nextDFAState.intValue()); - } - else { - if (Options.dump) Out.print("+"); - // Out.debug("NOT FOUND!"); - // Out.debug("Table was "+dfaStates); - numDFAStates++; - - dfaStates.put(newState, new Integer(numDFAStates)); - dfaVector.addElement(newState); - - addTransition(dfaStart+currentDFAState, input, dfaStart+numDFAStates); - } - } - } - - currentDFAState++; - } - - // We have a dfa accepting the positive regexp. - - // Now the complement: - if (Options.DEBUG) - Out.debug("dfa finished, nfa is now :"+Out.NL+this); - - int start = dfaStart+numDFAStates+1; - int error = dfaStart+numDFAStates+2; - int end = dfaStart+numDFAStates+3; - - addEpsilonTransition(start, dfaStart); - - for (int i = 0; i < numInput; i++) - addTransition(error, i, error); - - addEpsilonTransition(error, end); - - for (int s = 0; s <= numDFAStates; s++) { - currentState = (StateSet) dfaVector.elementAt(s); - - currentDFAState = dfaStart+s; - - // if it was not a final state, it is now in the complement - if (!currentState.isElement(nfa.end)) - addEpsilonTransition(currentDFAState, end); - - // all inputs not present (formerly leading to an implicit error) - // now lead to an explicit (final) state accepting everything. - for (int i = 0; i < numInput; i++) - if (table[currentDFAState][i] == null) - addTransition(currentDFAState, i, error); - } - - // eliminate transitions leading to dead states - if (live == null || live.length < numStates) { - live = new boolean [2*numStates]; - visited = new boolean [2*numStates]; - } - - removeDead(dfaStart, end); - - if (Options.DEBUG) - Out.debug("complement finished, nfa ("+start+","+end+") is now :"+this); - - return new IntPair(start, end); - } - - // "global" data for use in method removeDead only: - // live[s] == false <=> no final state can be reached from s - private boolean [] live; // = new boolean [estSize]; - private boolean [] visited; // = new boolean [estSize]; - - private void removeDead(int start, int end) { - // Out.debug("removeDead ("+start+")"); - - if ( visited[start] || live[start] ) return; - visited[start] = true; - - // Out.debug("not yet visited"); - - if (closure(start).isElement(end)) - live[start] = true; - - // Out.debug("is final :"+live[start]); - - for (int i = 0; i < numInput; i++) { - StateSet nextState = closure(table[start][i]); - StateSetEnumerator states = nextState.states(); - while (states.hasMoreElements()) { - int next = states.nextElement(); - - if (next != start) { - removeDead(next,end); - - if (live[next]) - live[start] = true; - else - table[start][i] = null; - } - } - } - - StateSet nextState = closure(epsilon[start]); - StateSetEnumerator states = nextState.states(); - while (states.hasMoreElements()) { - int next = states.nextElement(); - - if (next != start) { - removeDead(next,end); - - if (live[next]) - live[start] = true; - } - } - - // Out.debug("state "+start+" is live :"+live[start]); - } - - - /** - * Constructs a two state NFA for char class regexps, - * such that the NFA has - * - * exactly one start state, - * exactly one end state, - * no transitions leading out of the end state - * no transitions leading into the start state - * - * Assumes that regExp.isCharClass(macros) == true - * - * @param regExp the regular expression to construct the - * NFA for - * - * @return a pair of integers denoting the index of start - * and end state of the NFA. - */ - private void insertCCLNFA(RegExp regExp, int start, int end) { - switch (regExp.type) { - - case sym.BAR: - RegExp2 r = (RegExp2) regExp; - insertCCLNFA(r.r1, start, end); - insertCCLNFA(r.r2, start, end); - return; - - case sym.CCLASS: - insertClassNFA( (Vector) ((RegExp1) regExp).content, start, end); - return; - - case sym.CCLASSNOT: - insertNotClassNFA( (Vector) ((RegExp1) regExp).content, start, end); - return; - - case sym.CHAR: - insertLetterNFA( - false, ((Character) ((RegExp1) regExp).content).charValue(), - start, end); - return; - - case sym.CHAR_I: - insertLetterNFA( - true, ((Character) ((RegExp1) regExp).content).charValue(), - start, end); - return; - - case sym.MACROUSE: - insertCCLNFA(macros.getDefinition((String) ((RegExp1) regExp).content), - start, end); - return; - } - - throw new Error("Unknown expression type "+regExp.type+" in NFA construction"); - } - - - /** - * Constructs an NFA for regExp such that the NFA has - * - * exactly one start state, - * exactly one end state, - * no transitions leading out of the end state - * no transitions leading into the start state - * - * @param regExp the regular expression to construct the - * NFA for - * - * @return a pair of integers denoting the index of start - * and end state of the NFA. - */ - public IntPair insertNFA(RegExp regExp) { - - IntPair nfa1, nfa2; - int start, end; - RegExp2 r; - - if (Options.DEBUG) - Out.debug("Inserting RegExp : "+regExp); - - if (regExp.isCharClass(macros)) { - start = numStates; - end = numStates+1; - - ensureCapacity(end+1); - if (end+1 > numStates) numStates = end+1; - - insertCCLNFA(regExp, start, end); - - return new IntPair(start, end); - } - - switch (regExp.type) { - - case sym.BAR: - - r = (RegExp2) regExp; - - nfa1 = insertNFA(r.r1); - nfa2 = insertNFA(r.r2); - - start = nfa2.end+1; - end = nfa2.end+2; - - addEpsilonTransition(start, nfa1.start); - addEpsilonTransition(start, nfa2.start); - addEpsilonTransition(nfa1.end, end); - addEpsilonTransition(nfa2.end, end); - - return new IntPair(start, end); - - case sym.CONCAT: - - r = (RegExp2) regExp; - - nfa1 = insertNFA(r.r1); - nfa2 = insertNFA(r.r2); - - addEpsilonTransition(nfa1.end, nfa2.start); - - return new IntPair(nfa1.start, nfa2.end); - - case sym.STAR: - nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); - - start = nfa1.end+1; - end = nfa1.end+2; - - addEpsilonTransition(nfa1.end, end); - addEpsilonTransition(start, nfa1.start); - - addEpsilonTransition(start, end); - addEpsilonTransition(nfa1.end, nfa1.start); - - return new IntPair(start, end); - - case sym.PLUS: - nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); - - start = nfa1.end+1; - end = nfa1.end+2; - - addEpsilonTransition(nfa1.end, end); - addEpsilonTransition(start, nfa1.start); - - addEpsilonTransition(nfa1.end, nfa1.start); - - return new IntPair(start, end); - - case sym.QUESTION: - nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); - - addEpsilonTransition(nfa1.start, nfa1.end); - - return new IntPair(nfa1.start, nfa1.end); - - case sym.BANG: - return complement(insertNFA((RegExp) ((RegExp1) regExp).content)); - - case sym.TILDE: - return insertNFA(regExp.resolveTilde(macros)); - - case sym.STRING: - return insertStringNFA(false, (String) ((RegExp1) regExp).content ); - - case sym.STRING_I: - return insertStringNFA(true, (String) ((RegExp1) regExp).content ); - - case sym.MACROUSE: - return insertNFA(macros.getDefinition((String) ((RegExp1) regExp).content)); - } - - throw new Error("Unknown expression type "+regExp.type+" in NFA construction"); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Options.java b/tools/lexer/jflex-1.4/src/JFlex/Options.java deleted file mode 100644 index 88590de49154..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Options.java +++ /dev/null @@ -1,135 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.io.File; - -/** - * Collects all global JFlex options. Can be set from command line parser, - * ant taks, gui, etc. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class Options { - - /** If true, additional verbose debug information is produced - * This is a compile time option */ - public final static boolean DEBUG = false; - - /** code generation method: maximum packing */ - final public static int PACK = 0; - /** code generation method: traditional */ - final public static int TABLE = 1; - /** code generation method: switch statement */ - final public static int SWITCH = 2; - - - /** output directory */ - private static File directory; - /** strict JLex compatibility */ - public static boolean jlex; - /** don't run minimization algorithm if this is true */ - public static boolean no_minimize; - /** don't write backup files if this is true */ - public static boolean no_backup; - /** use charAt function for accessing the zzBuffer */ - public static boolean char_at; - - /** use charAt function for accessing the zzBuffer and [] for zzBufferArray */ - public static boolean sliceAndCharAt; - - /** default code generation method */ - public static int gen_method; - /** If false, only error/warning output will be generated */ - public static boolean verbose; - /** If true, progress dots will be printed */ - public static boolean progress; - /** If true, jflex will print time statistics about the generation process */ - public static boolean time; - /** If true, jflex will write graphviz .dot files for generated automata */ - public static boolean dot; - /** If true, you will be flooded with information (e.g. dfa tables). */ - public static boolean dump; - /** If true, the generated scanner will include a constructor taking an InputStream. */ - public static boolean emitInputStreamCtor; - - static { setDefaults(); } - - - /** - * @return the output directory - */ - public static File getDir() { - return directory; - } - - /** - * Set output directory - * - * @param dirName the name of the directory to write output files to - */ - public static void setDir(String dirName) { - setDir(new File(dirName)); - } - - - /** - * Set output directory - * - * @param d the directory to write output files to - */ - public static void setDir(File d) { - if ( d.isFile() ) { - Out.error("Error: \""+d+"\" is not a directory."); - throw new GeneratorException(); - } - - if ( !d.isDirectory() && !d.mkdirs() ) { - Out.error("Error: couldn't create directory \""+d+"\""); - throw new GeneratorException(); - } - - directory = d; - } - - /** - * Sets all options back to default values. - */ - public static void setDefaults() { - directory = null; - jlex = false; - no_minimize = false; - no_backup = false; - gen_method = Options.PACK; - verbose = true; - progress = true; - time = false; - dot = false; - dump = false; - emitInputStreamCtor = false; - Skeleton.readDefault(); - } - - public static void setSkeleton(File skel) { - Skeleton.readSkelFile(skel); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Out.java b/tools/lexer/jflex-1.4/src/JFlex/Out.java deleted file mode 100644 index 2ea57ba79f02..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Out.java +++ /dev/null @@ -1,461 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -import java.io.*; -import java.awt.TextArea; - - -/** - * In this class all output to the java console is filtered. - * - * Use the switches verbose, time and DUMP at compile time to determine - * the verbosity of JFlex output. There is no switch for - * suppressing error messages. verbose and time can be overridden - * by command line paramters. - * - * Redirects output to a TextArea in GUI mode. - * - * Counts error and warning messages. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class Out { - - /** platform dependent newline sequence */ - public static final String NL = System.getProperty("line.separator"); - - /** count total warnings */ - private static int warnings; - - /** count total errors */ - private static int errors; - - /** output device */ - private static StdOutWriter out = new StdOutWriter(); - - - /** - * Switches to GUI mode if text is not null - * - * @param text the message TextArea of the JFlex GUI - */ - public static void setGUIMode(TextArea text) { - out.setGUIMode(text); - } - - /** - * Sets a new output stream and switches to non-gui mode. - * - * @param stream the new output stream - */ - public static void setOutputStream(OutputStream stream) { - out = new StdOutWriter(stream); - out.setGUIMode(null); - } - - /** - * Report time statistic data. - * - * @param message the message to be printed - * @param time elapsed time - */ - public static void time(ErrorMessages message, Timer time) { - if (Options.time) { - String msg = ErrorMessages.get(message, time.toString()); - out.println(msg); - } - } - - /** - * Report time statistic data. - * - * @param message the message to be printed - */ - public static void time(String message) { - if (Options.time) { - out.println(message); - } - } - - /** - * Report generation progress. - * - * @param message the message to be printed - */ - public static void println(String message) { - if (Options.verbose) - out.println(message); - } - - /** - * Report generation progress. - * - * @param message the message to be printed - * @param data data to be inserted into the message - */ - public static void println(ErrorMessages message, String data) { - if (Options.verbose) { - out.println(ErrorMessages.get(message,data)); - } - } - - /** - * Report generation progress. - * - * @param message the message to be printed - * @param data data to be inserted into the message - */ - public static void println(ErrorMessages message, int data) { - if (Options.verbose) { - out.println(ErrorMessages.get(message,data)); - } - } - - /** - * Report generation progress. - * - * @param message the message to be printed - */ - public static void print(String message) { - if (Options.verbose) out.print(message); - } - - /** - * Dump debug information to System.out - * - * Use like this - * - * if (Out.DEBUG) Out.debug(message) - * - * to save performance during normal operation (when DEBUG - * is turned off). - */ - public static void debug(String message) { - if (Options.DEBUG) System.out.println(message); - } - - - /** - * All parts of JFlex, that want to provide dump information - * should use this method for their output. - * - * @message the message to be printed - */ - public static void dump(String message) { - if (Options.dump) out.println(message); - } - - - /** - * All parts of JFlex, that want to report error messages - * should use this method for their output. - * - * @message the message to be printed - */ - private static void err(String message) { - out.println(message); - } - - - /** - * throws a GeneratorException if there are any errors recorded - */ - public static void checkErrors() { - if (errors > 0) throw new GeneratorException(); - } - - - /** - * print error and warning statistics - */ - public static void statistics() { - StringBuffer line = new StringBuffer(errors+" error"); - if (errors != 1) line.append("s"); - - line.append(", "+warnings+" warning"); - if (warnings != 1) line.append("s"); - - line.append("."); - err(line.toString()); - } - - - /** - * reset error and warning counters - */ - public static void resetCounters() { - errors = 0; - warnings = 0; - } - - - /** - * print a warning without position information - * - * @param message the warning message - */ - public static void warning(String message) { - warnings++; - - err(NL+"Warning : "+message); - } - - - /** - * print a warning with line information - * - * @param message code of the warning message - * @param line the line information - * - * @see ErrorMessages - */ - public static void warning(ErrorMessages message, int line) { - warnings++; - - String msg = NL+"Warning"; - if (line > 0) msg = msg+" in line "+(line+1); - - err(msg+": "+ErrorMessages.get(message)); - } - - - /** - * print warning message with location information - * - * @param file the file the warning is issued for - * @param message the code of the message to print - * @param line the line number of the position - * @param column the column of the position - */ - public static void warning(File file, ErrorMessages message, int line, int column) { - - String msg = NL+"Warning"; - if (file != null) msg += " in file \""+file+"\""; - if (line >= 0) msg = msg+" (line "+(line+1)+")"; - - try { - err(msg+": "+NL+ErrorMessages.get(message)); - } - catch (ArrayIndexOutOfBoundsException e) { - err(msg); - } - - warnings++; - - if (line >= 0) { - if (column >= 0) - showPosition(file, line, column); - else - showPosition(file, line); - } - } - - - /** - * print error message (string) - * - * @param message the message to print - */ - public static void error(String message) { - errors++; - err(NL+message); - } - - - /** - * print error message (code) - * - * @param message the code of the error message - * - * @see ErrorMessages - */ - public static void error(ErrorMessages message) { - errors++; - err(NL+"Error: "+ErrorMessages.get(message) ); - } - - - /** - * print error message with data - * - * @param data data to insert into the message - * @param message the code of the error message - * - * @see ErrorMessages - */ - public static void error(ErrorMessages message, String data) { - errors++; - err(NL+"Error: "+ ErrorMessages.get(message,data)); - } - - - /** - * IO error message for a file (displays file - * name in parentheses). - * - * @param message the code of the error message - * @param file the file it occurred for - */ - public static void error(ErrorMessages message, File file) { - errors++; - err(NL+"Error: "+ErrorMessages.get(message)+" ("+file+")"); - } - - - /** - * print error message with location information - * - * @param file the file the error occurred for - * @param message the code of the error message to print - * @param line the line number of error position - * @param column the column of error position - */ - public static void error(File file, ErrorMessages message, int line, int column) { - - String msg = NL+"Error"; - if (file != null) msg += " in file \""+file+"\""; - if (line >= 0) msg = msg+" (line "+(line+1)+")"; - - try { - err(msg+": "+NL+ErrorMessages.get(message)); - } - catch (ArrayIndexOutOfBoundsException e) { - err(msg); - } - - errors++; - - if (line >= 0) { - if (column >= 0) - showPosition(file, line, column); - else - showPosition(file, line); - } - } - - - /** - * prints a line of a file with marked position. - * - * @param file the file of which to show the line - * @param line the line to show - * @param column the column in which to show the marker - */ - public static void showPosition(File file, int line, int column) { - try { - String ln = getLine(file, line); - if (ln != null) { - err( ln ); - - if (column < 0) return; - - String t = "^"; - for (int i = 0; i < column; i++) t = " "+t; - - err(t); - } - } - catch (IOException e) { - /* silently ignore IO errors, don't show anything */ - } - } - - - /** - * print a line of a file - * - * @param file the file to show - * @param line the line number - */ - public static void showPosition(File file, int line) { - try { - String ln = getLine(file, line); - if (ln != null) err(ln); - } - catch (IOException e) { - /* silently ignore IO errors, don't show anything */ - } - } - - - /** - * get one line from a file - * - * @param file the file to read - * @param line the line number to get - * - * @throw IOException if any error occurs - */ - private static String getLine(File file, int line) throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(file)); - - String msg = ""; - - for (int i = 0; i <= line; i++) - msg = reader.readLine(); - - reader.close(); - - return msg; - } - - - /** - * Print system information (e.g. in case of unexpected exceptions) - */ - public static void printSystemInfo() { - err("Java version: "+System.getProperty("java.version")); - err("Runtime name: "+System.getProperty("java.runtime.name")); - err("Vendor: "+System.getProperty("java.vendor")); - err("VM version: "+System.getProperty("java.vm.version")); - err("VM vendor: "+System.getProperty("java.vm.vendor")); - err("VM name: "+System.getProperty("java.vm.name")); - err("VM info: "+System.getProperty("java.vm.info")); - err("OS name: "+System.getProperty("os.name")); - err("OS arch: "+System.getProperty("os.arch")); - err("OS version: "+System.getProperty("os.version")); - err("Encoding: "+System.getProperty("file.encoding")); - err("JFlex version: "+Main.version); - } - - - /** - * Request a bug report for an unexpected Exception/Error. - */ - public static void requestBugReport(Error e) { - err("An unexpected error occurred. Please send a report of this to"); - err(" and include the following information:"); - err(""); - printSystemInfo(); - err("Exception:"); - e.printStackTrace(out); - err(""); - err("Please also include a specification (as small as possible)"); - err("that triggers this error. You may also want to check at"); - err("http://www.jflex.de if there is a newer version available"); - err("that doesn't have this problem"); - err(""); - err("Thanks for your support."); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/PackEmitter.java b/tools/lexer/jflex-1.4/src/JFlex/PackEmitter.java deleted file mode 100644 index c856f259628c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/PackEmitter.java +++ /dev/null @@ -1,230 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * jflex 1.4 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Encodes int arrays as strings. - * - * Also splits up strings when longer than 64K in UTF8 encoding. - * Subclasses emit unpacking code. - * - * Usage protocol: - * p.emitInit();
- * for each data: p.emitData(data);
- * p.emitUnpack(); - * - * @author Gerwin Klein - * @version $Revision$, $Date$ - */ -public abstract class PackEmitter { - - /** name of the generated array (mixed case, no yy prefix) */ - protected String name; - - /** current UTF8 length of generated string in current chunk */ - private int UTF8Length; - - /** position in the current line */ - private int linepos; - - /** max number of entries per line */ - private static final int maxEntries = 16; - - /** output buffer */ - protected StringBuffer out = new StringBuffer(); - - /** number of existing string chunks */ - protected int chunks; - - /** maximum size of chunks */ - // String constants are stored as UTF8 with 2 bytes length - // field in class files. One Unicode char can be up to 3 - // UTF8 bytes. 64K max and two chars safety. - private static final int maxSize = 0xFFFF-6; - - /** indent for string lines */ - private static final String indent = " "; - - /** - * Create new emitter for an array. - * - * @param name the name of the generated array - */ - public PackEmitter(String name) { - this.name = name; - } - - /** - * Convert array name into all uppercase internal scanner - * constant name. - * - * @return name as a internal constant name. - * @see PackEmitter#name - */ - protected String constName() { - return "ZZ_" + name.toUpperCase(); - } - - /** - * Return current output buffer. - */ - public String toString() { - return out.toString(); - } - - /** - * Emit declaration of decoded member and open first chunk. - */ - public void emitInit() { - out.append(" private static final int [] "); - out.append(constName()); - out.append(" = zzUnpack"); - out.append(name); - out.append("();"); - nl(); - nextChunk(); - } - - /** - * Emit single unicode character. - * - * Updates length, position, etc. - * - * @param i the character to emit. - * @prec 0 <= i <= 0xFFFF - */ - public void emitUC(int i) { - if (i < 0 || i > 0xFFFF) - throw new IllegalArgumentException("character value expected"); - - // cast ok because of prec - char c = (char) i; - - printUC(c); - UTF8Length += UTF8Length(c); - linepos++; - } - - /** - * Execute line/chunk break if necessary. - * Leave space for at least two chars. - */ - public void breaks() { - if (UTF8Length >= maxSize) { - // close current chunk - out.append("\";"); - nl(); - - nextChunk(); - } - else { - if (linepos >= maxEntries) { - // line break - out.append("\"+"); - nl(); - out.append(indent); - out.append("\""); - linepos = 0; - } - } - } - - /** - * Emit the unpacking code. - */ - public abstract void emitUnpack(); - - /** - * emit next chunk - */ - private void nextChunk() { - nl(); - out.append(" private static final String "); - out.append(constName()); - out.append("_PACKED_"); - out.append(chunks); - out.append(" ="); - nl(); - out.append(indent); - out.append("\""); - - UTF8Length = 0; - linepos = 0; - chunks++; - } - - /** - * emit newline - */ - protected void nl() { - out.append(Out.NL); - } - - /** - * Append a unicode/octal escaped character - * to out buffer. - * - * @param c the character to append - */ - private void printUC(char c) { - if (c > 255) { - out.append("\\u"); - if (c < 0x1000) out.append("0"); - out.append(Integer.toHexString(c)); - } - else { - out.append("\\"); - out.append(Integer.toOctalString(c)); - } - } - - /** - * Calculates the number of bytes a Unicode character - * would have in UTF8 representation in a class file. - * - * @param value the char code of the Unicode character - * @prec 0 <= value <= 0xFFFF - * - * @return length of UTF8 representation. - */ - private int UTF8Length(char value) { - // if (value < 0 || value > 0xFFFF) throw new Error("not a char value ("+value+")"); - - // see JVM spec section 4.4.7, p 111 - if (value == 0) return 2; - if (value <= 0x7F) return 1; - - // workaround for javac bug (up to jdk 1.3): - if (value < 0x0400) return 2; - if (value <= 0x07FF) return 3; - - // correct would be: - // if (value <= 0x7FF) return 2; - return 3; - } - - // convenience - protected void println(String s) { - out.append(s); - nl(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/RegExp.java b/tools/lexer/jflex-1.4/src/JFlex/RegExp.java deleted file mode 100644 index db862f67be52..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/RegExp.java +++ /dev/null @@ -1,332 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.util.Vector; - -/** - * Stores a regular expression of rules section in a JFlex-specification. - * - * This base class has no content other than its type. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class RegExp { - - /** - * The type of the regular expression. This field will be - * filled with values from class sym.java (generated by cup) - */ - int type; - - - /** - * Create a new regular expression of the specified type. - * - * @param type a value from the cup generated class sym. - * - * @see JFlex.sym - */ - public RegExp(int type) { - this.type = type; - } - - - - /** - * Returns a String-representation of this regular expression - * with the specified indentation. - * - * @param tab a String that should contain only space characters and - * that is inserted in front of standard String-representation - * pf this object. - */ - public String print(String tab) { - return tab+toString(); - } - - - /** - * Returns a String-representation of this regular expression - */ - public String toString() { - return "type = "+type; - } - - - /** - * Find out if this regexp is a char class or equivalent to one. - * - * @param macros for macro expansion - * @return true if the regexp is equivalent to a char class. - */ - public boolean isCharClass(Macros macros) { - RegExp1 unary; - RegExp2 binary; - - switch (type) { - case sym.CHAR: - case sym.CHAR_I: - case sym.CCLASS: - case sym.CCLASSNOT: - return true; - - case sym.BAR: - binary = (RegExp2) this; - return binary.r1.isCharClass(macros) && binary.r2.isCharClass(macros); - - case sym.MACROUSE: - unary = (RegExp1) this; - return macros.getDefinition((String) unary.content).isCharClass(macros); - - default: return false; - } - } - - /** - * The approximate number of NFA states this expression will need (only - * works correctly after macro expansion and without negation) - * - * @param macros macro table for expansion - */ - public int size(Macros macros) { - RegExp1 unary; - RegExp2 binary; - RegExp content; - - switch ( type ) { - case sym.BAR: - binary = (RegExp2) this; - return binary.r1.size(macros) + binary.r2.size(macros) + 2; - - case sym.CONCAT: - binary = (RegExp2) this; - return binary.r1.size(macros) + binary.r2.size(macros); - - case sym.STAR: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return content.size(macros) + 2; - - case sym.PLUS: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return content.size(macros) + 2; - - case sym.QUESTION: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return content.size(macros); - - case sym.BANG: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return content.size(macros) * content.size(macros); - // this is only a very rough estimate (worst case 2^n) - // exact size too complicated (propably requires construction) - - case sym.TILDE: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return content.size(macros) * content.size(macros) * 3; - // see sym.BANG - - case sym.STRING: - case sym.STRING_I: - unary = (RegExp1) this; - return ((String) unary.content).length()+1; - - case sym.CHAR: - case sym.CHAR_I: - return 2; - - case sym.CCLASS: - case sym.CCLASSNOT: - return 2; - - case sym.MACROUSE: - unary = (RegExp1) this; - return macros.getDefinition((String) unary.content).size(macros); - } - - throw new Error("unknown regexp type "+type); - } - - /** - * @return the reverse of the specified string. - */ - public final static String revString(String s) { - StringBuffer b = new StringBuffer(s.length()); - for (int i=s.length()-1; i >= 0; i--) { - b.append(s.charAt(i)); - } - return b.toString(); - } - - /** - * Recursively convert tilde (upto) expressions into negation and star. - * - * @param macros the macro table for expansion. - * @return new RegExp equivalent to the current one, but without upto expressions. - */ - public final RegExp resolveTilde(Macros macros) { - RegExp1 unary; - RegExp2 binary; - RegExp content; - - switch ( type ) { - case sym.BAR: - binary = (RegExp2) this; - return new RegExp2(sym.BAR, binary.r1.resolveTilde(macros), - binary.r2.resolveTilde(macros)); - - case sym.CONCAT: - binary = (RegExp2) this; - return new RegExp2(sym.CONCAT, binary.r1.resolveTilde(macros), - binary.r2.resolveTilde(macros)); - - case sym.STAR: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.STAR, content.resolveTilde(macros)); - - case sym.PLUS: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.PLUS, content.resolveTilde(macros)); - - case sym.QUESTION: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.QUESTION, content.resolveTilde(macros)); - - case sym.BANG: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.BANG, content.resolveTilde(macros)); - - case sym.TILDE: - // ~a = !([^]* a [^]*) a - // uses subexpression sharing - unary = (RegExp1) this; - content = ((RegExp) unary.content).resolveTilde(macros); - - RegExp any_star = new RegExp1(sym.STAR, anyChar()); - RegExp neg = new RegExp1(sym.BANG, - new RegExp2(sym.CONCAT, any_star, - new RegExp2(sym.CONCAT, content, any_star))); - - return new RegExp2(sym.CONCAT, neg, content); - - case sym.STRING: - case sym.STRING_I: - case sym.CHAR: - case sym.CHAR_I: - case sym.CCLASS: - case sym.CCLASSNOT: - unary = (RegExp1) this; - return new RegExp1(unary.type, unary.content); - - case sym.MACROUSE: - unary = (RegExp1) this; - return macros.getDefinition((String) unary.content).resolveTilde(macros); - } - - throw new Error("unknown regexp type "+type); - } - - - /** - * Returns a regexp that matches any character: [^] - * @return the regexp for [^] - */ - public RegExp anyChar() { - // FIXME: there is some code duplication here with the parser - Vector list = new Vector(); - list.addElement(new Interval((char)0,CharClasses.maxChar)); - return new RegExp1(sym.CCLASS,list); - } - - - /** - * Create a new regexp that matches the reverse text of this one. - * - * @return the reverse regexp - */ - public final RegExp rev(Macros macros) { - RegExp1 unary; - RegExp2 binary; - RegExp content; - - switch ( type ) { - case sym.BAR: - binary = (RegExp2) this; - return new RegExp2(sym.BAR, binary.r1.rev(macros), binary.r2.rev(macros)); - - case sym.CONCAT: - binary = (RegExp2) this; - return new RegExp2(sym.CONCAT, binary.r2.rev(macros), binary.r1.rev(macros)); - - case sym.STAR: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.STAR, content.rev(macros)); - - case sym.PLUS: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.PLUS, content.rev(macros)); - - case sym.QUESTION: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.QUESTION, content.rev(macros)); - - case sym.BANG: - unary = (RegExp1) this; - content = (RegExp) unary.content; - return new RegExp1(sym.BANG, content.rev(macros)); - - case sym.TILDE: - content = resolveTilde(macros); - return content.rev(macros); - - case sym.STRING: - case sym.STRING_I: - unary = (RegExp1) this; - return new RegExp1(unary.type, revString((String) unary.content)); - - case sym.CHAR: - case sym.CHAR_I: - case sym.CCLASS: - case sym.CCLASSNOT: - unary = (RegExp1) this; - return new RegExp1(unary.type, unary.content); - - case sym.MACROUSE: - unary = (RegExp1) this; - return macros.getDefinition((String) unary.content).rev(macros); - } - - throw new Error("unknown regexp type "+type); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/RegExp1.java b/tools/lexer/jflex-1.4/src/JFlex/RegExp1.java deleted file mode 100644 index 29b2c6663049..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/RegExp1.java +++ /dev/null @@ -1,80 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Stores a regular expression from the rules section of a JFlex specification. - * - * This class provides storage for one Object of content. - * It is used for all regular expressions that are constructed from one object. - * - * For instance: a* is new RegExp1(sym.STAR, new Character ('a')); - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class RegExp1 extends RegExp { - - /** - * The child of this expression node in the syntax tree of a regular expression. - */ - Object content; - - - /** - * Constructs a new regular expression with one child object. - * - * @param type a value from the cup generated class sym, defining the - * kind of this regular expression - * - * @param content the child of this expression - */ - public RegExp1(int type, Object content) { - super(type); - this.content = content; - } - - - /** - * Returns a String-representation of this regular expression - * with the specified indentation. - * - * @param tab a String that should contain only space characters and - * that is inserted in front of standard String-representation - * pf this object. - */ - public String print(String tab) { - if (content instanceof RegExp) { - return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+((RegExp)content).print(tab+" "); - } - else - return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+tab+" "+content; - } - - - /** - * Returns a String-representation of this regular expression - */ - public String toString() { - return print(""); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/RegExp2.java b/tools/lexer/jflex-1.4/src/JFlex/RegExp2.java deleted file mode 100644 index 479991f9af76..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/RegExp2.java +++ /dev/null @@ -1,50 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -/** - * Regular expression with two children (e.g. a | b) - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class RegExp2 extends RegExp { - - RegExp r1, r2; - - public RegExp2(int type, RegExp r1, RegExp r2) { - super(type); - this.r1 = r1; - this.r2 = r2; - } - - public String print(String tab) { - return tab+"type = "+type+Out.NL+tab+"child 1 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$ - r1.print(tab+" ")+Out.NL+tab+"child 2 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$ - r2.print(tab+" "); //$NON-NLS-1$ - } - - public String toString() { - return print(""); //$NON-NLS-1$ - } -} - diff --git a/tools/lexer/jflex-1.4/src/JFlex/RegExps.java b/tools/lexer/jflex-1.4/src/JFlex/RegExps.java deleted file mode 100644 index cd49a49e3a43..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/RegExps.java +++ /dev/null @@ -1,217 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -import java.util.*; - - -/** - * Stores all rules of the specification for later access in RegExp -> NFA - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class RegExps { - - /** the spec line in which a regexp is used */ - Vector /* of Integer */ lines; - - /** the lexical states in wich the regexp is used */ - Vector /* of Vector of Integer */ states; - - /** the regexp */ - Vector /* of RegExp */ regExps; - - /** the action of a regexp */ - Vector /* of Action */ actions; - - /** flag if it is a BOL regexp */ - Vector /* of Boolean */ BOL; - - /** the lookahead expression */ - Vector /* of RegExp */ look; - - /** the forward DFA entry point of the lookahead expression */ - Vector /* of Integer */ look_entry; - - /** Count of many general lookahead expressions there are. - * Need 2*gen_look_count additional DFA entry points. */ - int gen_look_count; - - public RegExps() { - states = new Vector(); - regExps = new Vector(); - actions = new Vector(); - BOL = new Vector(); - look = new Vector(); - lines = new Vector(); - look_entry = new Vector(); - } - - public int insert(int line, Vector stateList, RegExp regExp, Action action, - Boolean isBOL, RegExp lookAhead) { - if (Options.DEBUG) { - Out.debug("Inserting regular expression with statelist :"+Out.NL+stateList); //$NON-NLS-1$ - Out.debug("and action code :"+Out.NL+action.content+Out.NL); //$NON-NLS-1$ - Out.debug("expression :"+Out.NL+regExp); //$NON-NLS-1$ - } - - states.addElement(stateList); - regExps.addElement(regExp); - actions.addElement(action); - BOL.addElement(isBOL); - look.addElement(lookAhead); - lines.addElement(new Integer(line)); - look_entry.addElement(null); - - return states.size()-1; - } - - public int insert(Vector stateList, Action action) { - - if (Options.DEBUG) { - Out.debug("Inserting eofrule with statelist :"+Out.NL+stateList); //$NON-NLS-1$ - Out.debug("and action code :"+Out.NL+action.content+Out.NL); //$NON-NLS-1$ - } - - states.addElement(stateList); - regExps.addElement(null); - actions.addElement(action); - BOL.addElement(null); - look.addElement(null); - lines.addElement(null); - look_entry.addElement(null); - - return states.size()-1; - } - - public void addStates(int regNum, Vector newStates) { - Enumeration s = newStates.elements(); - - while (s.hasMoreElements()) - ((Vector)states.elementAt(regNum)).addElement(s.nextElement()); - } - - public int getNum() { - return states.size(); - } - - public boolean isBOL(int num) { - return ((Boolean) BOL.elementAt(num)).booleanValue(); - } - - public RegExp getLookAhead(int num) { - return (RegExp) look.elementAt(num); - } - - public boolean isEOF(int num) { - return BOL.elementAt(num) == null; - } - - public Vector getStates(int num) { - return (Vector) states.elementAt(num); - } - - public RegExp getRegExp(int num) { - return (RegExp) regExps.elementAt(num); - } - - public int getLine(int num) { - return ((Integer) lines.elementAt(num)).intValue(); - } - - public int getLookEntry(int num) { - return ((Integer) look_entry.elementAt(num)).intValue(); - } - - public void checkActions() { - if ( actions.elementAt(actions.size()-1) == null ) { - Out.error(ErrorMessages.NO_LAST_ACTION); - throw new GeneratorException(); - } - } - - public Action getAction(int num) { - while ( num < actions.size() && actions.elementAt(num) == null ) - num++; - - return (Action) actions.elementAt(num); - } - - public int NFASize(Macros macros) { - int size = 0; - Enumeration e = regExps.elements(); - while (e.hasMoreElements()) { - RegExp r = (RegExp) e.nextElement(); - if (r != null) size += r.size(macros); - } - e = look.elements(); - while (e.hasMoreElements()) { - RegExp r = (RegExp) e.nextElement(); - if (r != null) size += r.size(macros); - } - return size; - } - - public void checkLookAheads() { - for (int i=0; i < regExps.size(); i++) - lookAheadCase(i); - } - - /** - * Determine which case of lookahead expression regExpNum points to (if any). - * Set case data in corresponding action. - * Increment count of general lookahead expressions for entry points - * of the two additional DFAs. - * Register DFA entry point in RegExps - * - * Needs to be run before adding any regexps/rules to be able to reserve - * the correct amount of space of lookahead DFA entry points. - * - * @param regExpNum the number of the regexp in RegExps. - */ - private void lookAheadCase(int regExpNum) { - if ( getLookAhead(regExpNum) != null ) { - RegExp r1 = getRegExp(regExpNum); - RegExp r2 = getLookAhead(regExpNum); - - Action a = getAction(regExpNum); - - int len1 = SemCheck.length(r1); - int len2 = SemCheck.length(r2); - - if (len1 >= 0) { - a.setLookAction(Action.FIXED_BASE,len1); - } - else if (len2 >= 0) { - a.setLookAction(Action.FIXED_LOOK,len2); - } - else if (SemCheck.isFiniteChoice(r2)) { - a.setLookAction(Action.FINITE_CHOICE,0); - } - else { - a.setLookAction(Action.GENERAL_LOOK,0); - look_entry.setElementAt(new Integer(gen_look_count), regExpNum); - gen_look_count++; - } - } - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/ScannerException.java b/tools/lexer/jflex-1.4/src/JFlex/ScannerException.java deleted file mode 100644 index 86c99e9d56e9..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/ScannerException.java +++ /dev/null @@ -1,104 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -import java.io.File; - -/** - * This Exception could be thrown while scanning the specification - * (e.g. unmatched input) - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class ScannerException extends RuntimeException { - - public int line; - public int column; - public ErrorMessages message; - public File file; - - private ScannerException(File file, String text, ErrorMessages message, int line, int column) { - super(text); - this.file = file; - this.message = message; - this.line = line; - this.column = column; - } - - - /** - * Creates a new ScannerException with a message only. - * - * @param message the code for the error description presented to the user. - */ - public ScannerException(ErrorMessages message) { - this( null, ErrorMessages.get(message), message, -1, -1 ); - } - - /** - * Creates a new ScannerException for a file with a message only. - * - * @param file the file in which the error occured - * @param message the code for the error description presented to the user. - */ - public ScannerException(File file, ErrorMessages message) { - this( file, ErrorMessages.get(message), message, -1, -1 ); - } - - - /** - * Creates a new ScannerException with a message and line number. - * - * @param message the code for the error description presented to the user. - * @param line the number of the line in the specification that - * contains the error - */ - public ScannerException(ErrorMessages message, int line) { - this( null, ErrorMessages.get(message), message, line, -1 ); - } - - - /** - * Creates a new ScannerException for a file with a message and line number. - * - * @param message the code for the error description presented to the user. - * @param line the number of the line in the specification that - * contains the error - */ - public ScannerException(File file, ErrorMessages message, int line) { - this( file, ErrorMessages.get(message), message, line, -1 ); - } - - - /** - * Creates a new ScannerException with a message, line number and column. - * - * @param message the code for the error description presented to the user. - * @param line the number of the line in the specification that - * contains the error - * @param column the column where the error starts - */ - public ScannerException(File file, ErrorMessages message, int line, int column) { - this( file, ErrorMessages.get(message), message, line, column ); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/SemCheck.java b/tools/lexer/jflex-1.4/src/JFlex/SemCheck.java deleted file mode 100644 index 114a4d64edff..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/SemCheck.java +++ /dev/null @@ -1,227 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -import java.io.File; - -/** - * Performs simple semantic analysis on regular expressions. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class SemCheck { - - // stored globally since they are used as constants in all checks - private static Macros macros; - - /** - * Performs semantic analysis for all expressions. - * - * Currently checks for empty expressions only. - * - * @param rs the reg exps to be checked - * @param m the macro table (in expanded form) - * @param f the spec file containing the rules - */ - public static void check(RegExps rs, Macros m, File f) { - macros = m; - int num = rs.getNum(); - for (int i = 0; i < num; i++) { - RegExp r = rs.getRegExp(i); - RegExp l = rs.getLookAhead(i); - Action a = rs.getAction(i); - - if (r != null && l != null && maybeEmtpy(r)) { - if (a == null) - Out.error(ErrorMessages.EMPTY_MATCH, ""); - else - Out.error(f, ErrorMessages.EMPTY_MATCH, a.priority-1, -1); - } - } - } - - - /** - * Checks if the expression potentially matches the empty string. - * - */ - public static boolean maybeEmtpy(RegExp re) { - RegExp2 r; - - switch (re.type) { - - case sym.BAR: { - r = (RegExp2) re; - return maybeEmtpy(r.r1) || maybeEmtpy(r.r2); - } - - case sym.CONCAT: { - r = (RegExp2) re; - return maybeEmtpy(r.r1) && maybeEmtpy(r.r2); - } - - case sym.STAR: - case sym.QUESTION: - return true; - - case sym.PLUS: { - RegExp1 r1 = (RegExp1) re; - return maybeEmtpy((RegExp) r1.content); - } - - case sym.CCLASS: - case sym.CCLASSNOT: - case sym.CHAR: - case sym.CHAR_I: - return false; - - case sym.STRING: - case sym.STRING_I: { - String content = (String) ((RegExp1) re).content; - return content.length() == 0; - } - - case sym.TILDE: - return false; - - case sym.BANG: { - RegExp1 r1 = (RegExp1) re; - return !maybeEmtpy((RegExp) r1.content); - } - - case sym.MACROUSE: - return maybeEmtpy(macros.getDefinition((String) ((RegExp1) re).content)); - } - - throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ - } - - /** - * Returns length if expression has fixed length, -1 otherwise. - * - * Negation operators are treated as always variable length. - */ - public static int length(RegExp re) { - RegExp2 r; - - switch (re.type) { - - case sym.BAR: { - r = (RegExp2) re; - int l1 = length(r.r1); - if (l1 < 0) return -1; - int l2 = length(r.r2); - - if (l1 == l2) - return l1; - else - return -1; - } - - case sym.CONCAT: { - r = (RegExp2) re; - int l1 = length(r.r1); - if (l1 < 0) return -1; - int l2 = length(r.r2); - if (l2 < 0) return -1; - return l1+l2; - } - - case sym.STAR: - case sym.PLUS: - case sym.QUESTION: - return -1; - - case sym.CCLASS: - case sym.CCLASSNOT: - case sym.CHAR: - case sym.CHAR_I: - return 1; - - case sym.STRING: - case sym.STRING_I: { - String content = (String) ((RegExp1) re).content; - return content.length(); - } - - case sym.TILDE: - case sym.BANG: - // too hard to calculate at this level, use safe approx - return -1; - - case sym.MACROUSE: - return length(macros.getDefinition((String) ((RegExp1) re).content)); - } - - throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ - } - - /** - * Returns true iff the expression is a finite choice of fixed length - * expressions. - * - * Negation operators are treated as always variable length. - */ - public static boolean isFiniteChoice(RegExp re) { - RegExp2 r; - - switch (re.type) { - - case sym.BAR: { - r = (RegExp2) re; - return isFiniteChoice(r.r1) && isFiniteChoice(r.r2); - } - - case sym.CONCAT: { - r = (RegExp2) re; - int l1 = length(r.r1); - if (l1 < 0) return false; - int l2 = length(r.r2); - return l2 >= 0; - } - - case sym.STAR: - case sym.PLUS: - case sym.QUESTION: - return false; - - case sym.CCLASS: - case sym.CCLASSNOT: - case sym.CHAR: - case sym.CHAR_I: - return true; - - case sym.STRING: - case sym.STRING_I: { - return true; - } - - case sym.TILDE: - case sym.BANG: - return false; - - case sym.MACROUSE: - return isFiniteChoice(macros.getDefinition((String) ((RegExp1) re).content)); - } - - throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/SilentExit.java b/tools/lexer/jflex-1.4/src/JFlex/SilentExit.java deleted file mode 100644 index b098713bca7c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/SilentExit.java +++ /dev/null @@ -1,31 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -/** - * Signals a silent exit (no statistics printout). - * - * @author Gerwin Klein - * @version $Revision$, $Date$ - */ -public class SilentExit extends Exception { - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Skeleton.java b/tools/lexer/jflex-1.4/src/JFlex/Skeleton.java deleted file mode 100644 index 6a860369b2a5..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Skeleton.java +++ /dev/null @@ -1,222 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -import java.io.*; -import java.net.URL; -import java.util.Vector; - - -/** - * This class stores the skeleton of generated scanners. - * - * The skeleton consists of several parts that can be emitted to - * a file. Usually there is a portion of generated code - * (produced in class Emitter) between every two parts of skeleton code. - * - * There is a static part (the skeleton code) and state based iterator - * part to this class. The iterator part is used to emit consecutive skeleton - * sections to some PrintWriter. - * - * @see JFlex.Emitter - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class Skeleton { - - /** location of default skeleton */ - static final private String DEFAULT_LOC = "JFlex/skeleton.default"; //$NON-NLS-1$ - - /** expected number of sections in the skeleton file */ - static final private int size = 21; - - /** platform specific newline */ - static final private String NL = System.getProperty("line.separator"); //$NON-NLS-1$ - - /** The skeleton */ - public static String line[]; - - /** initialization */ - static { readDefault(); } - - // the state based, iterator part of Skeleton: - - /** - * The current part of the skeleton (an index of nextStop[]) - */ - private int pos; - - /** - * The writer to write the skeleton-parts to - */ - private PrintWriter out; - - - /** - * Creates a new skeleton (iterator) instance. - * - * @param out the writer to write the skeleton-parts to - */ - public Skeleton(PrintWriter out) { - this.out = out; - } - - - /** - * Emits the next part of the skeleton - */ - public void emitNext() { - out.print( line[pos++] ); - } - - - /** - * Make the skeleton private. - * - * Replaces all occurences of " public " in the skeleton with " private ". - */ - public static void makePrivate() { - for (int i=0; i < line.length; i++) { - line[i] = replace(" public ", " private ", line[i]); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - - /** - * Reads an external skeleton file for later use with this class. - * - * @param skeletonFile the file to read (must be != null and readable) - */ - public static void readSkelFile(File skeletonFile) { - if (skeletonFile == null) - throw new IllegalArgumentException("Skeleton file must not be null"); //$NON-NLS-1$ - - if (!skeletonFile.isFile() || !skeletonFile.canRead()) { - Out.error(ErrorMessages.CANNOT_READ_SKEL, skeletonFile.toString()); - throw new GeneratorException(); - } - - Out.println(ErrorMessages.READING_SKEL, skeletonFile.toString()); - - try { - BufferedReader reader = new BufferedReader(new FileReader(skeletonFile)); - readSkel(reader); - } - catch (IOException e) { - Out.error(ErrorMessages.SKEL_IO_ERROR); - throw new GeneratorException(); - } - } - - - /** - * Reads an external skeleton file from a BufferedReader. - * - * @param reader the reader to read from (must be != null) - * @throws IOException if an IO error occurs - * @throws GeneratorException if the number of skeleton sections does not match - */ - public static void readSkel(BufferedReader reader) throws IOException { - Vector lines = new Vector(); - StringBuffer section = new StringBuffer(); - - String ln; - while ((ln = reader.readLine()) != null) { - if (ln.startsWith("---")) { //$NON-NLS-1$ - lines.addElement(section.toString()); - section.setLength(0); - } else { - section.append(ln); - section.append(NL); - } - } - - if (section.length() > 0) - lines.addElement(section.toString()); - - if (lines.size() != size) { - Out.error(ErrorMessages.WRONG_SKELETON); - throw new GeneratorException(); - } - - line = new String[size]; - for (int i = 0; i < size; i++) - line[i] = (String) lines.elementAt(i); - } - - /** - * Replaces a with b in c. - * - * @param a the String to be replaced - * @param b the replacement - * @param c the String in which to replace a by b - * @return a String object with a replaced by b in c - */ - public static String replace(String a, String b, String c) { - StringBuffer result = new StringBuffer(c.length()); - int i = 0; - int j = c.indexOf(a); - - while (j >= i) { - result.append(c.substring(i,j)); - result.append(b); - i = j+a.length(); - j = c.indexOf(a,i); - } - - result.append(c.substring(i,c.length())); - - return result.toString(); - } - - - /** - * (Re)load the default skeleton. Looks in the current system class path. - */ - public static void readDefault() { - ClassLoader l = Skeleton.class.getClassLoader(); - URL url; - - /* Try to load from same class loader as this class. - * Should work, but does not on OS/2 JDK 1.1.8 (see bug 1065521). - * Use system class loader in this case. - */ - if (l != null) { - url = l.getResource(DEFAULT_LOC); - } - else { - url = ClassLoader.getSystemResource(DEFAULT_LOC); - } - - if (url == null) { - Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT); - throw new GeneratorException(); - } - - try { - InputStreamReader reader = new InputStreamReader(url.openStream()); - readSkel(new BufferedReader(reader)); - } catch (IOException e) { - Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT); - throw new GeneratorException(); - } - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/StatePairList.java b/tools/lexer/jflex-1.4/src/JFlex/StatePairList.java deleted file mode 100644 index 13c4aa96fca2..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/StatePairList.java +++ /dev/null @@ -1,83 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - -/** - * A list of pairs of states. Used in DFA minimization. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class StatePairList { - - // implemented as two arrays of integers. - // java.util classes proved too inefficient. - - int p []; - int q []; - - int num; - - public StatePairList() { - p = new int [8]; - q = new int [8]; - num = 0; - } - - public void addPair(int i, int j) { - for (int x = 0; x < num; x++) - if (p[x] == i && q[x] == j) return; - - if (num >= p.length) increaseSize(num); - - p[num] = i; - q[num] = j; - - num++; - } - - public void markAll(StatePairList [] [] list, boolean [] [] equiv) { - for (int x = 0; x < num; x++) { - int i = p[x]; - int j = q[x]; - - if (equiv[i][j]) { - equiv[i][j] = false; - if (list[i][j] != null) - list[i][j].markAll(list, equiv); - } - } - } - - private void increaseSize(int length) { - length = Math.max(length+1, 4*p.length); - Out.debug("increasing length to "+length); //$NON-NLS-1$ - - int pn [] = new int[length]; - int qn [] = new int[length]; - - System.arraycopy(p, 0, pn, 0, p.length); - System.arraycopy(q, 0, qn, 0, q.length); - - p = pn; - q = qn; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/StateSet.java b/tools/lexer/jflex-1.4/src/JFlex/StateSet.java deleted file mode 100644 index 1cd1345ea86c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/StateSet.java +++ /dev/null @@ -1,334 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -/** - * A set of NFA states (= integers). - * - * Very similar to java.util.BitSet, but is faster and doesn't crash - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class StateSet { - - private final boolean DEBUG = false; - - public final static StateSet EMPTY = new StateSet(); - - - final static int BITS = 6; - final static int MASK = (1<> BITS; - if (index >= bits.length) resize(state); - bits[index] |= (1L << (state & MASK)); - - if (DEBUG) { - Out.dump("StateSet.addState("+state+") end"); //$NON-NLS-1$ //$NON-NLS-2$ - Out.dump("Set is : "+this); //$NON-NLS-1$ - } - } - - - private int size2nbits (int size) { - return ((size >> BITS) + 1); - } - - - private void resize(int size) { - int needed = size2nbits(size); - - // if (needed < bits.length) return; - - long newbits[] = new long[Math.max(bits.length*4,needed)]; - System.arraycopy(bits, 0, newbits, 0, bits.length); - - bits = newbits; - } - - - public void clear() { - int l = bits.length; - for (int i = 0; i < l; i++) bits[i] = 0; - } - - public boolean isElement(int state) { - int index = state >> BITS; - if (index >= bits.length) return false; - return (bits[index] & (1L << (state & MASK))) != 0; - } - - /** - * Returns one element of the set and removes it. - * - * Precondition: the set is not empty. - */ - public int getAndRemoveElement() { - int i = 0; - int o = 0; - long m = 1; - - while (bits[i] == 0) i++; - - while ( (bits[i] & m) == 0 ) { - m<<= 1; - o++; - } - - bits[i]&= ~m; - - return (i << BITS) + o; - } - - public void remove(int state) { - int index = state >> BITS; - if (index >= bits.length) return; - bits[index] &= ~(1L << (state & MASK)); - } - - /** - * Returns the set of elements that contained are in the specified set - * but are not contained in this set. - */ - public StateSet complement(StateSet set) { - - if (set == null) return null; - - StateSet result = new StateSet(); - - result.bits = new long[set.bits.length]; - - int i; - int m = Math.min(bits.length, set.bits.length); - - for (i = 0; i < m; i++) { - result.bits[i] = ~bits[i] & set.bits[i]; - } - - if (bits.length < set.bits.length) - System.arraycopy(set.bits, m, result.bits, m, result.bits.length-m); - - if (DEBUG) - Out.dump("Complement of "+this+Out.NL+"and "+set+Out.NL+" is :"+result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - return result; - } - - public void add(StateSet set) { - - if (DEBUG) Out.dump("StateSet.add("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$ - - if (set == null) return; - - long tbits[]; - long sbits[] = set.bits; - int sbitsl = sbits.length; - - if (bits.length < sbitsl) { - tbits = new long[sbitsl]; - System.arraycopy(bits, 0, tbits, 0, bits.length); - } - else { - tbits = this.bits; - } - - for (int i = 0; i < sbitsl; i++) { - tbits[i] |= sbits[i]; - } - - this.bits = tbits; - - if (DEBUG) { - Out.dump("StateSet.add("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$ - Out.dump("Set is : "+this); //$NON-NLS-1$ - } - } - - - - public boolean containsSet(StateSet set) { - - if (DEBUG) - Out.dump("StateSet.containsSet("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$ - - int i; - int min = Math.min(bits.length, set.bits.length); - - for (i = 0; i < min; i++) - if ( (bits[i] & set.bits[i]) != set.bits[i] ) return false; - - for (i = min; i < set.bits.length; i++) - if ( set.bits[i] != 0 ) return false; - - return true; - } - - - - /** - * @throws ClassCastException if b is not a StateSet - * @throws NullPointerException if b is null - */ - public boolean equals(Object b) { - - int i = 0; - int l1,l2; - StateSet set = (StateSet) b; - - if (DEBUG) Out.dump("StateSet.equals("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$ - - l1 = bits.length; - l2 = set.bits.length; - - if (l1 <= l2) { - while (i < l1) { - if (bits[i] != set.bits[i]) return false; - i++; - } - - while (i < l2) - if (set.bits[i++] != 0) return false; - } - else { - while (i < l2) { - if (bits[i] != set.bits[i]) return false; - i++; - } - - while (i < l1) - if (bits[i++] != 0) return false; - } - - return true; - } - - public int hashCode() { - long h = 1234; - long [] _bits = bits; - int i = bits.length-1; - - // ignore zero high bits - while (i >= 0 && _bits[i] == 0) i--; - - while (i >= 0) - h ^= _bits[i--] * i; - - return (int)((h >> 32) ^ h); - } - - - public StateSetEnumerator states() { - return new StateSetEnumerator(this); - } - - - public boolean containsElements() { - for (int i = 0; i < bits.length; i++) - if (bits[i] != 0) return true; - - return false; - } - - - public StateSet copy() { - StateSet set = new StateSet(); - set.bits = new long[bits.length]; - System.arraycopy(bits, 0, set.bits, 0, bits.length); - return set; - } - - - /** - * Copy specified StateSet into this. - * - * @param set the state set to copy. - */ - public void copy(StateSet set) { - - if (DEBUG) - Out.dump("StateSet.copy("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$ - - if (set == null) { - for (int i = 0; i < bits.length; i++) bits[i] = 0; - return; - } - - if (bits.length < set.bits.length) { - bits = new long[set.bits.length]; - } - else { - for (int i = set.bits.length; i < bits.length; i++) bits[i] = 0; - } - - System.arraycopy(set.bits, 0, bits, 0, bits.length); - - if (DEBUG) { - Out.dump("StateSet.copy("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$ - Out.dump("Set is : "+this); //$NON-NLS-1$ - } - } - - - public String toString() { - StateSetEnumerator set = states(); - - StringBuffer result = new StringBuffer("{"); //$NON-NLS-1$ - - if ( set.hasMoreElements() ) result.append(""+set.nextElement()); //$NON-NLS-1$ - - while ( set.hasMoreElements() ) { - int i = set.nextElement(); - result.append( ", "+i); //$NON-NLS-1$ - } - - result.append("}"); //$NON-NLS-1$ - - return result.toString(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/StateSetEnumerator.java b/tools/lexer/jflex-1.4/src/JFlex/StateSetEnumerator.java deleted file mode 100644 index 36188486ba72..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/StateSetEnumerator.java +++ /dev/null @@ -1,124 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -/** - * Enumerates the states of a StateSet. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class StateSetEnumerator { - - private final static boolean DEBUG = false; - - private int index; - private int offset; - private long mask; - - private long [] bits; - - /** - * creates a new StateSetEnumerator that is not yet associated - * with a StateSet. hasMoreElements() and nextElement() will - * throw NullPointerException when used before reset() - */ - public StateSetEnumerator() { - } - - public StateSetEnumerator(StateSet states) { - reset(states); - } - - public void reset(StateSet states) { - bits = states.bits; - index = 0; - offset = 0; - mask = 1; - while (index < bits.length && bits[index] == 0) - index++; - - if (index >= bits.length) return; - - while (offset <= StateSet.MASK && ((bits[index] & mask) == 0)) { - mask<<= 1; - offset++; - } - } - - private void advance() { - - if (DEBUG) Out.dump("Advancing, at start, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ - - // cache fields in local variable for faster access - int _index = this.index; - int _offset = this.offset; - long _mask = this.mask; - long [] _bits = this.bits; - - long bi = _bits[_index]; - - do { - _offset++; - _mask<<= 1; - } while (_offset <= StateSet.MASK && ((bi & _mask) == 0)); - - if (_offset > StateSet.MASK) { - int length = _bits.length; - - do - _index++; - while (_index < length && _bits[_index] == 0); - - if (_index >= length) { - this.index = length; // indicates "no more elements" - return; - } - - _offset = 0; - _mask = 1; - bi = _bits[_index]; - - // terminates, because bi != 0 - while ((bi & _mask) == 0) { - _mask<<= 1; - _offset++; - } - } - - // write back cached values - this.index = _index; - this.mask = _mask; - this.offset = _offset; - } - - public boolean hasMoreElements() { - if (DEBUG) Out.dump("hasMoreElements, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ - return index < bits.length; - } - - public int nextElement() { - if (DEBUG) Out.dump("nextElement, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ - int x = (index << StateSet.BITS) + offset; - advance(); - return x; - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/StdOutWriter.java b/tools/lexer/jflex-1.4/src/JFlex/StdOutWriter.java deleted file mode 100644 index ca747f70635c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/StdOutWriter.java +++ /dev/null @@ -1,113 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex; - - -import java.io.*; -import java.awt.TextArea; - - -/** - * Convenience class for JFlex stdout, redirects output to a TextArea - * if in GUI mode. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public final class StdOutWriter extends PrintWriter { - - /** text area to write to if in gui mode, gui mode = (text != null) */ - private TextArea text; - - /** - * approximation of the current column in the text area - * for auto wrapping at wrap characters - **/ - private int col; - - /** auto wrap lines in gui mode at this value */ - private final static int wrap = 78; - - /** A StdOutWriter, attached to System.out, no gui mode */ - public StdOutWriter() { - super(System.out,true); - } - - /** A StdOutWrite, attached to the specified output stream, no gui mode */ - public StdOutWriter(OutputStream out) { - super(out,true); - } - - /** - * Set the TextArea to write text to. Will continue - * to write to System.out if text is null. - * - * @param text the TextArea to write to - */ - public void setGUIMode(TextArea text) { - this.text = text; - } - - /** Write a single character. */ - public void write(int c) { - if (text != null) { - text.append(String.valueOf((char) c)); - if (++col > wrap) println(); - } - else - super.write(c); - } - - /** Write a portion of an array of characters. */ - public void write(char buf[], int off, int len) { - if (text != null) { - text.append(new String(buf,off,len)); - if ((col+=len) > wrap) println(); - } - else - super.write(buf, off, len); - } - - /** Write a portion of a string. */ - public void write(String s, int off, int len) { - if (text != null) { - text.append(s.substring(off,off+len)); - if ((col+=len) > wrap) println(); - } - else { - super.write(s,off,len); - flush(); - } - } - - /** - * Begin a new line. Which actual character/s is/are written - * depends on the runtime platform. - */ - public void println() { - if (text != null) { - text.append(Out.NL); - col = 0; - } - else - super.println(); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/Timer.java b/tools/lexer/jflex-1.4/src/JFlex/Timer.java deleted file mode 100644 index f8be1313cd89..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/Timer.java +++ /dev/null @@ -1,110 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex; - -/** - * Very simple timer for code generation time statistics. - * - * Not very exact, measures user time, not processor time. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class Timer { - - /* the timer stores start and stop time from currentTimeMillis() */ - private long startTime, stopTime; - - /* flag if the timer is running (if stop time is valid) */ - private boolean running; - - - /** - * Construct a new timer that starts immediatly. - */ - public Timer() { - startTime = System.currentTimeMillis(); - running = true; - } - - - /** - * Start the timer. If it is already running, the old start - * time is lost. - */ - public void start() { - startTime = System.currentTimeMillis(); - running = true; - } - - - /** - * Stop the timer. - */ - public void stop() { - stopTime = System.currentTimeMillis(); - running = false; - } - - - /** - * Return the number of milliseconds the timer has been running. - * - * (up till now, if it still runs, up to the stop time if it has been stopped) - */ - public long diff() { - if (running) - return System.currentTimeMillis()-startTime; - else - return stopTime-startTime; - } - - - /** - * Return a string representation of the timer. - * - * @return a string displaying the diff-time in readable format (h m s ms) - * - * @see Timer#diff - */ - public String toString() { - long diff = diff(); - - long millis = diff%1000; - long secs = (diff/1000)%60; - long mins = (diff/(1000*60))%60; - long hs = (diff/(1000*3600))%24; - long days = diff/(1000*3600*24); - - if (days > 0) - return days+"d "+hs+"h "+mins+"m "+secs+"s "+millis+"ms"; - - if (hs > 0) - return hs+"h "+mins+"m "+secs+"s "+millis+"ms"; - - if (mins > 0) - return mins+"m "+secs+"s "+millis+"ms"; - - if (secs > 0) - return secs+"s "+millis+"ms"; - - return millis+"ms"; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/anttask/JFlexTask.java b/tools/lexer/jflex-1.4/src/JFlex/anttask/JFlexTask.java deleted file mode 100644 index 9b34cc2e252d..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/anttask/JFlexTask.java +++ /dev/null @@ -1,266 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex Anttask * - * Copyright (C) 2001 Rafal Mantiuk * - * Copyright (C) 2003 changes by Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.anttask; - -import org.apache.tools.ant.Task; -import org.apache.tools.ant.BuildException; - -import JFlex.Main; -import JFlex.Options; - -import java.io.*; - -/** - * JFlex task class - * - * @author Rafal Mantiuk - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class JFlexTask extends Task { - private File inputFile; - - // found out by looking into .flex file - private String className = null; - private String packageName = null; - - /** for javac-like dest dir behaviour */ - private File destinationDir; - - /** the actual output directory (outputDir = destinationDir + package)) */ - private File outputDir = null; - - public JFlexTask() { - // ant default is different from the rest of JFlex - setVerbose(false); - Options.progress = false; - } - - public void execute() throws BuildException { - try { - if (inputFile == null) - throw new BuildException("Input file needed. Use "); - - if (!inputFile.canRead()) - throw new BuildException("Cannot read input file "+inputFile); - - try { - findPackageAndClass(); - normalizeOutdir(); - File destFile = new File(outputDir, className + ".java"); - - if (inputFile.lastModified() > destFile.lastModified()) { - Main.generate(inputFile); - if (!Options.verbose) - System.out.println("Generated: " + destFile.getName()); - } - } catch (IOException e1) { - throw new BuildException("IOException: " + e1.toString()); - } - } catch (JFlex.GeneratorException e) { - throw new BuildException("JFlex: generation failed!"); - } - } - - /** - * Peek into .flex file to get package and class name - * - * @throws IOException if there is a problem reading the .flex file - */ - public void findPackageAndClass() throws IOException { - // find name of the package and class in jflex source file - packageName = null; - className = null; - - LineNumberReader reader = new LineNumberReader(new FileReader(inputFile)); - - while (className == null || packageName == null) { - String line = reader.readLine(); - if (line == null) break; - - if (packageName == null) { - int index = line.indexOf("package"); - if (index >= 0) { - index += 7; - - int end = line.indexOf(';', index); - if (end >= index) { - packageName = line.substring(index, end); - packageName = packageName.trim(); - } - } - } - - if (className == null) { - int index = line.indexOf("%class"); - if (index >= 0) { - index += 6; - - className = line.substring(index); - className = className.trim(); - } - } - } - - // package name may be null, but class name not - if (className == null) className = "Yylex"; - } - - /** - * Sets the actual output directory if not already set. - * - * Uses javac logic to determine output dir = dest dir + package name - * If not destdir has been set, output dir = parent of input file - * - * Assumes that package name is already set. - */ - public void normalizeOutdir() { - if (outputDir != null) return; - - // find out what the destination directory is. Append packageName to dest dir. - File destDir; - - // this is not the default the jflex logic, but javac-like - if (destinationDir != null) { - if (packageName == null) { - destDir = destinationDir; - } - else { - String path = packageName.replace('.', File.separatorChar); - destDir = new File(destinationDir,path); - } - } else { //save parser to the same dir as .flex - destDir = new File(inputFile.getParent()); - } - - setOutdir(destDir); - } - - /** - * @return package name of input file - * - * @see JFlexTask.findPackageAndClass - */ - public String getPackage() { - return packageName; - } - - /** - * @return class name of input file - * - * @see JFlexTask.findPackageAndClass - */ - public String getClassName() { - return className; - } - - public void setDestdir(File destinationDir) { - this.destinationDir = destinationDir; - } - - public void setOutdir(File outDir) { - this.outputDir = outDir; - Options.setDir(outputDir); - } - - public void setFile(File file) { - this.inputFile = file; - } - - public void setGenerateDot(boolean genDot) { - setDot(genDot); - } - - public void setTimeStatistics(boolean displayTime) { - Options.time = displayTime; - } - - public void setTime(boolean displayTime) { - setTimeStatistics(displayTime); - } - - public void setVerbose(boolean verbose) { - Options.verbose = verbose; - } - - public void setSkeleton(File skeleton) { - Options.setSkeleton(skeleton); - } - - public void setSkel(File skeleton) { - setSkeleton(skeleton); - } - - public void setSkipMinimization(boolean skipMin) { - setNomin(skipMin); - } - - public void setNomin(boolean b) { - Options.no_minimize = b; - } - - public void setNobak(boolean b) { - Options.no_backup = b; - } - - public void setSwitch(boolean b) { - if (b) { - Options.gen_method = Options.SWITCH; - } - else { - Options.gen_method = Options.PACK; - } - } - - public void setTable(boolean b) { - if (b) { - Options.gen_method = Options.TABLE; - } - else { - Options.gen_method = Options.PACK; - } - } - - public void setPack(boolean b) { - if (b) { - Options.gen_method = Options.PACK; - } - else { - Options.gen_method = Options.SWITCH; - } - } - - public void setDot(boolean b) { - Options.dot = b; - } - - public void setDump(boolean b) { - Options.dump = b; - } - - public void setJLex(boolean b) { - Options.jlex = b; - } - - public void setCharAt(boolean b) { - Options.char_at = b; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/GeneratorThread.java b/tools/lexer/jflex-1.4/src/JFlex/gui/GeneratorThread.java deleted file mode 100644 index a225e890664f..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/GeneratorThread.java +++ /dev/null @@ -1,93 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.gui; - -import JFlex.*; - -import java.io.File; - - -/** - * Low priority thread for code generation (low priority - * that gui has time for screen updates) - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class GeneratorThread extends Thread { - - /** there must be at most one instance of this Thread running */ - private static volatile boolean running = false; - - /** input file setting from GUI */ - String inputFile; - - /** output directory */ - String outputDir; - - /** main UI component, likes to be notified when generator finishes */ - MainFrame parent; - - /** - * Create a new GeneratorThread, but do not run it yet. - * - * @param parent the frame, main UI component - * @param inputFile input file from UI settings - * @param messages where generator messages should appear - * @param outputDir output directory from UI settings - */ - public GeneratorThread(MainFrame parent, String inputFile, - String outputDir) { - this.parent = parent; - this.inputFile = inputFile; - this.outputDir = outputDir; - } - - - /** - * Run the generator thread. Only one instance of it can run at any time. - */ - public void run() { - if (running) { - Out.error(ErrorMessages.ALREADY_RUNNING); - parent.generationFinished(false); - } - else { - running = true; - setPriority(MIN_PRIORITY); - try { - if (!outputDir.equals("")) { - Options.setDir(outputDir); - } - Main.generate(new File(inputFile)); - Out.statistics(); - parent.generationFinished(true); - } - catch (GeneratorException e) { - Out.statistics(); - parent.generationFinished(false); - } - finally { - running = false; - } - } - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanel.java b/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanel.java deleted file mode 100644 index 753b136fb96e..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanel.java +++ /dev/null @@ -1,161 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.gui; - -import java.awt.*; -import java.util.*; - -/** - * Grid layout manager like GridLayout but with predefinable - * grid size. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class GridPanel extends Panel implements Handles { - - private int cols; - private int rows; - - private int hgap; - private int vgap; - - private Vector constraints = new Vector(); - private Insets insets = new Insets(0,0,0,0); - - public GridPanel(int cols, int rows) { - this(cols, rows, 0, 0); - } - - public GridPanel(int cols, int rows, int hgap, int vgap) { - this.cols = cols; - this.rows = rows; - this.hgap = hgap; - this.vgap = vgap; - } - - public void doLayout() { - Dimension size = getSize(); - size.height -= insets.top+insets.bottom; - size.width -= insets.left+insets.right; - - float cellWidth = size.width/cols; - float cellHeight = size.height/rows; - - for (int i = 0; i < constraints.size(); i++) { - GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i); - - float x = cellWidth * c.x + insets.left + hgap/2; - float y = cellHeight * c.y + insets.right + vgap/2; - - float width, height; - - if (c.handle == FILL) { - width = (cellWidth-hgap) * c.width; - height = (cellHeight-vgap) * c.height; - } - else { - Dimension d = c.component.getPreferredSize(); - width = d.width; - height = d.height; - } - - switch (c.handle) { - case TOP_CENTER: - x+= (cellWidth+width)/2; - break; - case TOP_RIGHT: - x+= cellWidth-width; - break; - case CENTER_LEFT: - y+= (cellHeight+height)/2; - break; - case CENTER: - x+= (cellWidth+width)/2; - y+= (cellHeight+height)/2; - break; - case CENTER_RIGHT: - y+= (cellHeight+height)/2; - x+= cellWidth-width; - break; - case BOTTOM: - y+= cellHeight-height; - break; - case BOTTOM_CENTER: - x+= (cellWidth+width)/2; - y+= cellHeight-height; - break; - case BOTTOM_RIGHT: - y+= cellHeight-height; - x+= cellWidth-width; - break; - } - - c.component.setBounds(new Rectangle((int)x, (int)y, (int)width, (int)height)); - } - } - - public Dimension getPreferredSize() { - float dy = 0; - float dx = 0; - - for (int i = 0; i < constraints.size(); i++) { - GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i); - - Dimension d = c.component.getPreferredSize(); - - dx = Math.max(dx, d.width/c.width); - dy = Math.max(dy, d.height/c.height); - } - - dx+= hgap; - dy+= vgap; - - dx*= cols; - dy*= rows; - - dx+= insets.left+insets.right; - dy+= insets.top+insets.bottom; - - return new Dimension((int)dx,(int)dy); - } - - public void setInsets(Insets insets) { - this.insets = insets; - } - - public void add(int x, int y, Component c) { - add(x,y,1,1,FILL,c); - } - - public void add(int x, int y, int handle, Component c) { - add(x,y,1,1,handle,c); - } - - public void add(int x, int y, int dx, int dy, Component c) { - add(x,y,dx,dy,FILL,c); - } - - public void add(int x, int y, int dx, int dy, int handle, Component c) { - super.add(c); - constraints.addElement(new GridPanelConstraint(x,y,dx,dy,handle,c)); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanelConstraint.java b/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanelConstraint.java deleted file mode 100644 index e2de3c92ecc3..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/GridPanelConstraint.java +++ /dev/null @@ -1,44 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex.gui; - -import java.awt.Component; - -/** - * Constraints for layout elements of GridLayout - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class GridPanelConstraint { - - int x, y, width, height, handle; - Component component; - - public GridPanelConstraint(int x, int y, int width, int height, - int handle, Component component) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.handle = handle; - this.component = component; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/Handles.java b/tools/lexer/jflex-1.4/src/JFlex/gui/Handles.java deleted file mode 100644 index c8a0e679d10c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/Handles.java +++ /dev/null @@ -1,49 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.gui; - -/** - * Constants used for GridLayout - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public interface Handles { - - int FILL = 0; - - int TOP = 1; - int TOP_LEFT = TOP; - int TOP_CENTER = 2; - int TOP_RIGHT = 3; - - int CENTER_LEFT = 4; - int CENTER = 5; - int CENTER_CENTER = CENTER; - int CENTER_RIGHT = 6; - - int BOTTOM = 7; - int BOTTOM_LEFT = BOTTOM; - int BOTTOM_CENTER = 8; - int BOTTOM_RIGHT = 9; - -} - diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/MainFrame.java b/tools/lexer/jflex-1.4/src/JFlex/gui/MainFrame.java deleted file mode 100644 index 4990ea795e0a..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/MainFrame.java +++ /dev/null @@ -1,275 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.gui; - -import JFlex.Main; -import JFlex.Out; - -import java.io.File; -import java.awt.*; -import java.awt.event.*; - -/** - * JFlex main application frame (GUI mode only) - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -final public class MainFrame extends Frame implements Handles { - - private volatile boolean choosing; - - private String fileName = ""; - private String dirName = ""; - - private Button quit; - private Button options; - private Button generate; - private Button stop; - private Button specChoose; - private Button dirChoose; - - private TextField spec; - private TextField dir; - - private TextArea messages; - - private GeneratorThread thread; - - private OptionsDialog dialog; - - - public MainFrame() { - super("JFlex "+Main.version); - buildContent(); - - addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - quit(); - } - }); - - pack(); - show(); - } - - - private void buildContent() { - setBackground(SystemColor.control); - - generate = new Button("Generate"); - quit = new Button("Quit"); - options = new Button("Options"); - stop = new Button("Stop"); - dirChoose = new Button("Browse"); - dir = new TextField(10); - specChoose = new Button("Browse"); - spec = new TextField(10); - messages = new TextArea(10,80); - - messages.setEditable(false); - Font font = messages.getFont(); - if (font != null) - messages.setFont(new Font("Monospaced", font.getStyle(), font.getSize())); - else - messages.setFont(new Font("Monospaced", Font.PLAIN, 12)); - - Out.setGUIMode(messages); - - generate.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - generate(); - } - } ); - - options.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - showOptions(); - } - } ); - - quit.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - quit(); - } - } ); - - stop.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - stop(); - } - } ); - - specChoose.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - specChoose(); - } - } ); - - dirChoose.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - dirChoose(); - } - } ); - - spec.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - fileName = spec.getText(); - generate(); - } - } ); - - spec.addTextListener( new TextListener() { - public void textValueChanged(TextEvent e) { - fileName = spec.getText(); - } - } ); - - dir.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - dirName = dir.getText(); - generate(); - } - } ); - - dir.addTextListener( new TextListener() { - public void textValueChanged(TextEvent e) { - dirName = dir.getText(); - } - } ); - - GridPanel north = new GridPanel(5,4,10,10); - north.setInsets( new Insets(10,5,5,10) ); - - north.add( 4,0, quit); - north.add( 4,1, generate); - north.add( 4,2, options); - north.add( 4,3, stop); - - north.add( 0,0, BOTTOM, new Label("Lexical specification:")); - north.add( 0,1, 2,1, spec); - north.add( 2,1, specChoose); - - north.add( 0,2, BOTTOM, new Label("Output directory:")); - north.add( 0,3, 2,1, dir); - north.add( 2,3, dirChoose); - - Panel center = new Panel(new BorderLayout()); - center.add("North", new Label("Messages:")); - center.add("Center", messages); - - add("North", north); - add("Center", center); - - setEnabledAll(false); - } - - protected void showOptions() { - if (dialog == null) { - dialog = new OptionsDialog(this); - } - dialog.show(); - } - - - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.width = messages.getPreferredSize().width; - return d; - } - - private void setEnabledAll(boolean generating) { - stop.setEnabled( generating ); - quit.setEnabled( !generating ); - generate.setEnabled( !generating ); - dirChoose.setEnabled( !generating ); - dir.setEnabled( !generating ); - specChoose.setEnabled( !generating ); - spec.setEnabled( !generating ); - } - - private void generate() { - // workaround for a weird AWT bug - if (choosing) return; - - setEnabledAll(true); - - thread = new GeneratorThread(this, fileName, dirName); - thread.start(); - } - - public void generationFinished(boolean success) { - setEnabledAll(false); - - if (success) - messages.append(Out.NL+"Generation finished successfully."+Out.NL); - else - messages.append(Out.NL+"Generation aborted."+Out.NL); - } - - private void stop() { - if (thread != null) { - /* stop ok here despite deprecation (?) - I don't know any good way to abort generation without changing the - generator code */ - thread.stop(); - thread = null; - } - generationFinished(false); - } - - private void quit() { - setVisible(false); - System.exit(0); - } - - private void dirChoose() { - choosing = true; - - FileDialog d = new FileDialog(this, "Choose directory", FileDialog.LOAD); - - d.show(); - - if (d.getDirectory() != null) { - dir.setText( (new File(d.getDirectory())).getAbsolutePath() ); - } - - choosing = false; - } - - private void specChoose() { - choosing = true; - - FileDialog d = new FileDialog(this, "Choose file", FileDialog.LOAD); - - d.setFile("*.flex"); - d.show(); - - if (d.getFile() != null) { - fileName = d.getDirectory()+d.getFile(); - dir.setText(d.getDirectory()); - spec.setText(fileName); - } - - choosing = false; - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/gui/OptionsDialog.java b/tools/lexer/jflex-1.4/src/JFlex/gui/OptionsDialog.java deleted file mode 100644 index 7ac19505c672..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/gui/OptionsDialog.java +++ /dev/null @@ -1,259 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.gui; - -import java.awt.*; -import java.awt.event.*; - -import java.io.File; - -import JFlex.GeneratorException; -import JFlex.Options; -import JFlex.Skeleton; - -/** - * A dialog for setting JFlex options - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class OptionsDialog extends Dialog { - - private Frame owner; - - private Button skelBrowse; - private TextField skelFile; - - private Button ok; - private Button defaults; - - private Checkbox dump; - private Checkbox verbose; - private Checkbox jlex; - private Checkbox no_minimize; - private Checkbox no_backup; - private Checkbox time; - private Checkbox dot; - - private Checkbox tableG; - private Checkbox switchG; - private Checkbox packG; - - - /** - * Create a new options dialog - * - * @param owner - */ - public OptionsDialog(Frame owner) { - super(owner, "Options"); - - this.owner = owner; - - setup(); - pack(); - - addWindowListener( new WindowAdapter() { - public void windowClosing(WindowEvent e) { - close(); - } - }); - } - - public void setup() { - // create components - ok = new Button("Ok"); - defaults = new Button("Defaults"); - skelBrowse = new Button(" Browse"); - skelFile = new TextField(); - skelFile.setEditable(false); - dump = new Checkbox(" dump"); - verbose = new Checkbox(" verbose"); - - jlex = new Checkbox(" JLex compatibility"); - no_minimize = new Checkbox(" skip minimization"); - no_backup = new Checkbox(" no backup file"); - time = new Checkbox(" time statistics"); - dot = new Checkbox(" dot graph files"); - - CheckboxGroup codeG = new CheckboxGroup(); - tableG = new Checkbox(" table",Options.gen_method == Options.TABLE, codeG); - switchG = new Checkbox(" switch",Options.gen_method == Options.SWITCH, codeG); - packG = new Checkbox(" pack",Options.gen_method == Options.PACK, codeG); - - // setup interaction - ok.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - close(); - } - } ); - - defaults.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - setDefaults(); - } - } ); - - skelBrowse.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - skelBrowse(); - } - } ); - - tableG.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setGenMethod(); - } - } ); - - verbose.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.verbose = verbose.getState(); - } - } ); - - dump.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.dump = dump.getState(); - } - } ); - - jlex.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.jlex = jlex.getState(); - } - } ); - - no_minimize.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.no_minimize = no_minimize.getState(); - } - } ); - - no_backup.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.no_backup = no_backup.getState(); - } - } ); - - dot.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.dot = dot.getState(); - } - } ); - - time.addItemListener( new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Options.time = time.getState(); - } - } ); - - // setup layout - GridPanel panel = new GridPanel(4,7,10,10); - panel.setInsets( new Insets(10,5,5,10) ); - - panel.add(3,0,ok); - panel.add(3,1,defaults); - - panel.add(0,0,2,1,Handles.BOTTOM,new Label("skeleton file:")); - panel.add(0,1,2,1,skelFile); - panel.add(2,1,1,1,Handles.TOP, skelBrowse); - - panel.add(0,2,1,1,Handles.BOTTOM,new Label("code:")); - panel.add(0,3,1,1,tableG); - panel.add(0,4,1,1,switchG); - panel.add(0,5,1,1,packG); - - panel.add(1,3,1,1,dump); - panel.add(1,4,1,1,verbose); - panel.add(1,5,1,1,time); - - - panel.add(2,3,1,1,no_minimize); - panel.add(2,4,1,1,no_backup); - - panel.add(3,3,1,1,jlex); - panel.add(3,4,1,1,dot); - - add("Center",panel); - - updateState(); - } - - private void skelBrowse() { - FileDialog d = new FileDialog(owner , "Choose file", FileDialog.LOAD); - d.show(); - - if (d.getFile() != null) { - File skel = new File(d.getDirectory()+d.getFile()); - try { - Skeleton.readSkelFile(skel); - skelFile.setText(skel.toString()); - } - catch (GeneratorException e) { - // do nothing - } - } - } - - private void setGenMethod() { - if ( tableG.getState() ) { - Options.gen_method = Options.TABLE; - return; - } - - if ( switchG.getState() ) { - Options.gen_method = Options.SWITCH; - return; - } - - if ( packG.getState() ) { - Options.gen_method = Options.PACK; - return; - } - } - - private void updateState() { - dump.setState(Options.dump); - verbose.setState(Options.verbose); - jlex.setState(Options.jlex); - no_minimize.setState(Options.no_minimize); - no_backup.setState(Options.no_backup); - time.setState(Options.time); - dot.setState(Options.dot); - - tableG.setState(Options.gen_method == Options.TABLE); - switchG.setState(Options.gen_method == Options.SWITCH); - packG.setState(Options.gen_method == Options.PACK); - } - - private void setDefaults() { - Options.setDefaults(); - Skeleton.readDefault(); - skelFile.setText(""); - updateState(); - } - - public void close() { - hide(); - } - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/skeleton.default b/tools/lexer/jflex-1.4/src/JFlex/skeleton.default deleted file mode 100644 index c2a807820775..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/skeleton.default +++ /dev/null @@ -1,317 +0,0 @@ - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ ---- private static final int ZZ_BUFFERSIZE = ...; - - /** lexical states */ ---- lexical states, charmap - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - ---- isFinal list - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the textposition at the last state to be included in yytext */ - private int zzPushbackPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - ---- user class code - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ ---- constructor declaration - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzPushbackPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead < 0) { - return true; - } - else { - zzEndRead+= numRead; - return false; - } - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = zzPushbackPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ ---- zzScanError declaration - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - ---- throws clause - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ ---- yypushback decl (contains zzScanError exception) - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - ---- zzDoEOF - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ ---- yylex declaration - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - ---- local declarations - - while (true) { - zzMarkedPosL = zzMarkedPos; - ---- start admin (line, char, col count) - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - ---- start admin (lexstate etc) - - zzForAction: { - while (true) { - ---- next input, line, col, char count, next transition, isFinal action - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; ---- line count update - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; ---- char count update - ---- actions - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; ---- eofvalue - } - else { ---- no match - } - } - } - } - ---- main - -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/sym.java b/tools/lexer/jflex-1.4/src/JFlex/sym.java deleted file mode 100644 index 9c340d530a93..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/sym.java +++ /dev/null @@ -1,91 +0,0 @@ - -//---------------------------------------------------- -// The following code was generated by CUP v0.11a beta 20060608 -// Mon Dec 03 16:12:49 MSK 2012 -//---------------------------------------------------- - -package JFlex; - -/** CUP generated interface containing symbol constants. */ -public interface sym { - /* terminals */ - public static final int DELIMITER = 9; - public static final int UNICODE_SPACE_SEPARATOR = 41; - public static final int UNICODE_OTHER_LETTER = 34; - public static final int USERCODE = 61; - public static final int UNICODE_ENCLOSING_MARK = 36; - public static final int REGEXPEND = 19; - public static final int CCLASSNOT = 74; - public static final int UNICODE = 18; - public static final int UNICODE_CURRENCY_SYMBOL = 54; - public static final int UNICODE_LETTER_NUMBER = 39; - public static final int UNICODE_START_PUNCTUATION = 49; - public static final int UNICODE_OTHER_SYMBOL = 56; - public static final int UNICODE_COMBINING_SPACING_MARK = 37; - public static final int UNICODE_FINAL_QUOTE_PUNCTUATION = 58; - public static final int UNICODE_UNASSIGNED = 29; - public static final int COMMA = 11; - public static final int RBRACE = 15; - public static final int UNICODE_UPPERCASE_LETTER = 30; - public static final int UNICODE_INITIAL_QUOTE_PUNCTUATION = 57; - public static final int LBRACE = 14; - public static final int UNICODE_SURROGATE = 47; - public static final int ACTION = 59; - public static final int CHAR_I = 77; - public static final int UNICODE_DECIMAL_DIGIT_NUMBER = 38; - public static final int CLOSECLASS = 7; - public static final int TILDE = 69; - public static final int UNICODE_NON_SPACING_MARK = 35; - public static final int DOLLAR = 5; - public static final int UNICODE_END_PUNCTUATION = 50; - public static final int FULL = 17; - public static final int LESSTHAN = 12; - public static final int UNICODE_DASH_PUNCTUATION = 48; - public static final int CLOSEBRACKET = 3; - public static final int PLUS = 64; - public static final int QUESTION = 66; - public static final int CHAR = 70; - public static final int NOACTION = 27; - public static final int STAR = 63; - public static final int UNICODE_CONNECTOR_PUNCTUATION = 51; - public static final int CONCAT = 75; - public static final int ASCII = 16; - public static final int MORETHAN = 13; - public static final int OPENCLASS = 6; - public static final int POINT = 67; - public static final int JLETTERDIGITCLASS = 21; - public static final int EOFRULE = 26; - public static final int EOF = 0; - public static final int UNICODE_MODIFIER_LETTER = 33; - public static final int BANG = 68; - public static final int UPPERCLASS = 24; - public static final int JLETTERCLASS = 20; - public static final int REPEAT = 62; - public static final int LOOKAHEAD = 28; - public static final int UNICODE_OTHER_NUMBER = 40; - public static final int UNICODE_PRIVATE_USE = 46; - public static final int UNICODE_MATH_SYMBOL = 53; - public static final int OPENBRACKET = 2; - public static final int HAT = 4; - public static final int IDENT = 60; - public static final int error = 1; - public static final int UNICODE_PARAGRAPH_SEPARATOR = 43; - public static final int LOWERCLASS = 25; - public static final int STRING_I = 76; - public static final int UNICODE_MODIFIER_SYMBOL = 55; - public static final int UNICODE_CONTROL = 44; - public static final int UNICODE_OTHER_PUNCTUATION = 52; - public static final int DIGITCLASS = 23; - public static final int UNICODE_FORMAT = 45; - public static final int UNICODE_TITLECASE_LETTER = 32; - public static final int DASH = 8; - public static final int MACROUSE = 72; - public static final int STRING = 71; - public static final int CCLASS = 73; - public static final int UNICODE_LOWERCASE_LETTER = 31; - public static final int LETTERCLASS = 22; - public static final int BAR = 65; - public static final int UNICODE_LINE_SEPARATOR = 42; - public static final int EQUALS = 10; -} - diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/AllTests.java b/tools/lexer/jflex-1.4/src/JFlex/tests/AllTests.java deleted file mode 100644 index eaa370ffbf14..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/AllTests.java +++ /dev/null @@ -1,50 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * jflex * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * AllTests - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class AllTests { - - public static void main(String[] args) { - junit.textui.TestRunner.run(AllTests.class); - } - - public static Test suite() { - TestSuite suite = new TestSuite("JFlex tests"); - //$JUnit-BEGIN$ - suite.addTest(new TestSuite(AntTaskTests.class)); - suite.addTest(new TestSuite(CharClassesTest.class)); - suite.addTest(new TestSuite(EmitterTest.class)); - suite.addTest(new TestSuite(RegExpTests.class)); - suite.addTest(new TestSuite(SkeletonTest.class)); - suite.addTest(new TestSuite(PackEmitterTest.class)); - //$JUnit-END$ - return suite; - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/AntTaskTests.java b/tools/lexer/jflex-1.4/src/JFlex/tests/AntTaskTests.java deleted file mode 100644 index 9a717056383c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/AntTaskTests.java +++ /dev/null @@ -1,167 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -package JFlex.tests; - -import java.io.File; -import java.io.IOException; - -import JFlex.Options; -import JFlex.anttask.JFlexTask; - -import junit.framework.TestCase; - -/** - * Unit tests for the jflex ant task. - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class AntTaskTests extends TestCase { - - private JFlexTask task; - - /** - * Constructor for AntTaskTests. - * - * @param name test case name - */ - public AntTaskTests(String name) { - super(name); - } - - /* - * @see TestCase#setUp() - */ - protected void setUp() throws Exception { - super.setUp(); - Options.setDefaults(); - task = new JFlexTask(); - } - - public void testPackageAndClass() throws IOException { - task.setFile(new File("src/JFlex/LexScan.flex")); - task.findPackageAndClass(); - assertEquals(task.getPackage(), "JFlex"); - assertEquals(task.getClassName(), "LexScan"); - } - - public void testPackageAndClassDefaults() throws IOException { - task.setFile(new File("examples/simple/simple.flex")); - task.findPackageAndClass(); - assertEquals(task.getPackage(), null); - assertEquals(task.getClassName(), "Yylex"); - } - - public void testDestdir() throws IOException { - task.setFile(new File("src/JFlex/LexScan.flex")); - File dir = new File("src"); - task.setDestdir(dir); - task.findPackageAndClass(); - task.normalizeOutdir(); - // not default jflex logic, but javac (uses package name) - assertEquals(Options.getDir(), new File(dir, "JFlex")); - } - - public void testOutdir() throws IOException { - task.setFile(new File("src/JFlex/LexScan.flex")); - File dir = new File("src"); - task.setOutdir(dir); - task.findPackageAndClass(); - task.normalizeOutdir(); - // this should be default jflex logic - assertEquals(Options.getDir(), dir); - } - - public void testDefaultDir() throws IOException { - task.setFile(new File("src/JFlex/LexScan.flex")); - task.findPackageAndClass(); - task.normalizeOutdir(); - // this should be default jflex logic - assertEquals(Options.getDir(), new File("src/JFlex")); - } - - public void testNomin() { - assertTrue(!Options.no_minimize); - task.setNomin(true); - assertTrue(Options.no_minimize); - } - - public void testSkipMinimization() { - assertTrue(!Options.no_minimize); - task.setSkipMinimization(true); - assertTrue(Options.no_minimize); - } - - public void testNobak() { - assertTrue(!Options.no_backup); - task.setNobak(true); - assertTrue(Options.no_backup); - } - - public void testCodeGen() { - task.setSwitch(true); - assertEquals(Options.gen_method, Options.SWITCH); - task.setTable(true); - assertEquals(Options.gen_method, Options.TABLE); - task.setPack(true); - assertEquals(Options.gen_method, Options.PACK); - } - - public void testSkel() { - task.setVerbose(false); // avoid to java console pop up - task.setSkeleton(new File("src/skeleton.nested")); - assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0); - } - - public void testVerbose() { - task.setVerbose(false); - assertTrue(!Options.verbose); - task.setVerbose(true); - assertTrue(Options.verbose); - } - - public void testTime() { - assertTrue(!Options.time); - task.setTimeStatistics(true); - assertTrue(Options.time); - task.setTime(false); - assertTrue(!Options.time); - } - - public void testDot() { - assertTrue(!Options.dot); - task.setDot(true); - assertTrue(Options.dot); - task.setGenerateDot(false); - assertTrue(!Options.dot); - } - - public void testDump() { - assertTrue(!Options.dump); - task.setDump(true); - assertTrue(Options.dump); - } - - public void testJlex() { - assertTrue(!Options.jlex); - task.setJLex(true); - assertTrue(Options.jlex); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/CharClassesTest.java b/tools/lexer/jflex-1.4/src/JFlex/tests/CharClassesTest.java deleted file mode 100644 index 62b9cf9a7b54..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/CharClassesTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - -import JFlex.IntCharSet; -import JFlex.Interval; -import junit.framework.TestCase; - -/** - * CharClassesTest - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class CharClassesTest extends TestCase { - - /** - * Constructor for CharClassesTest. - * @param arg0 - */ - public CharClassesTest(String arg0) { - super(arg0); - } - - public void testAdd1() { - IntCharSet set = new IntCharSet(new Interval('a','h')); - set.add(new Interval('o','z')); - set.add(new Interval('A','Z')); - set.add(new Interval('h','o')); - assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); - } - - public void testAdd2() { - IntCharSet set = new IntCharSet(new Interval('a','h')); - set.add(new Interval('o','z')); - set.add(new Interval('A','Z')); - set.add(new Interval('i','n')); - assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); - } - - public void testAdd3() { - IntCharSet set = new IntCharSet(new Interval('a','h')); - set.add(new Interval('o','z')); - set.add(new Interval('A','Z')); - set.add(new Interval('a','n')); - assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); - } - - public void testMergeLast() { - IntCharSet set = new IntCharSet(new Interval('a','k')); - assertEquals("{ ['a'-'k'] }", set.toString()); - set.add('l'); - assertEquals("{ ['a'-'l'] }", set.toString()); - } - - public void testAddChar() { - IntCharSet set = new IntCharSet(new Interval('a','h')); - set.add(new Interval('o','z')); - set.add('n'); - set.add('k'); - assertEquals("{ ['a'-'h']['k']['n'-'z'] }", set.toString()); - set.add('i'); - assertEquals("{ ['a'-'i']['k']['n'-'z'] }", set.toString()); - set.add('j'); - assertEquals("{ ['a'-'k']['n'-'z'] }", set.toString()); - set.add(new Interval('l','m')); - assertEquals("{ ['a'-'z'] }", set.toString()); - } - - public void testCopy() { - IntCharSet set = new IntCharSet(new Interval('a','z')); - IntCharSet copy = set.copy(); - Interval i = set.getNext(); - i.end = 'h'; - assertEquals("{ ['a'-'h'] }", set.toString()); - assertEquals("{ ['a'-'z'] }", copy.toString()); - } - - public void testCaseless() { - IntCharSet set = new IntCharSet(new Interval('a','c')); - set.add(new Interval('h','o')); - assertEquals("{ ['A'-'C']['H'-'O']['a'-'c']['h'-'o'] }", - set.getCaseless().toString()); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/EmitterTest.java b/tools/lexer/jflex-1.4/src/JFlex/tests/EmitterTest.java deleted file mode 100644 index 26a4b37f3ba1..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/EmitterTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - -import JFlex.Emitter; -import junit.framework.TestCase; - -/** - * Some unit tests for the jflex Emitter class - * - * @author Gerwin Klein - * @version $Revision: 1.4.3 $, $Date: 2009/12/21 15:58:48 $ - */ -public class EmitterTest extends TestCase { - - /** - * Constructor for EmitterTest. - * @param name the test name - */ - public EmitterTest(String name) { - super(name); - } - - public void testJavadoc() { - StringBuffer usercode = new StringBuffer("/* some *** comment */"); - assertTrue(!Emitter.endsWithJavadoc(usercode)); - usercode.append("import bla; /** javadoc /* */ "); - assertTrue(Emitter.endsWithJavadoc(usercode)); - usercode.append("bla"); - assertTrue(!Emitter.endsWithJavadoc(usercode)); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/PackEmitterTest.java b/tools/lexer/jflex-1.4/src/JFlex/tests/PackEmitterTest.java deleted file mode 100644 index 1b1a4203418c..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/PackEmitterTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * jflex * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - -import junit.framework.TestCase; -import JFlex.Out; -import JFlex.PackEmitter; - -/** - * PackEmitterTest - * - * @author Gerwin Klein - * @version $Revision$, $Date$ - */ -public class PackEmitterTest extends TestCase { - - private PackEmitter p; - - - /** - * Constructor for PackEmitterTest. - */ - public PackEmitterTest() { - super("PackEmitter test"); - } - - public void setUp() { - p = new PackEmitter("Bla") { - public void emitUnpack() { } - }; - } - - public void testInit() { - p.emitInit(); - assertEquals( - " private static final int [] ZZ_BLA = zzUnpackBla();" + Out.NL + - Out.NL + - " private static final String ZZ_BLA_PACKED_0 =" + Out.NL + - " \"", - p.toString()); - } - - public void testEmitUCplain() { - p.emitUC(8); - p.emitUC(0xFF00); - - assertEquals("\\10\\uff00", p.toString()); - } - - public void testLineBreak() { - for (int i = 0; i < 36; i++) { - p.breaks(); - p.emitUC(i); - } - System.out.println(p); - assertEquals( - "\\0\\1\\2\\3\\4\\5\\6\\7\\10\\11\\12\\13\\14\\15\\16\\17\"+"+Out.NL+ - " \"\\20\\21\\22\\23\\24\\25\\26\\27\\30\\31\\32\\33\\34\\35\\36\\37\"+"+Out.NL+ - " \"\\40\\41\\42\\43", - p.toString()); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/RegExpTests.java b/tools/lexer/jflex-1.4/src/JFlex/tests/RegExpTests.java deleted file mode 100644 index 6734f95c6c46..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/RegExpTests.java +++ /dev/null @@ -1,62 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - -import JFlex.*; -import junit.framework.TestCase; - -/** - * Unit tests for JFlex.RegExp - * - * @author Gerwin Klein - * @version $Revision$, $Date$ - */ -public class RegExpTests extends TestCase implements sym { - - /** - * Constructor for RegExpTests. - * - * @param name the test name - */ - public RegExpTests(String name) { - super(name); - } - - public void testrevString() { - assertTrue(RegExp.revString("blah").equals("halb")); - } - - public void testCharClass() { - Macros m = new Macros(); - RegExp e1 = new RegExp1(CCLASS, new Interval('a','z')); - RegExp e2 = new RegExp1(CHAR, new Character('Z')); - RegExp e3 = new RegExp1(CCLASS, new Interval('0','9')); - m.insert("macro", e3); - RegExp s = new RegExp1(STAR, e1); - RegExp u = new RegExp1(MACROUSE, "macro"); - RegExp b = new RegExp2(BAR, e2, u); - assertTrue(e1.isCharClass(m)); - assertTrue(e2.isCharClass(m)); - assertTrue(b.isCharClass(m)); - assertTrue(!s.isCharClass(m)); - assertTrue(u.isCharClass(m)); - } -} diff --git a/tools/lexer/jflex-1.4/src/JFlex/tests/SkeletonTest.java b/tools/lexer/jflex-1.4/src/JFlex/tests/SkeletonTest.java deleted file mode 100644 index c273952d31ad..000000000000 --- a/tools/lexer/jflex-1.4/src/JFlex/tests/SkeletonTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * JFlex 1.4.3 * - * Copyright (C) 1998-2009 Gerwin Klein * - * All rights reserved. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License. See the file * - * COPYRIGHT for more information. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -package JFlex.tests; - - -import java.io.File; - -import JFlex.Skeleton; -import junit.framework.TestCase; - -/** - * SkeletonTest - * - * @author Gerwin Klein - * @version $Revision$, $Date$ - */ -public class SkeletonTest extends TestCase { - - /** - * Constructor for SkeletonTest. - * @param arg0 test name - */ - public SkeletonTest(String arg0) { - super(arg0); - } - - public void testReplace() { - assertEquals(Skeleton.replace("bla ", "blub", "bla blub bla "), - "blubblub blub"); - } - - public void testMakePrivate() { - Skeleton.makePrivate(); - for (int i=0; i < Skeleton.line.length; i++) { - assertEquals(Skeleton.line[i].indexOf("public"), -1); - } - } - - public void testDefault() { - Skeleton.readSkelFile(new File("src/skeleton.nested")); - assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0); - Skeleton.readDefault(); - assertEquals(JFlex.Skeleton.line[3].indexOf("java.util.Stack"), -1); - } -} diff --git a/tools/lexer/jflex-1.4/src/README b/tools/lexer/jflex-1.4/src/README deleted file mode 100644 index 8bf11a7a9e2c..000000000000 --- a/tools/lexer/jflex-1.4/src/README +++ /dev/null @@ -1,46 +0,0 @@ -This directory contains the source code for JFlex. - -Dependencies - -You need the following tools in your class path: - -ant.jar >= 1.4 - -To compile, run first - -ant gettools -(this will download JFlex, java_cup, and junit jars for bootstrapping) - -then, run -ant jar - - -The command "ant help" should give you other useful targets. - - -Directory contents: -manifest: - jar manifest file for JFlex.jar - -skeleton: - a skeleton file matching exactly the precompiled scanner skeleton. - Can be used together with the --skel option - -skeleton.nested: - a skeleton file that supports nested input streams (see the manual - for the API). Can be used together with the --skel option - -JFlex: - source files of package JFlex - -JFlex/gui: - source files of package JFlex.gui - -JFlex/anttask - source files of the JFlex Ant task (contributed by Rafal Mantiuk) - -JFlex/test - unit tests for JFlex - -java_cup/runtime: - CUP 11a beta 20060608 runtime classes, used by JFlex diff --git a/tools/lexer/jflex-1.4/src/build.xml b/tools/lexer/jflex-1.4/src/build.xml deleted file mode 100644 index f497dba607ca..000000000000 --- a/tools/lexer/jflex-1.4/src/build.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/lexer/jflex-1.4/src/changelog b/tools/lexer/jflex-1.4/src/changelog deleted file mode 100644 index f751ef6163cd..000000000000 --- a/tools/lexer/jflex-1.4/src/changelog +++ /dev/null @@ -1,277 +0,0 @@ -* JFlex 1.4.3 (Jan 31, 2009) -- fixed bug #2018299 (lookahead syntax error) -- fixed bug #2010261 (min_int in Java example scanner) -- fixed bug #2007221 (zzEOFDone not reset in yyreset(Reader)) -- fixed bug #1999301 (%type and %int at the same time should produce error msg) - -* JFlex 1.4.2 (May 27, 2008) -- implemented feature request #1212181: - Now supports generics syntax for %type, %extends, etc -- implemented feature request #1762500: - Provided %ctorarg option to add arguments to constructor -- fixed bug #1464525 (Reader.read might return 0) -- fixed bug #1968897 (Ambiguous error message in macro expansion) -- fixed bug #1832973 (Syntax error in input may cause NullPointerException) -- fixed bug #1629920 (Need to defend against path blanks in jflex bash script) -- fixed bug #1540228 (EOF actions may be ignored for same lex state) -- fixed bug #1498726 (syntax error in generated ZZ_CMAP) -- fixed bug #1282840 (lookahead and "|" actions) -- fixed bug #1164852 (yytext() longer than expected with lookahead) -- fixed bug #1065521 (OS/2 Java 1.1.8 Issues) -- fixed bug #421495 (dangerous lookahead check may fail) - -* JFlex 1.4.1 (November 7, 2004) -- merged in patch by Don Brown (fixes #1049791 Uses Old JUnit method assertFalse) -- merged in patch by Don Brown (fixes #887821 buffer expansion bug in yy_refill()) - Thanks to Binesh Bannerjee for providing a simpler test case for this problem. -- fixed bug #1035407 (ArrayIndexOutOfBounds in IntCharSet) -- fixed bug #1003569 (Cannot use lookahead with ignorecase) -- converted dangerous lookahead error to warning -- print info for EOF actions as well in %debug mode -- fixed line number count for EOF actions -- internal: removed unused methods in LexScan.flex and IntCharSet - -* JFlex 1.4 (April 12, 2004) -- new, very fast minimization algorithm (also fixes memory issues) -- new --jlex option for strict compatibility to JLex. Currently it - changes %ignorecase to JLex semantics, that is, character classes - are interpreted in a caseless way, too. - (fixes bus #751757, %ignorecase ignored by char classes). - Thanks to Edward D. Willink for spotting the incompatibility. -- support for even larger scanners (up to 64K DFA states). - Thanks to Karin Vespoor. -- removed eclipse compiler warnings for generated classes - (feature request #778747) -- implemented faster character classes (feature request #604589). - Expressions like [a-z] | [A-Z] are interpreted as one atomic class - [a-zA-Z], reducing NFA states and generation time significantly - for some specifications. This affects the generation process only, - generated scanners remain the same. -- new %apiprivate switch (feature request #513500/1) that causes all - generated and skeleton methods to be made private. Exceptions to this - are user defined functions and the constructor. Thanks to Stephen - Ostermiller for the suggestion. -- allow user defined javadoc class comments (feature request #513500/2) - If the user code section ends with a javadoc comment, JFlex takes this - instead of the generated comment. Thanks to Stephen Ostermiller for - the suggestion. -- fixed bug #491095 (undefined macros in complement expressions do - not throw exception in generator). Thanks to Stephen Ostermiller - for the bug report. -- fixed bug #495422 (yypushStream/yypopStream in skeleton.nested - work as advertised) -- fixed bug #611118 (no wrong macro warnings on regexp negation) -- fixed bug #655528 (%cupsym now also affects %cupdebug) - Thanks to Eric Schweitz for the fix. -- fixed bug #510010 (single-line %initthrow works now - in case of extra whitespace before newline) -- yyreset() does no longer close the associated reader (use yyclose() - explicitly for that). Makes some reader objects reusable (feature - request #513492). Thanks to Stephen Ostermiller for the suggestion. -- fixed modifier order in generated code, removes jikes compiler warnings - Thanks to Michael Wildpaner for the fix. -- ant task now also works with ant >= 1.4 (fixes bug #526905) -- yyreset() does not declare an execption any more (fixes bug #913132) -- %cup does not include %eofclose in JLex mode (--jlex). (Fixes bug #910562) -- optional parameter to %eofclose: "%eofclose false" turns off %eofclose if - it was turned on previously (e.g. by %cup). (Fixes bug #910562) -- jflex build script switched to ant -- internal: central Options class for better integration with - build tools and IDEs -- internal: change naming scheme for generated internal variables from - yy_ to zz to comply with Java naming standard. Thanks to Max Gilead - for the patch. - - -* JFlex 1.3.5 (October 8, 2001) -- fixed all bugs reported for version 1.3.4. Thanks to - Amin Ahmad and Fred Wehrhahn for their excellent bug reports. -- implemented feature request #459014: vim syntax file. - Thanks to Michael Brailsford for his help and suggestions. -- JFlex should run with JDK 1.1 out-of-the-box again. - - -* JFlex 1.3.4 (October 1, 2001) -- fixed all bugs reported for version 1.3.3. Thanks to Mike Akerman - for his excellent bug reports and his help. -- implemented feature request #459355: exclusive start states. - Thanks to Ed Beroset for the suggestion. -- introduced %s and %x shorthands for state declarations - - -* JFlex 1.3.3 (September 21, 2001) -- fixed all reported bugs except #39 (lookahead check at generation - time may fail). Thanks to Axel Schwolow, Karl Meissner, Angelo - Borsotti, and Paolo Di Francesco for their excellent bug reports. -- enhanced %debug output. JFlex scanners in debug mode now print line, - column, matched text, and executed action (with line number in spec) - for each processed token. Thanks to - Karl Meissner for the - suggestion. -- introduced %cupdebug directive for readable CUP debugging. Generated - scanners print line, column, matched text, and CUP symbol name for - each returned token. Again thanks to Karl Meissner for tips and - contributed Java reflection code. -- new %cupsym to customize CUP generated symbols class name. Thanks - to Karl Meissner and Paolo Di Francesco. -- new %throws as shorthand for %yylexthrow -- code generation now customizable at command line with --table, - --pack, and --switch -- command line switch --info prints system and JVM information (useful - for bug reports) -- command line switch --nobak for not generating backup files -- an Ant task for the Ant build tool http://jakarta.apache.org/ant/ - contributed by Rafal Mantiuk. Many thanks to him. -- better error message for missing ] in char class. Thanks to Karl - Meissner. -- performance enhancements in the runtime system. The engine is now - 10%-50% faster. These are only the first implementations of a few of - the many suggestions from Angelo Borsotti. Thanks to Angelo for many - insights, tips, and fruitful discussions. -- a new warning if a rule can never be matched -- macros and regular expression can now span multiple lines (note - that | at the end of a line in a rule is a special action, - not the | operator) -- updated the manual to contain more information about the generated - class, clarified the description of lexical states. Thanks to Michael - Binz, Angelo Borsotti, Vasily Karyaev and for the suggestions. -- Simplified java example lexer, and allow // style comments at EOF. - Thanks to Thomas Mulcahy. -- Byacc/J example updated to version 1.1 -- New interpreter example using CUP. Thanks to Bernhard Rumpe for - the code. - - -* JFlex 1.3.2 (February 24, 2001) -- fixed bug #32 (this time for real). Thanks to Thilo Goetz for - his quick report. -- updated the binary scanning example with the more comprehensive and - usable class StraightStreamReader by Stephen Ostermiller. Thanks go to - him for his contribution. The original version of this class is at - http://www.smo.f2s.com/utils/ -- added a link to a Japanese translation of the JFlex manual (it's in Japanese - Shift_JIS encoding). The translation is for an older release (1.1.2), but - most of the text still applies to the current version. See the change log - for the differences between 1.1.2 and the current version. Many thanks to - Yuichi Nakajima, Yukio Ikeda, Katsuhiko Yamazaki, and Koji Ooya for - their efforts. - If you would like to translate the JFlex manual into another language, or - if you already have done so, please let me know. I will include a link to - it on the documentation page. I can also give you access to the latex - sources of the manual, so that printable versions of your translation can - be generated, too. - - -* JFlex 1.3.1 (February 20, 2001) -- fixed all JFlex bugs reported for 1.3 (bugs #32-#36) - Thanks to Hans Kratz, Vasily Karyaev, Alexey Yakovets, and Tom Moog for - their excellent reports. -- added two new example scanners: - . a demonstration how to scan binary files - . a small calculator example for Cup, based on the example in the Linux - Gazette by Richard A. Sevenich and Christopher Lopes. See also - http://www.linuxgazette.com/issue39/sevenich.html - http://www.linuxgazette.com/issue41/sevenich.html - http://www.linuxgazette.com/issue41/lopes/lopes.html -- manual section about encodings, platforms and Unicode. - Thanks to Stephen Ostermiller for his valuable input. -- switch for skipping the minimization step in DFA generation (--nomin). - This feature is still in alpha status and not yet extensively tested. It - might be useful when you have very large scanners and not much memory - available. -- switch for generating graphviz dot files for graphical representation (ps - or gif) of generated NFA, DFA and minimized DFA (--dot). Might be useful for - teaching. This feature is also still in alpha status and not fully finished - yet. It is included as preview, comments are welcome, please try it out and - tell me what you think. For information on graphviz see - http://www.research.att.com:80/sw/tools/graphviz/ -- changed to --style long command line switches (single - still recognized). -- moved part of the project to http://sourceforge.net/projects/jflex/ - - -* JFlex 1.3 (October 21, 2000) - -- Fixed all bugs reported for 1.2.2 (bugs #23-#27). -- Better start script for Linux. -- Customize for internal error handling in yy_ScanError. -- Empty charclass [], and any (=negated empty) charclass [^]. -- New negation operator ! for regexps. -- New upto operator ~ for regexps. -- Customizable buffer size (%buffer). -- New char yycharat(int) for efficient access to single characters in matched text. -- Split up of too large lex tables for even larger scanner sizes. -- New additional external skeleton with support for nested input streams. -- JLex compatibility: BOL ^ and EOL $ use unicode line separators as in - http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html. -- New resetStream method for reusing scanner objects. -_ BYacc/J support (%byaccj) + BYacc/J example. -- Include files in lexer specs (%include). -- New --dump switch for a dump of the generated charclasses, NFA, DFA, and minimized DFA tables. - - -* JFlex 1.2.2 (August 23, 1999) -- Updated JFlex to the new CUP version 0.10j. -- Eliminated some remaining platform dependent newlines in the generated source code - (affecting the readabilty of the generated code only, no functional changes). -- Minor improvements in error reporting (out of memory). -- Added a --version command line option for printing the current jflex version. -- Updated the Java 1.2 lexer/parser example to CUP 0.10j. - - -* JFlex 1.2.1 (June 25, 1999) -- Fixed all bugs reported for version 1.2 (#19-#22). -- Webpage redesigned and moved to http://www.jflex.de. -- Example java lexer/parser switched to Java 1.2. - - -* JFlex 1.2 (March 21, 1999) -- Fixed all bugs for 1.1.2. -- JFlex now works again with Solaris JIT. -- Significant Unicode optimizations in scanning and generation performance, -- changed the empty string match wrt. EOF behavior to the one that is commonly expected. -- added command line switches for more customization -- external skeleton files -- new GUI without any console output -- <> as in lex/flex -- better error messages -- better generation speed -- better generation memory efficiency -- | Action, trailing context (/ operator) -- new %final, %abstract and %extends directives -- uses jar file -- included makefile for JFlex, -- %pack now uses string packing, -- %pack now default code generation method, -- new %switch directive for old default code generation method, -- more convenient declaration of exceptions, -- new %int switch, -- manual now written in latex, available as html and in printable .ps.gz and pdf file formats. - - -* JFlex 1.1.2 -- All bugs reported for version 1.1.1 (#8-#10) have been fixed. - - -* JFlex 1.1.1 -- All bugs reported for version 1.1 (i.e. bug #7 and feature request #6) have been fixed. -- Scanning speed was optimized further. - - -* JFlex 1.1 adds new features and fixes all known bugs of 1.0 -- Revised directory structure. -- Fixed all reported bugs (#1-#5 and some unreported ones). -- Fixed thousands of typos in the manual. -- whitespace characters in regular expressions, -- flex style repeat expressions, -- %caseless switch, -- %eofclose switch, -- method for closing the input stream, -- method for the current lexical state, -- method for rereading matched text, -- backup of files that are overwitten in the generation process, -- improved error reporting, -- graphical UI when no filename is provided on the commandline - - -* JFlex 1.0 (May 1998) was the first public release of JFlex. - It was developed using Sun's JDK 1.1, JFlex (bootstrapped) and the parser generator CUP \ No newline at end of file diff --git a/tools/lexer/jflex-1.4/src/java_cup/runtime/ComplexSymbolFactory.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/ComplexSymbolFactory.java deleted file mode 100644 index 8f85d7ae2b14..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/ComplexSymbolFactory.java +++ /dev/null @@ -1,119 +0,0 @@ -package java_cup.runtime; - -/** - * Default Implementation for SymbolFactory, creates - * plain old Symbols - * - * @version last updated 27-03-2006 - * @author Michael Petter - */ - -/* ************************************************* - class DefaultSymbolFactory - - interface for creating new symbols - ***************************************************/ -public class ComplexSymbolFactory implements SymbolFactory{ - public static class Location { - private String unit="unknown"; - private int line, column; - public Location(String unit, int line, int column){ - this.unit=unit; - this.line=line; - this.column=column; - } - public Location(int line, int column){ - this.line=line; - this.column=column; - } - public String toString(){ - return unit+":"+line+"/"+column; - } - public int getColumn(){ - return column; - } - public int getLine(){ - return line; - } - public String getUnit(){ - return unit; - } - } - /** - * ComplexSymbol with detailed Location Informations and a Name - */ - public static class ComplexSymbol extends Symbol { - protected String name; - protected Location xleft,xright; - public ComplexSymbol(String name, int id) { - super(id); - this.name=name; - } - public ComplexSymbol(String name, int id, Object value) { - super(id,value); - this.name=name; - } - public String toString(){ - if (xleft==null || xright==null) return "Symbol: "+name; - return "Symbol: "+name+" ("+xleft+" - "+xright+")"; - } - public ComplexSymbol(String name, int id, int state) { - super(id,state); - this.name=name; - } - public ComplexSymbol(String name, int id, Symbol left, Symbol right) { - super(id,left,right); - this.name=name; - if (left!=null) this.xleft = ((ComplexSymbol)left).xleft; - if (right!=null) this.xright= ((ComplexSymbol)right).xright; - } - public ComplexSymbol(String name, int id, Location left, Location right) { - super(id); - this.name=name; - this.xleft=left; - this.xright=right; - } - public ComplexSymbol(String name, int id, Symbol left, Symbol right, Object value) { - super(id,value); - this.name=name; - if (left!=null) this.xleft = ((ComplexSymbol)left).xleft; - if (right!=null) this.xright= ((ComplexSymbol)right).xright; - } - public ComplexSymbol(String name, int id, Location left, Location right, Object value) { - super(id,value); - this.name=name; - this.xleft=left; - this.xright=right; - } - public Location getLeft(){ - return xleft; - } - public Location getRight(){ - return xright; - } - } - - - // Factory methods - public Symbol newSymbol(String name, int id, Location left, Location right, Object value){ - return new ComplexSymbol(name,id,left,right,value); - } - public Symbol newSymbol(String name, int id, Location left, Location right){ - return new ComplexSymbol(name,id,left,right); - } - public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value){ - return new ComplexSymbol(name,id,left,right,value); - } - public Symbol newSymbol(String name, int id, Symbol left, Symbol right){ - return new ComplexSymbol(name,id,left,right); - } - public Symbol newSymbol(String name, int id){ - return new ComplexSymbol(name,id); - } - public Symbol newSymbol(String name, int id, Object value){ - return new ComplexSymbol(name,id,value); - } - public Symbol startSymbol(String name, int id, int state){ - return new ComplexSymbol(name,id,state); - } -} diff --git a/tools/lexer/jflex-1.4/src/java_cup/runtime/DefaultSymbolFactory.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/DefaultSymbolFactory.java deleted file mode 100644 index d5bca58a271a..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/DefaultSymbolFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -package java_cup.runtime; - -/** - * Default Implementation for SymbolFactory, creates - * plain old Symbols - * - * @version last updated 27-03-2006 - * @author Michael Petter - */ - -/* ************************************************* - class DefaultSymbolFactory - - interface for creating new symbols - ***************************************************/ -public class DefaultSymbolFactory implements SymbolFactory{ - // Factory methods - /** - * DefaultSymbolFactory for CUP. - * Users are strongly encoraged to use ComplexSymbolFactory instead, since - * it offers more detailed information about Symbols in source code. - * Yet since migrating has always been a critical process, You have the - * chance of still using the oldstyle Symbols. - * - * @deprecated as of CUP v11a - * replaced by the new java_cup.runtime.ComplexSymbolFactory - */ - //@deprecated - public DefaultSymbolFactory(){ - } - public Symbol newSymbol(String name ,int id, Symbol left, Symbol right, Object value){ - return new Symbol(id,left,right,value); - } - public Symbol newSymbol(String name, int id, Symbol left, Symbol right){ - return new Symbol(id,left,right); - } - public Symbol newSymbol(String name, int id, int left, int right, Object value){ - return new Symbol(id,left,right,value); - } - public Symbol newSymbol(String name, int id, int left, int right){ - return new Symbol(id,left,right); - } - public Symbol startSymbol(String name, int id, int state){ - return new Symbol(id,state); - } - public Symbol newSymbol(String name, int id){ - return new Symbol(id); - } - public Symbol newSymbol(String name, int id, Object value){ - return new Symbol(id,value); - } -} diff --git a/tools/lexer/jflex-1.4/src/java_cup/runtime/Scanner.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/Scanner.java deleted file mode 100644 index 32335516f082..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/Scanner.java +++ /dev/null @@ -1,25 +0,0 @@ -package java_cup.runtime; - -/** - * Defines the Scanner interface, which CUP uses in the default - * implementation of lr_parser.scan(). Integration - * of scanners implementing Scanner is facilitated. - * - * @version last updated 23-Jul-1999 - * @author David MacMahon - */ - -/* ************************************************* - 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 - new Symbol(lr_parser.EOF_sym()) or - null. - ***************************************************/ -public interface Scanner { - /** Return the next token, or null on end-of-file. */ - public Symbol next_token() throws java.lang.Exception; -} diff --git a/tools/lexer/jflex-1.4/src/java_cup/runtime/Symbol.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/Symbol.java deleted file mode 100644 index c9ce556d0a4c..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/Symbol.java +++ /dev/null @@ -1,116 +0,0 @@ -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 - xleft: is the left position Object in the original input file - xright: is the left position Object in the original input file -******************************************************************/ - -public class Symbol { - -// TUM 20060327: Added new Constructor to provide more flexible way -// for location handling -/******************************* - *******************************/ - public Symbol(int id, Symbol left, Symbol right, Object o){ - this(id,left.left,right.right,o); - } - public Symbol(int id, Symbol left, Symbol right){ - this(id,left.left,right.right); - } -/******************************* - 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; - } - -/*********************************** - 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/tools/lexer/jflex-1.4/src/java_cup/runtime/SymbolFactory.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/SymbolFactory.java deleted file mode 100644 index 86bae0837b9c..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/SymbolFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package java_cup.runtime; - -/** - * Creates the Symbols interface, which CUP uses as default - * - * @version last updated 27-03-2006 - * @author Michael Petter - */ - -/* ************************************************* - Interface SymbolFactory - - interface for creating new symbols - You can also use this interface for your own callback hooks - Declare Your own factory methods for creation of Objects in Your scanner! - ***************************************************/ -public interface SymbolFactory { - // Factory methods - /** - * Construction with left/right propagation switched on - */ - public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value); - public Symbol newSymbol(String name, int id, Symbol left, Symbol right); - /** - * Construction with left/right propagation switched off - */ - public Symbol newSymbol(String name, int id, Object value); - public Symbol newSymbol(String name, int id); - /** - * Construction of start symbol - */ - public Symbol startSymbol(String name, int id, int state); -} diff --git a/tools/lexer/jflex-1.4/src/java_cup/runtime/lr_parser.java b/tools/lexer/jflex-1.4/src/java_cup/runtime/lr_parser.java deleted file mode 100644 index 89068e1099dc..000000000000 --- a/tools/lexer/jflex-1.4/src/java_cup/runtime/lr_parser.java +++ /dev/null @@ -1,1253 +0,0 @@ - -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.

- * - * 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.

- * - * 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.

- * - * 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: - *

- *
short[][] production_table() - *
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). - *
short[][] action_table() - *
Provides a reference to the parse action table. - *
short[][] reduce_table() - *
Provides a reference to the reduce-goto table. - *
int start_state() - *
Indicates the index of the start state. - *
int start_production() - *
Indicates the index of the starting production. - *
int EOF_sym() - *
Indicates the index of the EOF Symbol. - *
int error_sym() - *
Indicates the index of the error Symbol. - *
Symbol do_action() - *
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. - *
void init_actions() - *
Code to initialize a special object that encapsulates user supplied - * actions (this object is used by do_action() to actually carry out the - * actions). - *
- * - * In addition to these routines that must be supplied by the - * generated subclass there are also a series of routines that may - * be supplied. These include: - *
- *
Symbol scan() - *
Used to get the next input Symbol from the scanner. - *
Scanner getScanner() - *
Used to provide a scanner for the default implementation of - * scan(). - *
int error_sync_size() - *
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. - *
void report_error(String message, Object info) - *
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. - *
void report_fatal_error(String message, Object info) - *
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. - *
void syntax_error(Symbol cur_token) - *
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); - *
void unrecovered_syntax_error(Symbol cur_token) - *
This method is called if syntax error recovery fails. In the default - * implementation it invokes:
- * report_fatal_error("Couldn't repair and continue parse", null); - *
- * - * @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() { - } - - /** - * Constructor that sets the default scanner. [CSA/davidm] - */ - public lr_parser(Scanner s) { - this(s,new DefaultSymbolFactory()); // TUM 20060327 old cup v10 Symbols as default - } - /** - * Constructor that sets the default scanner and a SymbolFactory - */ - public lr_parser(Scanner s, SymbolFactory symfac) { - this(); // in case default constructor someday does something - symbolFactory = symfac; - setScanner(s); - } - public SymbolFactory symbolFactory;// = new DefaultSymbolFactory(); - /** - * Whenever creation of a new Symbol is necessary, one should use this factory. - */ - public SymbolFactory getSymbolFactory(){ - return symbolFactory; - } - /*-----------------------------------------------------------*/ - /*--- (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 : getSymbolFactory().newSymbol("END_OF_FILE",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); - System.err.flush(); - 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(getSymbolFactory().startSymbol("START", 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"); - 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(getSymbolFactory().startSymbol("START",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 */ - Symbol right = ((Symbol)stack.peek());// TUM 20060327 removed .right - Symbol left = right;// TUM 20060327 removed .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 = ((Symbol)stack.pop()); // TUM 20060327 removed .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 = getSymbolFactory().newSymbol("ERROR",error_sym(), left, right); - 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 : - // 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= 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/tools/lexer/jflex-1.4/src/manifest b/tools/lexer/jflex-1.4/src/manifest deleted file mode 100644 index 1e139295c20c..000000000000 --- a/tools/lexer/jflex-1.4/src/manifest +++ /dev/null @@ -1 +0,0 @@ -Main-Class: JFlex.Main diff --git a/tools/lexer/jflex-1.4/src/skeleton.default b/tools/lexer/jflex-1.4/src/skeleton.default deleted file mode 100644 index 89f8fcc0a881..000000000000 --- a/tools/lexer/jflex-1.4/src/skeleton.default +++ /dev/null @@ -1,327 +0,0 @@ - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ ---- private static final int ZZ_BUFFERSIZE = ...; - - /** lexical states */ ---- lexical states, charmap - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - ---- isFinal list - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /** denotes if the user-EOF-code has already been executed */ - private boolean zzEOFDone; - ---- user class code - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ ---- constructor declaration - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead > 0) { - zzEndRead+= numRead; - return false; - } - // unlikely but not impossible: read 0 characters, but not at end of stream - if (numRead == 0) { - int c = zzReader.read(); - if (c == -1) { - return true; - } else { - zzBuffer[zzEndRead++] = (char) c; - return false; - } - } - - // numRead < 0 - return true; - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ ---- zzScanError declaration - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - ---- throws clause - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ ---- yypushback decl (contains zzScanError exception) - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - ---- zzDoEOF - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ ---- yylex declaration - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - ---- local declarations - - while (true) { - zzMarkedPosL = zzMarkedPos; - ---- start admin (line, char, col count) - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - ---- start admin (lexstate etc) - - zzForAction: { - while (true) { - ---- next input, line, col, char count, next transition, isFinal action - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; ---- line count update - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; ---- char count update - ---- actions - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; ---- eofvalue - } - else { ---- no match - } - } - } - } - ---- main - -} diff --git a/tools/lexer/jflex-1.4/src/skeleton.nested b/tools/lexer/jflex-1.4/src/skeleton.nested deleted file mode 100644 index 77717ad6a5ca..000000000000 --- a/tools/lexer/jflex-1.4/src/skeleton.nested +++ /dev/null @@ -1,428 +0,0 @@ - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ ---- private static final int ZZ_BUFFERSIZE = ...; - - /** lexical states */ ---- lexical states, charmap - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - ---- isFinal list - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /** denotes if the user-EOF-code has already been executed */ - private boolean zzEOFDone; - - /** the stack of open (nested) input streams to read from */ - private java.util.Stack zzStreams = new java.util.Stack(); - - /** - * inner class used to store info for nested - * input streams - */ - private static final class ZzFlexStreamInfo { - java.io.Reader zzReader; - int zzEndRead; - int zzStartRead; - int zzCurrentPos; - int zzMarkedPos; - int yyline; - int yycolumn; - char [] zzBuffer; - boolean zzAtEOF; - boolean zzEOFDone; - - /** sets all values stored in this class */ - ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead, - int zzCurrentPos, int zzMarkedPos, - char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) { - this.zzReader = zzReader; - this.zzEndRead = zzEndRead; - this.zzStartRead = zzStartRead; - this.zzCurrentPos = zzCurrentPos; - this.zzMarkedPos = zzMarkedPos; - this.zzBuffer = zzBuffer; - this.zzAtEOF = zzAtEOF; - this.zzEOFDone = zzEOFDone; - this.yyline = yyline; - this.yycolumn = yycolumn; - } - } - ---- user class code - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ ---- constructor declaration - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead > 0) { - zzEndRead+= numRead; - return false; - } - // unlikely but not impossible: read 0 characters, but not at end of stream - if (numRead == 0) { - int c = zzReader.read(); - if (c == -1) { - return true; - } else { - zzBuffer[zzEndRead++] = (char) c; - return false; - } - } - - // numRead < 0) - return true; - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Stores the current input stream on a stack, and - * reads from a new stream. Lexical state, line, - * char, and column counting remain untouched. - * - * The current input stream can be restored with - * yypopstream (usually in an <> action). - * - * @param reader the new input stream to read from - * - * @see #yypopStream() - */ - public final void yypushStream(java.io.Reader reader) { - zzStreams.push( - new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos, - zzMarkedPos, zzBuffer, zzAtEOF, - yyline, yycolumn) - ); - zzAtEOF = false; - zzBuffer = new char[ZZ_BUFFERSIZE]; - zzReader = reader; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yycolumn = 0; - } - - - /** - * Closes the current input stream and continues to - * read from the one on top of the stream stack. - * - * @throws java.util.EmptyStackException - * if there is no further stream to read from. - * - * @throws java.io.IOException - * if there was an error in closing the stream. - * - * @see #yypushStream(java.io.Reader) - */ - public final void yypopStream() throws java.io.IOException { - zzReader.close(); - ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop(); - zzBuffer = s.zzBuffer; - zzReader = s.zzReader; - zzEndRead = s.zzEndRead; - zzStartRead = s.zzStartRead; - zzCurrentPos = s.zzCurrentPos; - zzMarkedPos = s.zzMarkedPos ; - zzAtEOF = s.zzAtEOF; - zzEOFDone = s.zzEOFDone; - yyline = s.yyline; - yycolumn = s.yycolumn; - } - - - /** - * Returns true iff there are still streams left - * to read from on the stream stack. - */ - public final boolean yymoreStreams() { - return !zzStreams.isEmpty(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - * - * @see #yypushStream(java.io.Reader) - * @see #yypopStream() - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ ---- zzScanError declaration - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - ---- throws clause - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ ---- yypushback decl (contains zzScanError exception) - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - ---- zzDoEOF - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ ---- yylex declaration - int zzInput; - int zzAction; - ---- local declarations - - while (true) { - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL = zzMarkedPos; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - ---- start admin (line, char, col count) - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - ---- start admin (lexstate etc) - - zzForAction: { - while (true) { - ---- next input, line, col, char count, next transition, isFinal action - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; ---- line count update - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; ---- char count update - ---- actions - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; ---- eofvalue - } - else { ---- no match - } - } - } - } - ---- main - -}

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 diff --git a/tools/lexer/jflex-1.4/examples/binary/Makefile b/tools/lexer/jflex-1.4/examples/binary/Makefile deleted file mode 100644 index 52607f7f210e..000000000000 --- a/tools/lexer/jflex-1.4/examples/binary/Makefile +++ /dev/null @@ -1,22 +0,0 @@ - -JAVA = java -JAVAC = javac -JFLEX = jflex - -# ------------------------------------------------- - -all: run - -run: compile - $(JAVA) BinaryLexer * - -compile: BinaryLexer.class StraightStreamReader.class - -clean: - rm -f *~ *.class BinaryLexer.java - -%.class: %.java - $(JAVAC) $^ - -BinaryLexer.java: binary.flex - $(JFLEX) $^ diff --git a/tools/lexer/jflex-1.4/examples/binary/README b/tools/lexer/jflex-1.4/examples/binary/README deleted file mode 100644 index 8fceab48c4b8..000000000000 --- a/tools/lexer/jflex-1.4/examples/binary/README +++ /dev/null @@ -1,18 +0,0 @@ -This directory contains a small example of a scanner for binary files. - -The example tries to detect if an input file is a java class file by -checking if the first 4 bytes contain the magic number 0xCAFEBABE. -It uses a custom Reader class that copies bytes to characters one to -one. The characters the scanner gets to read are the bytes from the -input stream without any conversion. Many thanks to Stephen Ostermiller -for providing the custom Reader class, the original version of that -class is available from http://www.smo.f2s.com/utils/ - -See the JFlex manual for details on how to scan binaries and how -this is different from scanning text files. - -Files: -binary.flex the scanner spec -StraightStreamReader.java the custom reader class (by Stephen Ostermiller) -Makefile rules for make to compile and run the example -README this file diff --git a/tools/lexer/jflex-1.4/examples/binary/StraightStreamReader.java b/tools/lexer/jflex-1.4/examples/binary/StraightStreamReader.java deleted file mode 100644 index 7f418b5823cf..000000000000 --- a/tools/lexer/jflex-1.4/examples/binary/StraightStreamReader.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * An InputStreamReader that does no character encoding translations. - * Copyright (C) 2001 Stephen Ostermiller - * - * Changes: (2001 by Gerwin Klein ) - * - commented out package declaration for the example - * - original version at http://www.smo.f2s.com/utils/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * See COPYING.TXT for details. - */ - -// package com.Ostermiller.util; - -import java.io.*; - -/** - * A StraightStreamReader is a bridge from byte streams to character streams: It reads bytes - * and translates them into characters without using a character encoding. The characters - * that a StraightStreamReader returns may not be valid unicode characters but they are - * guaranteed to be in the 0x00 to 0xFF range. - *