[cl-net-snmp-cvs] r74 - in vendor: . zebu zebu/doc zebu/test zebu/test/binary
ctian at common-lisp.net
ctian at common-lisp.net
Wed Oct 17 13:05:40 UTC 2007
Author: ctian
Date: Wed Oct 17 09:04:46 2007
New Revision: 74
Added:
vendor/
vendor/zebu/
vendor/zebu/COPYRIGHT
vendor/zebu/ChangeLog
vendor/zebu/INSTALL.mk-defsystem
vendor/zebu/README
vendor/zebu/README.asdf-system
vendor/zebu/Version
vendor/zebu/doc/
vendor/zebu/doc/Zebu_intro.ps
vendor/zebu/doc/Zebu_intro.tex
vendor/zebu/test/
vendor/zebu/test/arith.zb
vendor/zebu/test/avm-p.lisp
vendor/zebu/test/avm.zb
vendor/zebu/test/avm1.zb
vendor/zebu/test/binary/
vendor/zebu/test/bug-exp.zb
vendor/zebu/test/bug-exp1.zb
vendor/zebu/test/bug-exp2.zb
vendor/zebu/test/bug-exp3.zb
vendor/zebu/test/dYoung.lisp
vendor/zebu/test/dangelse.zb
vendor/zebu/test/ex1.zb
vendor/zebu/test/ex1a.zb
vendor/zebu/test/ex2.zb
vendor/zebu/test/ex3.zb
vendor/zebu/test/ex4.40.zb
vendor/zebu/test/ex4.41.zb
vendor/zebu/test/ex4.42.zb
vendor/zebu/test/ex5.zb
vendor/zebu/test/ex6_2.zb
vendor/zebu/test/ex7.zb
vendor/zebu/test/ex8.zb
vendor/zebu/test/exercise.lisp
vendor/zebu/test/fsg.zb
vendor/zebu/test/g0.zb
vendor/zebu/test/g1.zb
vendor/zebu/test/g2.zb
vendor/zebu/test/hh-tdl.zb
vendor/zebu/test/hh-test.tdl
vendor/zebu/test/lex1.zb
vendor/zebu/test/lieber.zb
vendor/zebu/test/lr4-21.zb
vendor/zebu/test/mini-la.zb
vendor/zebu/test/mini.zb
vendor/zebu/test/pb.zb
vendor/zebu/test/pc.zb
vendor/zebu/test/pc1-p.lisp
vendor/zebu/test/pc1.zb
vendor/zebu/test/pc2.zb
vendor/zebu/test/pc3.zb
vendor/zebu/test/regextst.lisp
vendor/zebu/test/sample-avm1
vendor/zebu/test/sample-ex1
vendor/zebu/test/sb-tr.zb
vendor/zebu/test/simple.zb
vendor/zebu/test/tl1.zb
vendor/zebu/test/useless.zb
vendor/zebu/zebra-debug.lisp
vendor/zebu/zebu-actions.lisp
vendor/zebu/zebu-asdf-setup.lisp
vendor/zebu/zebu-aux.lisp
vendor/zebu/zebu-closure.lisp
vendor/zebu/zebu-compile-mg.lisp
vendor/zebu/zebu-compile.lisp
vendor/zebu/zebu-compiler.asd
vendor/zebu/zebu-compiler.system
vendor/zebu/zebu-driver.lisp
vendor/zebu/zebu-dump.lisp
vendor/zebu/zebu-empty-st.lisp
vendor/zebu/zebu-first.lisp
vendor/zebu/zebu-follow.lisp
vendor/zebu/zebu-g-symbol.lisp
vendor/zebu/zebu-generator.lisp
vendor/zebu/zebu-kb-domain.lisp
vendor/zebu/zebu-lalr1.lisp
vendor/zebu/zebu-loader.lisp
vendor/zebu/zebu-loadgram.lisp
vendor/zebu/zebu-lr0-sets.lisp
vendor/zebu/zebu-mg-hierarchy.lisp
vendor/zebu/zebu-mg.tab
vendor/zebu/zebu-mg.zb
vendor/zebu/zebu-oset.lisp
vendor/zebu/zebu-package.lisp
vendor/zebu/zebu-printers.lisp
vendor/zebu/zebu-regex.lisp
vendor/zebu/zebu-rr.asd
vendor/zebu/zebu-rr.system
vendor/zebu/zebu-slr.lisp
vendor/zebu/zebu-tables.lisp
vendor/zebu/zebu-tree-attributes.lisp
vendor/zebu/zebu.asd
vendor/zebu/zebu.system
Log:
Add zebu-3.5.5 as vendor
Added: vendor/zebu/COPYRIGHT
==============================================================================
--- (empty file)
+++ vendor/zebu/COPYRIGHT Wed Oct 17 09:04:46 2007
@@ -0,0 +1,251 @@
+
+
+ Copyright (C) 1989, by William M. Wells III
+ All Rights Reserved
+ Permission is granted for unrestricted non-commercial use.
+
+
+;;; *************************************************************************
+;;; Copyright (c) 1990, 91,92,93,94 Hewlett-Packard Company
+;;; All rights reserved.
+;;;
+;;; Use and copying of this software and preparation of derivative works
+;;; based upon this software are permitted. Any distribution of this
+;;; software or derivative works must comply with all applicable United
+;;; States export control laws.
+;;;
+;;; This software is made available AS IS, and Hewlett-Packard Company
+;;; makes no warranty about the software, its performance or its conformity
+;;; to any specification.
+;;;
+;;; Suggestions, comments and requests for improvements are welcome
+;;; and should be mailed to laubsch at hpl.hp.com
+;;; *************************************************************************
+
+ Copyright (C) 1990, 91,92,93,94,95,96 by Joachim Laubsch
+ All Rights Reserved
+
+ Permission is granted under the
+
+ GENERAL PUBLIC LICENSE
+ 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
Added: vendor/zebu/ChangeLog
==============================================================================
--- (empty file)
+++ vendor/zebu/ChangeLog Wed Oct 17 09:04:46 2007
@@ -0,0 +1,139 @@
+1999-01-13 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * In zebu-generator.lisp replace the def of type->predicate by new
+ def which considers the builtin types NUMBER IDENTIFIER STRING
+
+Thu Oct 2 12:43:10 1997 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * changes for CMUCL suggested by Raymond Toy <toy at rtp.ericsson.se>
+
+Fri Mar 15 09:41:11 1996 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * lexical categories are sorted in the way they are declared.
+ Fix supplied by (Marc Dzaebel), marc at rose.de
+
+Fri Mar 8 15:12:09 1996 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * test/exercise.lisp ((compile-module "ex2")): Release 3.4.8
+ print each rule if :verbose is T
+ eliminate EMPTY action
+ updated doc on number, identifier and string as subtypes of the
+ root domain
+
+Tue Mar 5 09:58:21 1996 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * Release 3.4.7
+ * COPYRIGHT: added GNU Copyleft
+ * COMPILE-ZEBU.lisp corrections for Allegro
+
+Thu Dec 21 17:01:24 1995 Joachim Laubsch <laubsch at hpwat03.cup.hp.com>
+
+ * 3.4.5 first release of a version that will run in ACL 3.0
+ Windows 3.1. The script winzebu translates to short filenames,
+ creating the subdirectory 'win'
+
+Tue Aug 2 14:17:18 1994 Joachim H. Laubsch (laubsch at hpljhl.hpl.hp.com)
+
+ * COMPILE-ZEBU.lisp: *load-binary-pathname-types* for
+ (and :SUN :LUCID)
+
+ * zebu-driver.lisp (read-parser): if a lex cat is scanned and
+ iff an IDENTIFIER is also expected prefer the IDENTIFIER in case
+ it is longer.
+
+Thu Jul 28 09:50:16 1994 Joachim H. Laubsch (laubsch at hpljhl.hpl.hp.com)
+
+ * zebu-loadgram.lisp: Fixed Bug with "." as separator
+ (ambiguous constituent names were made)
+ Version 3.3.2
+
+ * zebu-generator.lisp (insert-clause): warn if syntax is not
+ unparsable, because some non-terminal is unbound in semantics
+
+Fri May 13 11:00:43 1994 Joachim H. Laubsch (laubsch at hpljl)
+
+ * zebu-generator.lisp (insert-clause): fixed error that led to
+ wrong printers
+ (gen-printers): warning message for use of undefined domain type,
+ assume possibility of undefined type in is-subtype-of.
+
+Thu May 12 10:39:12 1994 Joachim H. Laubsch (laubsch at hpljl)
+
+ * zebu-tree-attributes.lisp: konrad at dfki.uni-sb.de fixed
+ bug in prepare-tree-attributes
+
+Thu Apr 28 15:55:22 1994 Joachim H. Laubsch (laubsch at hpljl)
+
+ * added debug-parser (&key (grammar t) (lexer nil))
+ (debug-parser) will load a version of read-parser
+ that traces the parsing engine's shift and reduce
+ moves.
+ (debug-parser :lexer t) will provide more information
+ on the lexer's progress.
+ (debug-parser :grammar nil :lexer nil) will reload the
+ silent and fast version of read-parser.
+
+Mon Apr 25 10:00:59 1994 Joachim H. Laubsch (laubsch at hpljl)
+
+ * zebu-driver.lisp: implemented state-sensitive token look-
+ ahead
+
+Tue Aug 31 17:13:47 1993 Joachim H. Laubsch (laubsch at hpljl)
+
+ * introduce the keyword CASE-SENSITIVE -- which can
+ be given as part of the grammar spec. If its value is
+ true the case of grammar keywords is significant.
+
+Tue Aug 17 20:14:52 1993 Joachim Laubsch (laubsch at hpljl)
+
+ * fix number token lexer bug. Now integer, ratio and float
+ should be recognized.
+
+Tue Jul 20 20:14:52 1993 Joachim Laubsch (laubsch at hpljl)
+
+ * introduce macro
+ def-tree-attributes (class &rest slots)
+ def-tree-attributes can be compiled and at load-time
+ no compiler is necessary.
+
+Mon May 17 21:05:39 1993 Joachim Laubsch (laubsch at hpljl)
+
+ * KB-equal compares now also sequences which are "dotted
+ lists".
+
+Wed May 5 10:57:05 1993 Joachim Laubsch (laubsch at hpljl)
+
+ * Printers for slots of type kb-sequence are now
+ generated properly if the Kleene +/* notation is
+ used.
+
+ Example:
+ ;; Domain definition
+
+ Program := [(-stmts kb-sequence)];
+ ..
+
+ ;; Rules
+
+ Program --> "begin" Stmt+ ";" "end"
+ { Program: [(-stmts Stmt+)] } ;
+ ..
+
+Tue Apr 27 16:03:50 1993 Joachim Laubsch (laubsch at hpljl)
+ * kb-subtypep is now a function analogous to CL's subtypep
+ KB-type-name-p is a function that returns true iff its
+ argument is a symbol naming a subtype of KB-DOMAIN.
+
+ Improved printer generation.
+
+ Checked for MCL compatibility and rewrote part of
+ regular expression compiler.
+
+Wed Apr 7 10:00:18 1993 Joachim Laubsch (laubsch at hpljl)
+
+ * To Do
+; Muessen die Kleene-Operatoren eigentlich die leere KB-sequence ans
+; Ende jeder Sequenz schreiben? Ein normales nil sollte mit Hilfe
+; eines modifizierten Printers dasselbe leisten, oder?
+
+
Added: vendor/zebu/INSTALL.mk-defsystem
==============================================================================
--- (empty file)
+++ vendor/zebu/INSTALL.mk-defsystem Wed Oct 17 09:04:46 2007
@@ -0,0 +1,26 @@
+The Zebu runtime system is all you need if you want to use the
+parser/generator that was produced by the compiler (in form of a .tab
+file / <grammar>-domain.lisp file).
+
+The Zebu-compiler is necessary in order to convert the external
+grammar description (in form of a .zb file) into a LALR(1) parsing
+table (in form of a .tab file), and associated printers and semantic
+functions (in form of a <grammar-name>-domain.lisp file).
+
+Installation (using ASDF)
+---------------------------------
+
+To compile a freshly installed zebu, evaluate:
+
+ (asdf:operate 'asdf:compile-op :zebu)
+ (asdf:operate 'asdf:compile-op :zebu-compiler)
+ (asdf:operate 'asdf:compile-op :zebu-rr)
+
+To load a component of zebu, evaluate
+(asdf:operate 'asdf:load-op <system-name>).
+
+Please tell me if installation works for you and, more importantly,
+when it does not.
+
+
+Rudi Schlatte <rudi at constantly.at>
\ No newline at end of file
Added: vendor/zebu/README
==============================================================================
--- (empty file)
+++ vendor/zebu/README Wed Oct 17 09:04:46 2007
@@ -0,0 +1,69 @@
+; -*- mode: Text ------------------------------------------------ ;
+; File: README
+; Author: Joachim H. Laubsch, laubsch at cup.hp.com
+***********************************************************
+;;; Copyright (c) 1989, Hewlett-Packard Company
+;;; All rights reserved.
+;;;
+;;; Use and copying of this software and preparation of derivative works
+;;; based upon this software are permitted. Any distribution of this
+;;; software or derivative works must comply with all applicable United
+;;; States export control laws.
+;;;
+;;; This software is made available AS IS, and Hewlett-Packard Company
+;;; makes no warranty about the software, its performance or its conformity
+;;; to any specification.
+;;;
+;;; Suggestions, comments and requests for improvements are welcome
+;;; and should be mailed to laubsch at hplabs.hpl.hp.com
+;;; ***********************************************************
+
+Zebu is a kind of YACC, and was originally implemented in Scheme by
+William M. Wells III. It generates an LALR(1) parsing table. To parse
+a string with a grammar, only this table and a driver need to be
+loaded.
+
+The present version of Zebu is an extension, rewritten in Common Lisp.
+It contains the ability to define several grammars and parsers
+simultaneously, a declarative framework for specifying the semantics,
+capabilities to define and use meta-grammars (grammars to express a
+grammar in), generation of unparsers (generators) using a 'reversible
+grammar' notation, as well as efficiency related improvements.
+
+Zebu also contains a lexical analyzer which is based on the regular
+expression compiler written by Lawrence E. Freil <lef at nscf.org>.
+
+Zebu compiles a grammar with 300 productions (including
+dumping of the tables to disk) in approx 2 minutes and 30 seconds on a
+HP 9000/370.
+
+This implementation has been tested in Lucid CL, Allegro CL, and
+MCL 2.0b.
+
+For documentation look into the doc/ directory:
+
+ Zebu_intro.tex contains an introduction to the Common Lisp
+ version and the enhancements. This is a LaTeX file. The PostScript
+ version is Zebu_intro.ps.
+
+The test/ directory contains a few examples. The file exercise.lisp runs
+many of them. Most example files also have a commented section at the end
+that suggest some tests.
+
+Other features, like grammar-names, string- or symbol-delimiters,
+parameterization of lexical analysis, and modes of interpretation of
+the grammar actions are also documented in zebu-loader.lisp.
+
+If you need help or have suggestions, send email to:
+
+ laubsch at cup.hp.com
+
+ Joachim H. Laubsch
+ Hewlett-Packard
+ 19477 Pruneridge Avenue (MS 47UI)
+ Cupertino, CA 95014
+
+ Tel 408-447-5211
+ Fax 408-447-5229
+
+************************************************************
Added: vendor/zebu/README.asdf-system
==============================================================================
--- (empty file)
+++ vendor/zebu/README.asdf-system Wed Oct 17 09:04:46 2007
@@ -0,0 +1,73 @@
+
+These are system definition files for the Zebu parser compiler. Zebu
+is a Lex/Yacc-sorta thing for Common Lisp.
+
+Zebu can be found found at
+ftp://ftp.digitool.com/pub/MCL/contrib/zebu-3.5.5.tgz, among other
+places.
+
+Read about Daniel Barlow's asdf (Another System Definition Facility)
+at http://ww.telent.net/cliki/asdf
+
+I have written asdf system definition files, taking the original
+system files as a guideline. The package definition file
+zebu-package.lisp was rewritten, since it depended on some symbols
+being present in the CL-USER package, amongst other things. The file
+zebu-compile-mg.lisp was added to compile the metagrammar (can't call
+zb:zebu-compile-file directly from the system files, since at read
+time the "zebu" package does not exist yet). The file
+zebu-asdf-setup.lisp was added to hook Zebu source files into asdf
+itself. A asdf system component (:file "some-grammar.zb") should do
+the right thing after loading Zebu itself.
+
+The one thing I was too lazy to do is rewrite #p"test;exercise.lisp".
+This one still excepts some symbols in the CL-USER package that are
+not there anymore (the original zebu-package.lisp imported them, and
+every other file expects them to be within the ZEBU package anyway).
+
+Please report any installation problems to me. Note that I am not the
+original author of Zebu itself, so I am unlikely to be able to help
+you with hairy bugs in that system.
+
+Oh, yes, how to use it:
+
+- Prepare everything:
+(asdf:operate 'asdf:load-op :zebu-compiler)
+(zb:zebu-compile-file "my-grammar-file.zb")
+(zb:zebu-load-file "my-grammar-file")
+(setf zb:*current-grammar* (zb:find-grammar "my-grammar"))
+
+- Ok now, parse away:
+(zb:file-parser "some-file")
+(zb:read-parser "2*(3+4)=++foo:")
+
+
+Notes:
+
+- Regrettably, Mr. Laubsch seems to be off the 'net at the moment. I
+tried to contact him and got no reply; other people on comp.lang.lisp
+reported similarly. I did not want to package a "new" version of Zebu
+without his okay, especially since none of the core functionality is
+changed and I did some package setup differently than him. Hence, the
+distribution of a "diff" package to be installed over the original
+sources.
+
+- Here is a list of files that I removed, since they are not needed if
+you load Zebu via asdf:
+
+COMPILE-Zebu.lisp
+Compile.lisp
+INSTALL.* ; except \1.asdf, obviously :-)
+machine
+Makefile
+shar-zebu
+Tar-zebu
+win* ; Yay!
+ZEBU-init.lisp
+zebu-package.lisp ; Replaced by new version
+ZEBU-sys.lisp ; the .system files were modelled after this one
+
+
+Have fun,
+
+Rudi Schlatte <rschlatte at ist.tu-graz.ac.at>
\ No newline at end of file
Added: vendor/zebu/Version
==============================================================================
--- (empty file)
+++ vendor/zebu/Version Wed Oct 17 09:04:46 2007
@@ -0,0 +1 @@
+3.5.5
Added: vendor/zebu/doc/Zebu_intro.ps
==============================================================================
--- (empty file)
+++ vendor/zebu/doc/Zebu_intro.ps Wed Oct 17 09:04:46 2007
@@ -0,0 +1,3571 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: Zebu_intro.dvi
+%%Pages: 31
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSCommandLine: dvips Zebu_intro.dvi -o Zebu_intro.ps
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1999.01.13:1307
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+TeXDict begin 40258431 52099146 1000 600 600 (Zebu_intro.dvi)
+ at start /Fa 1 111 df<3907C007E0391FE03FF83918F8783E393879E01E39307B801F38
+707F00126013FEEAE0FC12C05B00815C0001143E5BA20003147E157C5B15FC0007ECF808
+1618EBC00115F0000F1538913803E0300180147016E0001F010113C015E390C7EAFF0000
+0E143E251F7E9D2B>110 D E /Fb 4 118 df<003FBA12E0A71AC01A80CB120F4E130060
+614E5A18FF615F614D5B5F615F614D90C7FC5F60177F604D5A5E604C5B5E605E604C90C8
+FC5E5F167F5F4C5A5D5F5D5F4B5B5D5F4B90C9FCA24B5A157F5E4B5A5C5E5C5E4A5B5C5E
+5C93CAFC4A5A147F5D14FF5D495B5B5D495B5B5D5B92CBFC495A137F5C13FF5C485B5A5C
+5A5C485B5A91CCFC485A90BA12E05ABBFCA7436479E352>90 D<EAFFE0B3B3ED3FF09138
+03FFFE021F7F027F14C001E1B67E01E78101EF8190B77E83DAF8077FECC00091C7003F13
+80498001F8020713C0A2496E13E049807013F0A2177F18F8A2173FA318FC171FACEF3FF8
+A4177F18F017FFA24C13E07F4C13C06D5C6D4A13805E01FF027F13006E48485AECF00F91
+B65A5F01EF5D01E75D01E3158001E092C7FC023F13FC020F13F0C81380366576E345>98
+D<4AB4FC021F13E0027F13FC49B57E01076E7E498149814981498190B51201489039F800
+7FFC4849EB1FFE02C0130F48496D7E91C77E5A496E1380485A82484816C0177F5B127FA2
+4916E090B8FCB9FCA701C0CAFCA37FA3127FA27FA2123F7FA26C7E7F120F6D16406C6DEC
+01C06E14036C6D140F6C01F8143F6C01FE903801FFE090397FFF801F6D90B6FC7F6D16C0
+6D16006D5D010015F8023F14C0020F49C7FC020013E033417CBF3C>101
+D<D8FFE0EC07FFB3B3A95EA25E5EA26D5C4BB5FC6D13076CB4133F91B7FCA26C15E716C7
+6C15076C14FC6C14F06C148026007FF0C8FC303F76BD45>117 D
+E /Fc 24 122 df<EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF
+003FB512F8000F14E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839
+FFE7CFFEEBC7C7EB07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>42
+D<007FB6FCB71280A46C150021067B9B2C>45 D<1307497EA2131FA2133F137F13FF5A12
+07127FB5FC13DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C3477B32C>49
+D<EB0FF890387FFF8048B512E00007804814FC391FF80FFE393FE001FF903880007F48C7
+EA3F80007E141F00FE15C0150F6C15E01507A3127E123CC8FCA2150F16C0151F1680153F
+16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7FC495A495A495AEB3FE0EB7F80
+49C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FCB7FCA36C15C023347CB32C>I<
+EB0FFC90387FFF8048B512E0000714F84880391FF807FEEBC0004848137F6D7F1680151F
+A26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1FF890381FFFF0495BA215F86D7F9038
+0007FEEC00FF81ED3F80ED1FC0150FA216E01507A2123C127EB4FC150F16C0A248141F00
+7FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C6C14E0C66C1380D90FFCC7FC23357C
+B32C>I<EC07F04A7E141F143FA2147EA214FCEB01F8A2EB03F0EB07E0A2EB0FC0EB1F80
+A2EB3F00137EA25B485AA2485A5B1207485AA2485A48C7FCA2127E5AB712FC16FEA36C15
+FCC8EAF800AA91387FFFF091B512F8A36E13F027347EB32C>I<3801FFF0000713FE001F
+6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC
+1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB6
+12FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>97 D<903803FFE0011F13F8
+017F13FE48B5FC48804848C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127E
+A2127F6C140F6DEB1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13
+E0010390C7FC21247AA32C>99 D<EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF48
+14FF5A3807FC0F380FF00348487E497E48487F90C7FC007E80A212FE5AA87E007E5CA200
+7F5C6C7E5C6C6C5A380FF0073807FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC
+27337DB22C>I<EB03FE90381FFFC0017F13F048B57E48803907FE03FE390FF800FFD81F
+E0EB3F805B4848EB1FC090C7120F5A007E15E015075AB7FCA416C000FCC9FC7E127EA212
+7F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001FF13FF000190B512806C1500013F
+13FC010F13F00101138023247CA32C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14
+F090390FE03F0014C092C7FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F0
+4880A36C5C21337DB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC0
+80B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>105
+D<EA7FE0487EA3127F1201AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A
+5A4A5A4A5A4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C
+7E496C7E811400157E811680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C
+>107 D<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<
+3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF8
+3F496C487E01F013E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8
+D87FFC4913F0023F137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6C
+B6FC00019038F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C
+01E0140029247FA32C>I<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001
+FE48486C7E0180133F003F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2
+007F141F6C15806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C001
+1F90C7FCEB07FC23247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C15800001
+9038F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14
+FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813
+F8EC3FC091C8FCAD387FFFE0B57EA36C5B27367FA32C>I<903903FC078090391FFF0FC0
+017F13CF48B512EF4814FF3807FE07380FF00148487E49137F4848133F90C7FC48141F12
+7E150F5AA87E007E141FA26C143F7F6C6C137F6D13FF380FF0033807FC0F6CB6FC6C14EF
+6C6C138F6D130FEB07F890C7FCAD0203B5FC4A1480A36E140029367DA32C>I<D87FFEEB
+3FC0B53801FFF0020713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A1300
+5CA25C5CA391C8FCAF007FB512E0B67EA36C5C26247EA32C>I<90387FF8700003B512F8
+120F5A5A387FC00F387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEB
+FF80000314E0C66C13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D
+133E6D13FE9038F007FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E13
+3FA9007FB6FCB71280A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE0
+7F6DB51280160001035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3
+007F7F0001EB000FB3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603
+FE07130029247FA32C>I<3A7FFF01FFFCB5008113FE148314816C010113FC3A03E0000F
+806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D5BA2EB0F815D
+A2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143EA2147E147CA2
+14FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA07E0
+27367EA32C>121 D E /Fd 46 122 df<EF7FF80407B5FC93391FC00FC093393E0001E0
+04FCEB00F04B4813014B4813075E0307140FA24B5A19E0031FEC03804C90C7FCA3153F93
+C9FCA45D157EA415FE91B8FCA260DA00FCC7127E020115FE4B5CA317016014035D170360
+A214074B130760A3020F140F4B5CA3171F021F5D5DA2053F13E01801023F16C092C7FCA2
+EF7F03057E13805C027E15071900173E180E02FEEC1E1E4AEC1F1CEF07F8EF01E094C8FC
+495AA35C1303A2001C5B127FEAFF075CA2495A00FE90CBFCEAF81FEA701EEA783CEA1FF0
+EA07C03C5A83C537>12 D<13F0EA03F8EA07FC120FA6EA03CCEA001C1318A213381330A2
+137013E013C0120113801203EA0700120E5A5A5A5A5A0E1D6BC41E>39
+D<1560A2157081A281151E150E150FA2811680A3ED03C0A516E0A21501A71503A91507A2
+16C0A4150FA21680A2151FA21600A25DA2153EA2157EA2157C15FCA25D1401A25D14035D
+A214075D140F5DA24AC7FCA2143EA25C147814F8495AA2495A5C1307495A91C8FC131E13
+3E5B13785B485A485A485A48C9FC121E5A5A12E05A23647FCA28>41
+D<007FB5FCB6FCA214FEA21805789723>45 D<120FEA3FC0127FA212FFA31380EA7F0012
+3C0A0A76891E>I<16C01501A215031507ED0F80151F153F157F913801FF005C140F147F
+903807FCFEEB0FF0EB0700EB00015DA314035DA314075DA3140F5DA3141F5DA3143F5DA3
+147F92C7FCA35C5CA313015CA313035CA313075CA2130FA2131F133FB612FCA25D224276
+C132>49 D<ED3FC0913801FFF0913807C07C4AC67E021CEB1F800278130F4AEB07C04948
+14E04A1303494814F0130749C7FCEB0E06D91E0714F8EB1C03133C1338137813704A1307
+D9F00614F013E0140E020C130F0001011C14E0EBC0180238131F4A14C06C6C48EB3F80D9
+E1C0137FD97F801400013EC712FE90C7485A4B5A4B5A4B5AED1F804BC7FC15FC4A5AEC03
+E0EC0FC0023FC8FC147CEB01F0495AEB0780011FC9FC133E49EC03805B49140748481500
+485A48485C90C8121E5A001E5D001C157CD83FFC5C9038FFC0013A7C0FFC07F0D87803B5
+5AEA700126F0007F5B486D90C7FCEC0FFEEC03F82D4478C132>I<EF03801707A24D7EA2
+171FA2173F177FA217FFA25EA2EE03BF1607173F160F160E161C841638171F167016F016
+E0ED01C0A2ED0380A2ED0700A2150E151E151C5D845D170F5D14015D14035D4AC7FC92B6
+FC5CA2021CC7120F143C14385CA24A81A249481407A2495A130791C8FC130E131EA25B13
+7C13FC00014C7ED807FE151FB500E00107B512F8A219F03D477BC648>65
+D<DC0FF8130393B513070307ECC00F923A1FF803E01F923A7FC000F81E4BC7EA7C3EDA03
+FCEC3C7EDA0FF0EC1EFE4A48EC0FFC4A4814074AC8FC02FE1503494816F8130349481501
+495A494816F0495A137F5C01FF17E04890C9FCA2485A19C0485AA2485A95C7FC121F5BA2
+123F5BA3127F5BA4485AA41838A218781870A218F0007F5F1701601703003F5F17076D4B
+C7FC001F160E171E6C6C5D6D5D00075E6C6C4A5A6DEC07C06C6C4A5AD8007F023EC8FCD9
+3FC013FC90391FF807F00107B512C0010191C9FC9038001FF0404872C546>67
+D<91B712F818FF19C00201903980003FF06E90C7EA0FF84AED03FCF000FE4B157FA2F13F
+800203EE1FC05DF10FE0A214074B16F01907A2140F5D1AF8A2141F5DA2190F143F5D1AF0
+A2147F4B151FA302FF17E092C9123FA34918C04A167F1A80A2010317FF4A1700A24E5A13
+074A4B5A611807010F5F4A4B5A181F61011F4C5A4A4BC7FC18FE4D5A013F4B5A4A4A5A4D
+5A017FED3FC005FFC8FC4AEB03FE01FFEC1FF8B812E094C9FC16F845447AC34A>I<91B9
+12C0A30201902680000313806E90C8127F4A163F191F4B150FA30203EE07005DA314074B
+5D190EA2140F4B1307A25F021F020E90C7FC5DA2171E023F141C4B133C177C17FC027FEB
+03F892B5FCA39139FF8003F0ED00011600A2495D5CA2160101034B13705C19F061010791
+C8FC4A1501611803010F5F4A150796C7FC60131F4A151E183E183C013F167C4A15FC4D5A
+017F1503EF0FF04A143F01FF913803FFE0B9FCA26042447AC342>I<DC0FF81306DCFFFE
+130E03079038FF801E923A1FF807E03E923A7F8001F03CDA01FEC7EA787CDA03F8EC3CFC
+DA0FF0141D4A48EC1FF8DA3F80140F4AC8FCD901FE1507494816F05C01071603495A4948
+16E0495A137F5C01FF17C04890C9FC5B12031980485AA2485A95C7FC121F5BA2123F5BA3
+127F5BA4485A043FB512E0A39339001FF80060A360A2007F163F60A3177F003F5F7F121F
+17FF6D93C7FC000F5D6C6C5C7F6C6C4A5A6C6CEC1F3E6C6C143ED93FC0EBF81E903A1FF0
+07F01C0107B5EAC00C010149C9FC9038003FF03F4872C54B>71 D<027FB512E091B6FCA2
+0200EBE000ED7F8015FFA293C7FCA35C5DA314035DA314075DA3140F5DA3141F5DA3143F
+5DA3147F5DA314FF92C8FCA35B5CA313035CA313075CA3130F5CA3131F5CA2133FA25CEB
+FFE0B612E0A25D2B447BC326>73 D<91B612F0A25F020101C0C7FC6E5B4A90C8FCA25DA3
+14035DA314075DA3140F5DA3141F5DA3143F5DA3147F5DA314FF92C9FCA35B5CA3010316
+104A1538A21878010716705C18F018E0010F15015C18C01703011F15074A1580170FA201
+3FED1F004A5C5F017F15FE16034A130F01FFEC7FFCB8FCA25F35447AC33D>76
+D<91B56C93387FFFC08298B5FC02014DEBC0006E614A5FA203DF4C6CC7FC1A0E63912603
+CFE05D038F5F1A381A711407030FEEE1FCA2F101C3020FEE0383020E60F107036F6C1507
+021E160E021C60191CF1380F143C023804705BA2F1E01F0278ED01C091267003F85EF003
+801A3F02F0ED070002E0030E5CA24E137F130102C04B91C8FC606201036D6C5B02805F4D
+5A943803800113070200DA07005BA2050E1303495D010E606F6C5A1907011E5D011C4B5C
+A27048130F133C01384B5C017892C7FC191F01F85C486C027E5DD807FE027C4A7EB500F0
+0178013FB512C0A216705A447AC357>I<91B56C49B512E0A28202009239000FFC00F107
+F0706E5A4A5F15DF705D1907EC03CFDB8FF892C7FCA203875D02077F0303150EA270141E
+EC0F01020E161C826F153C141E021C6E1338167F1978023C800238013F1470A27113F002
+78131F02705E83040F130102F014F84A5E1607EFFC0313014A01035C17FE180701031401
+4A02FF90C8FCA2705B0107168F91C8138E177F18DE5B010EED3FDC18FCA2011E151F011C
+5EA2170F133C01386F5A1378A201F81503486C5EEA07FEB500F01401A2604B447AC348>
+I<91B712F018FEF0FF800201903980007FE06E90C7EA1FF04AED07F818034B15FCF001FE
+1403A24B15FFA21407A25DA2140FF003FE5DA2021F16FC18074B15F8180F023F16F0F01F
+E04B15C0F03F80027FED7F0018FE4BEB03FCEF0FF002FFEC7FC092B6C7FC17F892CAFC5B
+A25CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA25C497EB67E
+A340447AC342>80 D<91B77E18F818FE020190398001FF806E90C7EA3FC04AED1FE0F00F
+F04BEC07F8180319FC14034B15FEA314075DA3020FED07FC5DA2F00FF8141F4B15F0F01F
+E0F03FC0023F16804BEC7F0018FEEF03F8027F4A5A4BEB1FC04CB4C7FC92B512F891B612
+E092380003F8EE00FE177F496F7E4A6E7EA28413034A140FA2171F13075CA2173F130F5C
+A24D5A131F5CA3013F170E5CA2017FEE801E191C4A163C496C1638B66C90383FC070051F
+13F094380FE1E0CA3803FF80943800FE003F467AC347>82 D<DB03FE130C92390FFF801C
+037FEBE03C9238FE03F8913A03F0007C7C4A48EB3EF84A48131F4A48130F4AC7FC027EEC
+07F05C1703495A18E0495AA213074A15C0A3130F1880A28094C7FCA280806D7EECFFE015
+FC6DEBFF806D14F016FC6D14FF023F80020F801403DA003F7F150703007F163F161F160F
+A21607A3120716031607A2485EA2120E160F001E5EA2001F4B5AA2484BC7FC6D143E167E
+6D5C007F4A5A6D495AD87CF0495AD8787CEB1F8027F03F807FC8FC90381FFFFCD8E00713
+F039C0007F80364879C537>I<48B912F85AA2913B0007FC001FF0D807F84A130701E001
+0F140349160148485C90C71500A2001E021F15E05E121C123C0038143F4C1301007818C0
+127000F0147F485DA3C800FF91C7FC93C9FCA35C5DA314035DA314075DA3140F5DA3141F
+5DA3143F5DA3147F5DA314FF92CAFCA35B5CA21303A21307497E007FB612C0A25E3D446F
+C346>I<001FB500F090383FFFFCA326003FF0C7000113806D48913800FE00013F167C18
+785C187018F0017F5E5CA2170101FF5E91C8FCA21703485F5BA21707000394C7FC5BA25F
+0007160E5BA2171E120F49151CA2173C121F491538A21778123F491570A217F0127F495D
+A2160100FF5E90C8FCA216035F16074893C8FC5E160E161E5E007E1538007F15785E6C4A
+5A6D495A001F4A5A6D49C9FC6C6C133E6C6C13F83903FC07F0C6B512C0013F90CAFCEB07
+F83E466DC348>I<B6913807FFFEA25C000301C0020013E06C90C9EA7F00183E183C60A2
+6C1770601701604D5AA24DC7FC5F170E6E5CA2017F5D177817705FA24C5AA24C5A16076E
+91C8FC160E133F5E163C16385EA25E15015E6E485AA24BC9FC131F150E151E151C5DA25D
+15F05DECF1C0A290380FF38014F792CAFC14FEA25CA25C5CA25C13075CA25C91CBFC3F46
+6CC348>I<EC1F80EC7FE0903901F07070903907C039F890380F801D90381F001F013E6D
+5A137E5B484813075E485A120749130F000F5DA2485A151F003F5D5BA2153F007F92C7FC
+90C7FCA25D157E12FEA29238FE0380EDFC071700A2007E13015E913803F80E1407003E01
+0F131E161C6C131C02385B3A0F80F078783A07C3E07C703A01FF801FE03A007E00078029
+2D76AB32>97 D<EB0FE0EA07FFA338001FC0130F131FA25CA3133F91C8FCA35B137EA313
+FE5BA312015BEC1F80EC7FE03903F9E0F89038F3C07C9038F7003E13FE48487F5BA24914
+80485AA25BA2121F5BA2153F123F90C7FCA2157F481500127EA25D5D5AA24A5AA24A5AA2
+007C5C4A5A140F5D4A5A003C49C7FC003E137E001E5B6C485A380783E03803FF80C648C8
+FC214676C42D>I<EC0FE0EC7FF8903801F81E903807E00F90390F80078090381F000301
+7E14C049131F0001143F5B4848EB7F801207485AED3E00484890C7FCA2485AA2127F90C9
+FCA35A5AA45AA5ED0180ED03C0ED0780A2007CEC0F00007E141E003E147C15F06CEB03E0
+390F800F802607C07EC7FC3801FFF838007FC0222D75AB2D>I<EE07F0ED03FFA3923800
+0FE01607160FA217C0A2161FA21780A2163FA21700A25EA2167EA216FEA25EEC1F80EC7F
+E1903801F071903907C039F890380F801D90381F001F013E130F017E5C5B48481307A248
+485C120749130F120F5E485A151F123F495CA2153F127F90C790C7FCA25DA200FE147EA2
+9238FE0380160703FC1300A2007E13015E913803F80E1407003E010F131E161C6C131C02
+385B3A0F80F078783A07C3E07C703A01FF801FE03A007E0007802C4676C432>I<EC0FE0
+EC7FF8903801F83E903807C00F90391F800780EB3F00017E14C0491303485A4848130700
+0715805B000F140F484814005D4848133E15FCEC07F0007FEBFFC0D9FFFEC7FC14C090C9
+FC5A5AA55AA4ED0180ED03C0007CEC0780A2007EEC0F00003E141E157C6C14F06CEB03E0
+3907800F802603C07EC7FC3801FFF838003FC0222D75AB2D>I<EE0F80EE3FE0EEF87092
+3801F038923803E0F8923807E1FC16C3ED0FC7A2EE87F892381F83F0EE81E0EE8000153F
+93C7FCA45D157EA415FE5DA349B512FEA390260001F8C7FCA314035DA414075DA4140F5D
+A4141F5DA4143F92C8FCA55C147EA314FE5CA413015CA4495AA35C1307121C007F5B12FF
+495AA291C9FC485AEAF81E485AEA7878EA1FF0EA07C02E5A83C51E>I<15FCEC03FF9139
+0F83838091393E01CFC091387C00EF4A13FF4948137F010315804948133F495A131F4A14
+00133F91C75A5B167E13FE16FE1201495CA215011203495CA21503A2495CA21507A25EA2
+150F151F5E0001143F157F6C6C13FF913801DF8090387C039F90383E0F3FEB0FFCD903F0
+90C7FC90C7FC5DA2157EA215FEA25DA2001C495A127F48495A14074A5A485C023FC8FC00
+F8137E387C01F8381FFFE0000390C9FC2A407BAB2D>I<14FE137FA3EB01FC13001301A2
+5CA21303A25CA21307A25CA2130FA25CA2131FA25C157F90393F83FFC091388F81F09138
+1E00F802387F4948137C5C4A137EA2495A91C7FCA25B484814FE5E5BA2000314015E5BA2
+000714035E5B1507000F5DA249130F5E001F1678031F1370491480A2003F023F13F0EE00
+E090C7FC160148023E13C01603007E1680EE070000FEEC1E0FED1F1E48EC0FF80038EC03
+E02D467AC432>I<143C147E14FE1301A3EB00FC14701400AE137C48B4FC3803C7803807
+03C0000F13E0120E121C13071238A21278EA700F14C0131F00F0138012E0EA003F1400A2
+5B137EA213FE5B12015BA212035B141E0007131C13E0A2000F133CEBC038A21478EB8070
+14F014E0EB81C0EA0783EBC7803803FE00EA00F8174378C11E>I<16F0ED03F8A21507A3
+16F0ED01C092C7FCAEEC01F0EC07FCEC1E1EEC380F0270138014E0130114C0EB03800107
+131F1400A2130E153F131E011C140090C7FC5DA2157EA215FEA25DA21401A25DA21403A2
+5DA21407A25DA2140FA25DA2141FA25DA2143FA292C7FCA25C147EA214FE001C5B127F48
+485A495AA248485A495AD8F81FC8FCEA707EEA3FF8EA0FC0255683C11E>I<14FE137FA3
+EB01FC13001301A25CA21303A25CA21307A25CA2130FA25CA2131FA25C167E013F49B4FC
+92380783C09138000E07ED3C1F491370ED603F017E13E0EC01C09026FE03801380913907
+000E00D9FC0E90C7FC5C00015B5C495AEBF9C03803FB8001FFC9FCA214F03807F3FCEBF0
+7F9038E01FC06E7E000F130781EBC003A2001F150FA20180140EA2003F151E161C010013
+E0A2485DA2007E1578167000FE01015B15F1489038007F800038021FC7FC2A467AC42D>
+I<EB03F8EA01FFA3380007F013031307A214E0A2130FA214C0A2131FA21480A2133FA214
+00A25BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA25B
+A2123FA290C7FCA2387F01C01303007E1380A2130700FE130012FCA25B130EEA7C1E131C
+EA3C3CEA3E786C5AEA07C0154678C419>I<D801F0D90FE0EB07F0D803FCD97FF8EB3FFC
+28071E01F03EEBF81F3E0E1F03C01F01E00F80271E0F8700D983807F001C018E90390F87
+0007003C019C148E003801B802DC8002F814FC26781FF05C0070495CA24A5C00F0494948
+130FD8E03F6091C75B1200043F141F4960017E92C7FCA24C143F01FE95C7FC49147E6104
+FE147E1201494A14FE610301EE0780000305011400494A14F8A2030302035B0007F0F00E
+495C1A1E0307EDE01C000F193C494A153862030F020113F0001FF0F1E0494A903800FF80
+0007C7D80380023EC7FC492D78AB50>I<D801F0EB0FE0D803FCEB7FF83A071E01F03E3A
+0E0F03C01F001ED987001380001C018E130F003C139C003801B814C014F838781FF00070
+5BA25C00F049131FD8E03F158091C7FC1200163F491500137EA25E01FE147E5B16FE5E12
+014913015E170F00030203130E4914F0A20307131E0007EDE01C5B173CEEC038000F1678
+49157017E0ED03C1001FEDE3C049903801FF000007C8127C302D78AB37>I<EC0FE0EC7F
+FC903801F83E903907E00F8090390F8007C0EB1F00017EEB03E04914F0A2484813014848
+14F81207485AA2485AA2485A1503127F90C7FCA215074815F05AA2150F16E05AED1FC0A2
+1680153F16005D157E5D007C495A007E495A003E5C4A5A6CEB1F80260F803EC7FC3807C0
+FC3801FFF038003F80252D75AB32>I<D903E0137E903A07F801FF80903A0E3C0783E090
+3A1C1E0F01F0903A3C1F1C00F801385B017849137C01705BA24A48137E01E05BA292C7FC
+00015B13C0147EC7FC02FE14FEA25CA20101140117FC5CA20103140317F85CA20107EC07
+F0A24AEB0FE0A2010F15C0EE1F80163F1700496C137E5E4B5A9138B803F090393F9C07E0
+91389E0F80DA07FEC7FCEC01F849C9FCA2137EA213FEA25BA21201A25BA21203A21207B5
+12F0A25C2F3F7FAB32>I<D801F0EB3F803A03FC01FFF03A071E03C0F83A0E0F0F007C00
+1E90389E01FC001C139CECB803003813F0A2D91FE013F80078EC00E00070491300A200F0
+5BEAE03F91C8FC1200A25B137EA313FE5BA312015BA312035BA312075BA3120F5BA3121F
+5B0007C9FC262D78AB29>114 D<EC0FE0EC7FF8903801F01E903803C00F903907800780
+90380F0003011E14C0150749131FA2017CEB3F801378137CED0E0092C7FC137E137F14F0
+14FF6D13C06D13F06D7F6D7F1300EC0FFE14011400157F81120E003F141E487EA2153E48
+C7123CA200FC5C12705D0078495A6C495A6CEB0F80260F803EC7FC3803FFF838007FC022
+2D7AAB28>I<1470EB01F8A313035CA313075CA3130F5CA3131F5CA2007FB512E0B6FC15
+C0D8003FC7FCA25B137EA313FE5BA312015BA312035BA312075BA3120F5BA2EC0780001F
+140013805C140E003F131EEB001C143C14385C6C13F0495A6C485AEB8780D807FEC7FCEA
+01F81B3F78BD20>I<137C48B414072603C780EB1F80380703C0000F7F000E153F121C01
+07150012385E1278D8700F147E5C011F14FE00F05B00E05DEA003FEC0001A2495C137E15
+0313FE495CA215071201495CA2030F13380003167849ECC070A3031F13F0EE80E0153F00
+011581037F13C06DEBEF8300000101148090397C03C787903A3E0F07C70090391FFE01FE
+903903F000782D2D78AB34>I<017C143848B414FC3A03C78001FE380703C0000F13E012
+0E001C14000107147E1238163E1278D8700F141E5C131F00F049131C12E0EA003F91C712
+3C16385B137E167801FE14705BA216F0000115E05B150116C0A24848EB0380A2ED0700A2
+150E12015D6D5B000014786D5B90387C01E090383F0780D90FFFC7FCEB03F8272D78AB2D
+>I<017CEE038048B4020EEB0FC02603C780013FEB1FE0380703C0000E7F5E001C037E13
+0F01071607123804FE130300785DEA700F4A1501011F130100F001804914C012E0EA003F
+DA000314034C14805B137E0307140701FE1700495CA2030F5C0001170E495CA260A24848
+495A60A2601201033F5C7F4B6C485A000002F713036D9039E7E0078090267E01C349C7FC
+903A1F0781F81E903A0FFF007FF8D901FCEB0FE03B2D78AB41>I<02F8133FD907FEEBFF
+E0903A0F0F83C0F0903A1C07C780F890393803CF03017013EE01E0EBFC07120101C013F8
+000316F00180EC01C000074AC7FC13001407485C120EC7FC140F5DA3141F5DA3143F92C8
+FCA34AEB03C01780147EA202FEEB0700121E003F5D267F81FC130E6E5BD8FF83143CD903
+BE5B26FE079E5B3A7C0F1F01E03A3C1E0F83C0271FF803FFC7FC3907E000FC2D2D7CAB2D
+>I<137C48B414072603C780EB1F80380703C0000F7F000E153F001C1600130712385E00
+78157EEA700F5C011F14FE00F0495B12E0EA003FEC00015E5B137E150301FE5C5BA21507
+00015D5BA2150F00035D5BA2151F5EA2153F12014BC7FC6D5B00005BEB7C0390383E0F7E
+EB1FFEEB03F090C712FE5DA214015D121F397F8003F0A24A5A4848485A5D48131F00F049
+C8FC0070137E007813F8383801F0381E07C06CB4C9FCEA01FC294078AB2F>I
+E /Fe 7 111 df<49B4FC010F13E0013F13F8497F48B6FC4815804815C04815E04815F0
+A24815F84815FCA3B712FEAA6C15FCA36C15F86C15F0A26C15E06C15C06C15806C15006C
+6C13FC6D5B010F13E0010190C7FC27267BAB32>15 D<ED0FE015FF913803FC00EC0FE0EC
+3FC04A5A4AC7FC5C495AA2495AB3AD495AA2495A131F495A495A01FEC8FCEA07F8EAFFE0
+A2EA07F8EA00FEEB7F806D7E6D7E130F6D7EA26D7EB3AD6D7EA26D7E806E7E6E7EEC0FE0
+EC03FC913800FFE0150F236479CA32>102 D<12FEEAFFE0EA07F8EA00FEEB7F806D7E6D
+7E130F6D7EA26D7EB3AD6D7EA26D7E806E7E6E7EEC0FE0EC03FC913800FFE0A2913803FC
+00EC0FE0EC3FC04A5A4AC7FC5C495AA2495AB3AD495AA2495A131F495A495A01FEC8FCEA
+07F8EAFFE048C9FC236479CA32>I<140C141E143EA2143C147CA214F8A214F01301A2EB
+03E0A214C01307A2EB0F80A214005BA2133EA2133C137CA2137813F8A2485AA25B1203A2
+485AA25B120FA248C7FCA2121E123EA25AA2127812F8A41278127CA27EA2121E121FA26C
+7EA212077FA26C7EA212017FA26C7EA21378137CA2133C133EA27FA27F1480A2EB07C0A2
+130314E0A2EB01F0A2130014F8A2147CA2143C143EA2141E140C176476CA27>I<126012
+F07EA21278127CA27EA2121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137C
+A2133C133EA27FA27F1480A2EB07C0A2130314E0A2EB01F0A2130014F8A2147CA2143C14
+3EA4143C147CA214F8A214F01301A2EB03E0A214C01307A2EB0F80A214005BA2133EA213
+3C137CA2137813F8A2485AA25B1203A2485AA25B120FA248C7FCA2121E123EA25AA21278
+12F8A25A126017647BCA27>I<126012F0B3B3B3B3B3A81260046474CA1C>I<126012F07E
+A21278127CA2123C123EA2121E121FA26C7EA212077FA212037FA212017FA26C7EA21378
+137CA2133C133EA2131E131FA26D7EA2130780A2130380A2130180A26D7EA21478147CA2
+143C143EA280A28081A2140781A2140381A26E7EA2140081A21578157CA2153C153EA281
+A2811680A2150716C0A2150316E0A2ED01F0A2150016F8A21678167CA2163C163EA2161E
+160C27647BCA32>110 D E /Ff 91 127 df<121C127FEAFF80B3A3EA7F00B3A2123EC7
+FCA9121C127FA2EAFF80A3EA7F00A2121C093E6BBD33>33 D<00085B003EEB07C0007FEB
+0FE0A24814F0A26C14E0B3A2007E1307003E14C0A20008EB01001C1E75BD33>I<903903
+E001F0A2496C487EA8010F1307A202E05BA4007FB712E0A2B812F0A36C16E06C16C03B00
+1FC00FE000013F131FA202805BA9017F133FA202005B003FB712C04816E0B812F0A36C16
+E0A2C648C66CC7FCA400015CA2495BA86C48137CA22C3D7DBC33>I<D803E0143CD80FF8
+147C486C14FEA2486C1301A2D87F7F495AEA7E3F5E00FEEB8007EAFC1F5E150FA24B5AA2
+5ED8FE3F133F007E13004B5AEA7F7FD83FFE91C7FC5D6C5A5D380FF801EA03E0C7485AA2
+5D1407A24A5AA25D141FA24A5AA25D147FA292C8FC5CA2495AA25C1303A2495A167C4A48
+B4FC010F491380A24A4813C0131F92380FEFE0D93FC013C7031F13F002801383137FA2EB
+FF00A25B1201A24914C70003020F13E016EF4848903807FFC0A2496D1380A26C486D1300
+0001EC007C2C4D7DC433>37 D<EB03E0EB0FF8497E497E497E90B5FC9038FE3F803801FC
+1F13F8000380EBF00FA7141F5D91393F87FFE001F84913F00001137F147E14FE9026F9FC
+0713E001FF903801F8006C13F8ECF00302E05B1507D97FC05B14809038FF000F485D1480
+48141F4801C05B5A391FEFE03FD83FC791C7FC903887F07FD87F03137EECF8FE6D6C5A12
+FEEB00FF6E5AA291393FF00180EE03C091391FE007E0140F6CEB1FF06C133FEC7FF89039
+80FFFE0FD83FC301FF13C0D9FFFC13FF6C496C13806C497E6CD9E00F13006C90388007FE
+3A00FE0001F82C3F7DBD33>I<EA07C0EA0FF0EA1FF8A213FCA213FE120F1207EA007EA6
+13FE13FCA21201EA03F8A2EA07F0120FEA1FE0EA7FC0EAFF8013005A5A12700F1E6EBC33
+>I<140FEC3F80147F14FF491300495AEB07F8495A495A495A495A49C7FC5B12015B485A
+12075B120F5B121F5BA2123F5BA2127F90C8FCA45A5AAD7E7EA47F123FA27F121FA27F12
+0F7F12077F12036C7E7F12007F6D7E6D7E6D7E6D7E6D7EEB03FE6D7E6D1380147F143FEC
+0F00194D6FC433>I<127812FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7E6D7E133F8013
+1F6D7E801307801303801301A2801300A28080A41580143FAD147F1500A45C5CA213015C
+A213035C13075C130F5C495A133F5C137F49C7FC485A485A485A485AEA3FE0485A485A90
+C8FC5A1278194D78C433>I<14F0497EA8007015E000F8EC01F000FE140700FF140F01C1
+133F01F113FF263FF9F913C0000FB61200000314FCC614F06D5B011F1380D907FEC7FC90
+381FFF80017F13E090B57E000314FC000F14FF263FF9F913C026FFF1F813F001C1133F01
+01130F00FE140700F814010070EC00E000001500A86D5A242B79B333>I<141FA24A7EB0
+007FB71280A2B812C0A36C1680A2C7D83F80C7FCB06EC8FCA22A2B7CB333>I<EA07C0EA
+0FF0EA1FF8123F13FCA213FEA2121F120F1207EA007E13FEA213FC1201EA03F81207EA0F
+F0EA7FE012FF13C013005A12780F196E8A33>I<007FB612FEA2B8FCA36C15FEA228077B
+A133>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B6C8A33>I<167816F8ED
+01FCA21503A2ED07F8A2ED0FF0A2ED1FE0A216C0153FA2ED7F80A2EDFF00A24A5AA25D14
+03A24A5AA24A5AA24A5AA25D143FA24A5AA24AC7FCA2495AA25C1303A2495AA2495AA25C
+131FA2495AA2495AA249C8FCA25B1201A2485AA2485AA2485AA25B121FA2485AA2485AA2
+48C9FCA25AA2127CA2264D7AC433>I<14FF010313C0010F13F0497F497F497F9038FF81
+FF3A01FE007F804848EB3FC049131F4848EB0FE0A24848EB07F0A24848EB03F8A24848EB
+01FCA348C812FEA4007E157E00FE157FAE6C15FF6C15FEA46D1301003F15FCA26D130300
+1F15F8A26C6CEB07F0A26C6CEB0FE06D131F6C6CEB3FC0A26CB4EBFF806C018113006DB4
+5A6D5B6D5B6D5B010313C0010090C7FC283F7BBD33>I<EB01E0497EA21307A2130FA213
+1F133F137F13FF1203123F5AEAFFF713E71387EA7E071200B3B3A2003FB512FE48801680
+A216006C5C213E76BD33>I<EB03FF011F13E0017F13FC48B57E48ECFF804815C0260FFE
+0313E03A1FF0007FF049EB1FF84848130F49EB03FC127F90C7EA01FE4814005A6C15FF16
+7FA3127E123CC9FCA216FF16FEA2150116FC150316F81507ED0FF0ED1FE0153F16C0ED7F
+80EDFF004A5AEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495AEB07F8EB1FF0495A495A49
+5A4890C8FC4848143E4848147FEA0FF0485A48B7FCB8FCA37E6C15FE283E7BBD33>I<90
+3801FFC0010F13F8013F13FF90B67E48814881489038807FF03A0FFC000FF801F06D7E48
+4813036F7EA21500A26C5A6C5AC9FC15015EA215034B5A150F4B5A4B5A913803FFC00103
+B55A4991C7FC5D8116C06D8090C76C7EED0FF8ED03FC6F7E6F7E821780163FA2EE1FC0A3
+123C127EB4FCA2163F1780167F6C16006D5C6D495A6C6C1303D81FF8EB0FFC3A0FFF807F
+F86C90B55A6C5D6C15806C6C91C7FC010F13FC010113C02A3F7CBD33>I<15FF4A7F5C5C
+A25C5C15DFEC3F9FA2EC7F1F14FEA2EB01FCA2EB03F8EB07F0A2EB0FE0EB1FC0A2EB3F80
+A2EB7F0013FEA2485A12035B485AA2485A485AA2485AA248C7FC12FEB812E017F0A46C16
+E0C8381F8000AC021FB512804A14C04A14E0A26E14C06E14802C3E7DBD33>I<0007B612
+F04815F85AA316F001C0C8FCB0ECFFC001C713F801DF7F90B6FC168016C0028013E09039
+FC001FF001F0EB0FF849130749EB03FC6C4813016CC713FEC9FCA216FF167FA41218127E
+A2B415FF16FEA24814016C15FC6C14036DEB07F86D130F6C6CEB1FF06C6CEB7FE09039FE
+03FFC06CB612806C150000015C6C14F8013F13E0010390C7FC283E7BBC33>I<EC07FC91
+383FFF8091B512C0010314F0130F4914F890383FFC0790397FE003FCEBFFC0481300485A
+5B4848EB01F849EB00F0000F15005B121F5B123F5BA2127FEB0004903801FFF0010713FC
+D8FF1F7F4848EBFF8090B612C0B712E09038FE007F01F8EB1FF049EB0FF849EB07FC4913
+0349EB01FEA290C8FC16FF167FA37EA47F123F16FF6D14FE121F15016C6CEB03FC6D1307
+6C6C14F86DEB1FF06C6C133F3A01FF80FFE06C90B512C06D14806DEBFE006D5B010713F0
+01001380283F7BBD33>I<ECFFC0010713F8011F13FE017F6D7E90B67E4881489038807F
+F03A07FE001FF8D80FF8EB07FC49130348486D7E491300003F814980A66C6C14FEA26C6C
+495A6D13036C6C495AD803FEEB1FF03A01FF807FE06C90B55A013F91C7FC010F13FCA201
+3F13FF90B612C0489038807FE03A07FC000FF848486D7ED81FE0EB01FE4913004848147F
+007F168090C8123FA200FEED1FC0A76C153F6C16806D147F003F16006D5C6C6C495A01F8
+13076C6C495A3A07FF807FF86C90B55A6C5D6C6C14806D91C7FC010713F8010013C02A3F
+7CBD33>56 D<49B47E010F13E0013F13F84913FE90B6FC0003158048018113C09038FC00
+7F4848EB1FE04848EB0FF0485A49EB07F84848130390C7FCED01FC5A5A16FE1500A416FF
+A37E7E6D5BA26C6C5B6D5B6C6C5B6C6C5BD807FE137F90B7FC6C157F6C14FC6C6CEBF8FF
+6DEBE0FE010F1380903800200091C7FC150116FCA2150316F8150716F0000F140F486CEB
+1FE0486C133F16C0EDFF804A13004A5A381FF01F90B512F86C5C6C5C6C1480C649C7FCEB
+3FF0283F7BBD33>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7FCB3A3121F
+EA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2B6CAA33>I<EA07C0EA0FE0EA1FF0EA
+3FF8A5EA1FF0EA0FE0EA07C0C7FCB3A3EA07C0EA0FE0EA1FF0EA3FF8A213FCA3121F120F
+12071200A2120113F81203EA07F0120FEA1FE0127FEAFFC01380130012FC12700E396EAA
+33>I<1608163E16FF5D15075DED3FFEED7FFC913801FFF0020713E04A1380023F1300EC
+7FFC49485A4913E0010F13804990C7FCEB7FFC495A000313E0485B001F90C8FCEA7FFE13
+F8485A13C013F06C7E13FEEA1FFF000713C06C7FC613F86D7EEB1FFF6D7F010313E06D13
+F86D6C7E6EB4FC020F13806E13E0020113F09138007FFCED3FFEED0FFF81150181163E16
+0828337BB733>I<007FB71280A2B812C0A36C16806C1600CBFCA9003FB7FC481680B812
+C0A36C1680A22A177CA933>I<1210127CB4FC7F13E07FEA7FFC6C7E380FFF806C13E000
+017F6C13FCEB3FFE6D6C7E01077F010113F06D7FEC3FFE6E7E020713C06E13E0020013F8
+ED7FFE151FED0FFF1503150FED1FFE157FEDFFF8020313E04A13C0021F13004A5AECFFF8
+495B010713C0011F5B4948C7FCEBFFFC4813F000075B481380D83FFEC8FC485AEAFFF05B
+138090C9FC127C121028337BB733>I<90380FFF80017F13F848B512FE0007ECFF804815
+C04815E0263FFC0113F03A7FE0001FF80180130748C7EA03FC5A6C1401A3127E15030018
+EC07F8C8121FED3FF0EDFFE04A13C04A1380913807FE004A5A4A5AEC3FE05D4A5A4AC7FC
+A2495A5CA213035CA96D5A90C9FCA914E0EB03F8A2497EA36D5AA2EB00E0263E7ABD33>
+I<EC1F804A7E4A7EA34A7EA314F901017FA501037FA214F0A201077FA4ECE07E010F137F
+A449486C7EA549486C7EA4017F80EC000FA291B5FCA290B67EA43A01FE0007F8491303A4
+000381491301A3000781491300D87FFF90380FFFE0B56C4813F06E5AA24A7E6C496C13E0
+2C3E7DBD33>65 D<007FB512F8B7FC16C082826C813A03F8000FFCED03FE15016F7E82A2
+EE3F80A7EE7F00A25E4B5AA2ED07FCED1FF890B65A5E1680828216F89039F8000FFCED01
+FE6F7EEE7F80163F17C0161FA2EE0FE0A7161F17C0A2163FEE7F8016FF4B1300150F007F
+B65AB75A5E16E05E6C4AC7FC2B3D7DBC33>I<91391FE00780DAFFFC13C00103EBFF0F01
+0F148F4914FF5B90387FF81F9038FFC00748497E4848487E497F485A167F485A49143F12
+1F5B003F151F5BA2127F90C8EA0F8093C7FCA25A5AAD7E7EA36DEC0F80003FED1FC0A27F
+121F7F000F153F6D15806C7E167F6C6CECFF007F3A01FF8003FE6C6D485A90397FF81FF8
+6DB55A6D5C6D5C010391C7FC010013FCEC1FE02A3F7CBD33>I<003FB512F04814FCB7FC
+826C816C813A03F8007FF0ED1FF8ED07FC15036F7E8281EE7F80A2163F17C0161FA217E0
+160FA4EE07F0AD160F17E0A4161F17C0163FA21780167FEEFF00A24B5A15034B5AED1FF8
+ED7FF0003FB6FC4815C0B75A93C7FC6C14FC6C14F02C3D7EBC33>I<003FB712E04816F0
+B8FCA27E7ED801FCC71207A8EE03E093C7FCA6151F4B7EA490B6FCA69038FC003FA46FC7
+FC92C8FCA817F8EE01FCA9003FB7FC5AB8FCA27E6C16F82E3D7EBC33>I<003FB712E048
+16F0B8FCA27E7ED801FCC71207A8EE03E093C7FCA7151F4B7EA490B6FCA69038FC003FA4
+6FC7FC92C8FCB1383FFFF8487FB57EA26C5B6C5B2C3D7DBC33>I<91387F803C903901FF
+F03E0107EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB803FEC000FEA03FC0007140749
+1303485A491301121F5B123F491300A2127F90C8FC167C93C7FCA25A5AA992387FFFC092
+B512E0A37E6C6E13C0923800FE00A36D1301123FA27F121F6D1303120F7F6C6C1307A26C
+6C130F6C6C131F9038FF803F6CEBE0FF6DB5FC7F6D13FE010713F80101EBF07C9026007F
+80C7FC2B3F7CBD33>I<3B7FFFC00FFFF8B56C4813FCA46C496C13F8D803F8C7EA7F00B3
+A290B7FCA601F8C77EB3A53B7FFFC00FFFF8B56C4813FCA46C496C13F82E3D7EBC33>I<
+003FB612804815C0B712E0A26C15C06C1580260003F8C7FCB3B3AD003FB612804815C0B7
+12E0A26C15C06C1580233D78BC33>I<49B512F84914FC16FEA216FC6D14F890C7EA7F00
+B3B3A5123C127EB4FCA25D5D1401397F8007FC9038F01FF86CB5FC6C5C6C14C000035CC6
+49C7FCEB1FF0273E79BC33>I<D83FFF903807FFE0486D4813F0B500C014F8A26C018014
+F06C496C13E0D803F0903800FE004B5A4B5A15075E4B5A4B5A153F4B5A93C7FC15FE4A5A
+14035D4A5A4A5A141F5D4A5A147F14FF01F17FA201F37FEBF7F701FF7F14E3ECC3F8EC81
+FCA2EC00FE5B49137F81498049131F82150F826F7EA26F7EA26F7E150082167E167F82D8
+3FFFECFFF0486D4813F8B56C4813FCA26C496C13F86C90C713F02E3D7EBC33>I<387FFF
+F8B57E80A25C6C5BD801FCC9FCB3B3A3EE03E0EE07F0A9007FB7FCB8FCA46C16E02C3D7D
+BC33>I<D83FF8EC1FFC486CEC3FFE486CEC7FFFA2007F16FE6C6CECFFFC000716E001EF
+14F7EC8001A39039E7C003E7A3ECE007A201E314C7A2ECF00FA201E11487ECF81FA201E0
+1407A2ECFC3FA2EC7C3E157E147EEC3E7CA3EC1E78EC1FF8A2EC0FF0A3EC07E0EC03C091
+C7FCAED83FFCEC3FFC486CEC7FFEB591B5FCA26C48EC7FFE6C48EC3FFC303D7FBC33>I<
+D87FFC90381FFFE0486C4913F07FA36C6D6C13E00003913800FC0013F780A213F380A3EB
+F1F0A38013F0A280A2147C147EA2143E143FA2801580A3140F15C0A2140715E0A2140315
+F0A21401A215F81400A3157CA3153C153EA2151E151F387FFF80B5EAC00FA315076C496C
+5A2C3D7DBC33>I<90381FFFF890B6FC000315C0000F15F0A24815F83A3FFC003FFC01E0
+13074913034848EB01FEA290C8FCA500FE157FB3AC6C15FF6C15FEA46D1301A36C6CEB03
+FC01F0130F01FC133F6CB612F86C15F0A2000315C0C61500011F13F8283F7BBD33>I<00
+3FB512FC48ECFF80B712E016F86C816C813A01FC000FFF030313801500EE7FC0163FEE1F
+E0160FA217F01607A6160F17E0A2161FEE3FC0167FEEFF801503030F130090B65A5E5E16
+E0168003FCC7FC01FCC9FCB3383FFFE0487FB57EA26C5B6C5B2C3D7EBC33>I<90381FFF
+F890B6FC000315C0000F15F0A24815F83A3FFC003FFC01F0130F01C013034848EB01FEA2
+90C8FCA54815FF48157FB3AA143F6C90387F80FF6C15FEEC3FC0A2EC1FE0A29038800FF1
+A23A3FC007FBFC01F013FFEBFC036CB612F86C15F0A2000315C0C61500011F148090C7EA
+7FC0153F16E0151F16F0150F16F8150716FC150316FE1501ED00FC284C7BBD33>I<007F
+B57EB612F815FE81826C812603F8007FED3FF0ED0FF815076F7E1501A26F7EA74B5AA215
+034B5A150FED3FF0EDFFE090B65A5E93C7FC5D8182D9F8007F153F6F7E150F821507AA17
+3E177FA416F8030313FF267FFFC014FEB538E001FF17FC81EE7FF86C49EB3FF0C9EA0FC0
+303E7EBC33>I<D907FE137890393FFFC07C90B5EAF0FC4814FC000714FF5AEBFC03391F
+F0007F4848133F0180131F007F140F90C712074814035AA21501A46CEC00F86C15007F7F
+6C7E7FEA1FFE380FFFE06C13FF6C14F06C14FC6C6C13FF011F1480010314C0D9003F13E0
+020313F09138003FF8ED0FFC1507ED03FE1501150016FFA2007C157F12FEA56C15FF16FE
+7FED01FC6D130301F0EB07F801FC130F9039FF807FF091B512E016C000FC1580013FEBFE
+00D8F80F5BD8780013E0283F7BBD33>I<003FB712F84816FCB8FCA43AFE000FE001A800
+7CED00F8C71500B3B3A40107B512C049804980A26D5C6D5C2E3D7EBC33>I<273FFFE001
+B5FC486D481480B56C4814C0A26C496C14806C496C1400D801FCC7EA0FE0B3B3A36D141F
+00005EA26D143F6D5DA26D6C49C7FC6E5B6D6C485AECF00390390FFC0FFC6DB55A6D5C6D
+5C6D6C1380DA1FFEC8FCEC07F8323E80BC33>I<D87FFF903803FFF8B56C4813FCA46C49
+6C13F8D807F09038003F806D147F00031600A36D5C00015DA46C6C495AA46D13036D5CA3
+EC8007013F5CA3ECC00F011F5CA46D6C485AA46D6C485AA4010391C7FC6E5AA30101137E
+A2ECFCFEA201005BA5EC7FF8A46E5AA26E5A6E5A2E3E7EBC33>I<D83FFCEC3FFC486CEC
+7FFEB591B5FCA26C48EC7FFE6C48EC3FFCD80FC0EC03F0A76D1407000716E0A86C6CEC0F
+C0A2EC07E0EC0FF0EC1FF8A3000116809039F83FFC1FEC3E7CA4EC7E7EA200001600A2EC
+7C3E01FC5CECFC3FA3ECF81F017C143EA590397DF00FBEA3013D14BC90393FE007FCA5EC
+C003011F5C6D486C5A303E7FBC33>I<3A3FFF807FFF486DB51280A46C496C13003A01FE
+000FE0151F6C7E4B5AEB7F805E90383FC07F93C7FC6D6C5A5DEB0FF15DEB07FB5DEB03FF
+5D7F5D7F5D147F6E5AA34A7EA24A7E815B81EB03FB81EB07F181EB0FE081011F7F02C07F
+013F133F02807F017F131F02007F49130F49801507000181491303000381491301D87FFF
+90380FFFE0B56C4813F05DA2816C496C13E02C3D7DBC33>I<D87FFF903803FFF8B56C48
+13FC6E5AA24A7E6C496C13F8D803FC9038007F005E00015D6D130112006D495A7F02805B
+013F130702C05B011F130F02E05BA2010F131F02F05B0107133F02F85B13034BC7FCEB01
+FC157E010013FE14FEEC7EFC147F6E5AA26E5AA25D140FB349B5FC4980A46D91C7FC2E3D
+7EBC33>I<001FB612FE48815AA490C7EA01FE4B5AA24B5A5E150F4B5AA2003E4A5AC848
+5AA24BC7FC5D14014A5AA24A5A4A5AA24A5A5D143F4A5AA24AC8FC495AA2495A5C130749
+5AA2495A495AA2495A91C9FC5B4848141FEE3F80485A485AA2485A5B121F485AA2485A90
+B7FCB8FCA46C1600293D7BBC33>I<007FB512C0B612E0A415C048C8FCB3B3B3ABB612C0
+15E0A46C14C01B4D6CC433>I<127CA212FEA27EA26C7EA26C7EA26C7EA2120F7FA26C7E
+A26C7EA26C7EA212007FA26D7EA26D7EA26D7EA2130F80A26D7EA26D7EA2130180A26D7E
+A26E7EA26E7EA2141F81A26E7EA26E7EA26E7EA2140181A26E7EA2ED7F80A2ED3FC0A215
+1F16E0A2ED0FF0A2ED07F8A2ED03FCA21501A2ED00F81678264D7AC433>I<007FB512C0
+B612E0A47EC7120FB3B3B3AB007FB5FCB6FCA46C14C01B4D7DC433>I<EB01C0EB07E0EB
+1FF8EB7FFE48B51280000714E0001F14F8393FFE7FFC39FFF81FFF497EEBC00390C7FC00
+7E147E0038141C200E77BC33>I<007FB612FEA2B8FCA36C15FEA228077B7D33>I<131C13
+7E13FE12011203EA07FCEA0FF0EA1FE013C0EA3F80A2EA7F00127EA212FE5AA6EAFFC013
+E013F0127FA2123FA2EA1FE0EA07C00F1E6EC333>I<EB1FFC90B57E000314E048804814
+FC48809038F007FFEBE0016E7F153F6C48806C48131FC87F150FA5EC0FFF49B5FC131F13
+7F48B6FC0007140F4813C0381FFC00EA3FF0EA7FC05B48C7FC5AA56C141F7E6D137FD83F
+E0497ED9F807EBFFF06CB712F87E6C14F36C14C1C69138003FF0D91FF090C7FC2D2E7BAC
+33>I<EA3FFC487E12FFA2127F123F1200ABEC01FE91380FFFC04A13F0027F7F91B512FE
+90B7FCECFE07DAF800138002E0EB7FC04AEB3FE04A131FEE0FF091C7FC16074915F81603
+A217FC1601A9160317F8A26D140717F06E130F17E06E131FEE3FC06E137F9139F801FF80
+DAFE07130091B55A495C6E5BD97E3F13E0D93C0F138090260003FEC7FC2E3E7FBC33>I<
+ECFFF0010713FE011FEBFF804914C04914E048B612F048EBC01F9038FE000F485A485A48
+48EB07E049EB03C0484890C7FC5BA2127F90C9FCA25A5AA97E7EA27F003FEC01F06DEB03
+F86C7E6D13076C6C14F06C6C130F01FFEB1FE06CEBE07F6C90B512C06C1580013F14006D
+13FC01075B010013C0252E79AC33>I<ED7FF84B7E5CA280157F1501ABEB01FF010713C1
+011F13F1017F13F990B6FC5A4813813907FE003FD80FF8131F49130F4848130749130312
+3F491301127F90C7FCA25A5AA97E7E15037F123F6D1307A26C6C130F6D131F6C6C133F6C
+6C137F2603FF81B512F091B612F8C602FD13FC6D13F96D01E113F8010F018013F0D901FE
+C8FC2E3E7DBC33>I<ECFF80010713F0011F13FC497F90B6FC48158048018013C03A07FE
+003FE001F8EB0FF048481307484814F8491303003F15FC491301127F90C7FC16FE15005A
+5AB7FCA516FC48C9FC7E7EA36C7E167C6C6C14FE7F6C7E6D13016C6CEB03FC6CB4130F6C
+9038C03FF86C90B512F06D14E06D14C0010F1400010313FC9038007FE0272E7BAC33>I<
+ED3FE0913801FFFC020713FE141F4A13FF5CECFFC015004948137E4A133C010314005CA8
+003FB612F84815FCB7FCA36C15F8260003F8C7FCB3AD003FB612804815C0A46C1580283E
+7DBD33>I<D901FEEB1FE0903A0FFFC0FFF0013F01F313F84990B512FC90B7FC5A480103
+13E12607FC00EB80F849017F1360484890383FC00049131FA2001F8149130FA66D131F00
+0F5DA26D133F6C6C495A6D13FF2603FF0390C7FCECFFFE485C5D5DD80FCF13C0D981FEC8
+FC0180C9FCA27FA26C7E7F90B512FC6CECFFC06C15F0000715FC4815FF4816809038E000
+0748489038007FC090C8EA1FE048150F007E150700FE16F0481503A56C1507007E16E000
+7F150F6C6CEC1FC001E0147FD81FF8903801FF80270FFF801F13006C90B55A6C5DC615F0
+013F14C0010F91C7FC010013F02E447DAB33>I<EA3FFC487E12FFA2127F123F1200AB4A
+B4FC020713C0021F13F0027F7F91B5FC90B67EED07FEECF801ECF0004A7F4A7F5CA291C7
+FCA35BB3A43B3FFFF80FFFFC486D4813FEB56C4813FFA26C496C13FE6C496C13FC303D7F
+BC33>I<14E0EB03F8A2497EA36D5AA2EB00E091C8FCAA383FFFF8487FA47EEA0001B3AD
+007FB612C0B712E016F0A216E06C15C0243E78BD33>I<1570EC01FCA2EC03FEA3EC01FC
+A2EC00701500AA90383FFFFC4913FE90B5FCA27F7F90C7FCB3B3A9140115FCA21218007E
+EB03F81407B414F0140F9038803FE090B512C06C14806C14006C5B6C13F8000113E01F55
+7BBD33>I<EA7FF8487EA4127F1200AC4AB512C04A14E04A14F0A26E14E06E14C0913900
+0FF0004B5A4B5A4B5A4BC7FC4A5A4A5A4A5A4A5A4A5A4A5A4A5A4A7E01FD7F90B5FC81EC
+F3F8ECE3FC14C1EC80FEEC007F5B496D7E6F7E82150F6F7E6F7E8215016F7E3B7FFFF80F
+FFF0B56C4813F817FCA217F86C496C13F02E3D7EBC33>I<383FFFFC487FB5FCA27E7EC7
+FCB3B3AD003FB612F84815FCB712FEA26C15FC6C15F8273D7ABC33>I<02FC137E3B7FC3
+FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F13872607FE07130301FC01FE7F
+9039F803FC01A201F013F8A401E013F0B3A53C7FFE0FFF07FF80B548018F13C0A46C486C
+01071380322C80AB33>I<4AB4FC263FFC0713C0267FFE1F13F000FF017F7F91B5FC6CB6
+7E6CEC07FEC6EBF801ECF0004A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D4813
+FEB56C4813FFA26C496C13FE6C496C13FC302C7FAB33>I<EB01FE90380FFFC0013F13F0
+497F90B57E488048EB03FF2607FC0013804848EB7FC049133F4848EB1FE049130F4848EB
+07F0A2007F15F890C71203A300FEEC01FCAA6C14036C15F8A26D1307003F15F06D130FA2
+6C6CEB1FE06D133F6C6CEB7FC06C6CEBFF802603FF0313006CEBFFFE6C5C6D5B6D5B010F
+13C0D901FEC7FC262E7AAC33>I<EC01FE3A3FFC0FFFC0486C4813F000FF017F7F91B512
+FE6CB7FC6CEBFE07C6D9F800138002E0EB7FC04AEB3FE04A131FEE0FF091C7FC16074915
+F81603A217FC1601A9160317F8A26D140717F06E130F17E06E131FEE3FC06E137F9139F8
+01FF80DAFE07130091B55A495C6E5B6E13E0020F1380DA03FEC7FC91C9FCAF383FFFF848
+7FB57EA26C5B6C5B2E427FAB33>I<02FF137C0107EBE0FE011F13F0017F13FC90B512FE
+4814FF4813C03907FE003F4848131F01F0130F484813071503485A491301127F90C7FC15
+005A5AA97E7E15017F123F6D130315076C7E6C6C130F6D131FD807FE137F3903FF81FF6C
+EBFFFE6C14FC6D13F86D13F0010F13C0903801FE0090C8FCAF92387FFFFC92B512FEA46F
+13FC2F427CAB33>I<ED03FE3B7FFF801FFF80B5D8C07F13E002C1B5FC02C314F014C76C
+9038CFFE0F39001FDFF09139FFC007E092388003C092C8FC5C5C5CA25CA25CA35CB2007F
+B512FEB7FCA46C5C2C2C7DAB33>I<90381FFE0F90B5EA8F80000314FF120F5A5AEBF007
+387F800190C7FC00FE147F5A153FA37E007FEC1F0001C090C7FCEA3FF8EBFFC06C13FF6C
+14E0000314F8C680011F13FF01001480020713C0EC007FED1FE0007C140F00FEEC07F015
+03A27EA27F15076D14E06D130F6DEB3FC09038FE01FF90B61280160000FD5C00FC14F8D8
+F83F13E0D8780790C7FC242E79AC33>I<EB03C0497E130FAA003FB612FC4881B7FCA36C
+5D26000FE0C8FCB3A3161FEE3F80A5167F6E140001075C6E5A9138FE07FE6DB55A6D5C6D
+5C6E5B021F1380DA07FCC7FC29387EB633>I<D83FFCEB1FFE486C497E00FF5CA2007F80
+003F800000EC007FB3A75EA25DA26D5B90387F800FDAE03F13FC6DB612FE17FF6D806D01
+FE13FE01039038F83FFC010001C0C7FC302C7FAA33>I<3B3FFFC00FFFF0486D4813F8B5
+6C4813FCA26C496C13F86C496C13F0D801F8C7EA7E006D14FE00005DA26D1301017E5CA2
+017F13036D5CA2EC8007011F5CA2ECC00F010F5CA36D6C485AA3ECF03F010391C7FCA26E
+5A0101137EA2ECFCFE01005BA214FF6E5AA36E5AA26E5A6E5A2E2B7EAA33>I<3B7FFF80
+07FFF8B56C4813FC6E5AA24A7E6C496C13F8D80FC0C7EA0FC06D141F00071680A56D143F
+00031600A3EC0FC0EC1FE0A23A01F83FF07EA3EC7FF8147CA20000157C9039FCFCFCFCA3
+ECF87CA2017C5C017D137EECF03EA2017F133FA26D486C5AA3ECC00F90390F8007C02E2B
+7EAA33>I<3B3FFFC07FFF80486DB512C0B500F114E0A26C01E014C06C496C13803B00FE
+000FE000017F495AEB3F804B5A6D6C48C7FC90380FE07E903807F0FEECF1FC903803FBF8
+EB01FF6D5B5D6E5A143F6E5A143F814A7E14FF903801FBF0ECF9F8903803F1FCEB07E015
+7E90380FC07F011F6D7E90383F801F02007F496D7E01FE6D7E484813033B7FFFC03FFFE0
+B56C4813F0A46C496C13E02C2B7DAA33>I<3B7FFF801FFFE0B56C4813F06E4813F8A24A
+6C13F06C496C13E0D803F8C7EAFC00000114015E7F000014036D5C137EA2017F495A7FA2
+6E485A131FA26D6C485AA214E0010749C7FCA214F01303157EEB01F8A2157C010013FC14
+FC5D147C147DEC3FF0A36E5AA36E5AA2141F5DA2143F92C8FCA3147EA214FE003F5B1301
+387F81F81383EB87F0139FEBFFE06C5B5C6C90C9FCEA0FFCEA03F02D427DAA33>I<000F
+B712804816C05AA317800180C713004B5A4B5A4B5A4B5A6CC7485AC8485A4B5A4BC7FC4A
+5A4A5A4A5A4A5A4A5A4A5A4A5A4AC8FC495A495A495A495A495A495A495A49C7EA0F8048
+48EC1FC0485A485A485A485A485A48B7FCB8FCA46C16802A2B7DAA33>I<ED07FEED7FFF
+4AB5FC14075C4A13FE91383FFE0015E0EC7F8092C7FCB3A45C495A1303EB1FFCEA3FFFB5
+5A14E05C8014F8003F7FEA001FEB03FE13016D7E80B3A481EC3FE015FE91381FFFFE6E13
+FF8014016E7EED07FE284D7BC433>I<127CA212FEB3B3B3B3127CA2074D6AC433>I<EA7F
+F0B5FC14C014F0806C7F38003FFE1303EB00FF80B3A4816E7E81EC1FFCEDFFFC6E13FF14
+03805C140F4A13FCEDFC00EC3FE05D4A5A92C7FCB3A45CEB03FE133F387FFFFCB55A5C14
+C091C8FCEA7FF0284D7BC433>I<013E13079039FF800F8000039038C01FC048EBE03F48
+EBF07F489038F9FF803A7FE7FFFE00D8FF835B01015B486C5B007CEB7FC00038011FC7FC
+220C78BC33>I E /Fg 44 123 df<EEFFFC031FEBFF804AB612E0020781021F9038C00F
+F8913A7FFE0003FCDAFFF0EB00FE4949EB03FF4901805B4990C7487F49485CA2495A4D7F
+013F6F5B5CA37190C7FC715AEF01F894C9FCA90403B512C0BAFCA526003FFCC7120783B3
+B3A6003FB5D8FC03B612C0A542547DD34B>12 D<EC01E0EC07F84A7EA66E5AA200041608
+001F163ED83FC015FFD87FE04A13806D6C485AD8FFF84A13C0D87FFE021F138001FF5C02
+835B6C01C390B51200000FD9F1E313FC0001D9F9E713E027003FFDEF90C7FC0107B512F8
+010114E0D9003F90C8FCEC07F8EC3FFF49B512E0010714F890393FFDEFFF2701FFF9E713
+E0000FD9F1E313FC003FD9C3F013FF4801836D138002037F01FE80D8FFF8020713C0D87F
+F06E138049486C7ED83FC06E1300D81F00153E00041608C792C7FCA24A7EA66E5AEC01E0
+323578D943>42 D<EA07F0487E487E487E487EB51280A76C13006C5A6C5A6C5A6C5A1111
+769025>46 D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF800C7FC
+B3B3B3A6007FB712FEA52F4E76CD43>49 D<EC3FFE0103B512E0010F14FC013F14FF90B7
+12C048D9C07F7F2703FE000F13F8D807F801037FD80FE06D7F48486D7F48488001F01680
+486C6E13C07F486C6E13E07FA27013F0A56C5AA26C5AEA0FF0EA03C0C914E05EA218C05E
+1880A24C13005F4C5A4B5B5F4B5B5F4B5B4B90C7FC4B5A5E4B5AED7FE04B5A4A5B4A48C8
+FC4A5A5D4A48EB01F04A5AEC3F804AC7FC02FEEC03E0495A495A495A495AD91F80140749
+C8FC013E150F017FB7FC90B812C05A5A5A5A5A5A5AB9FC1880A4344E79CD43>I<91380F
+FFC091B512FC0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C7ED803F8
+6E7E491680D807FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD801FC1680
+C9FC4C13005FA24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEEFF80DA00
+0713E0030113F89238007FFE707E7013807013C018E07013F0A218F8A27013FCA218FEA2
+EA03E0EA0FF8487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816E001F04A
+13C06C484A1380D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F1580010302
+FCC7FCD9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2161F163F167FA2
+16FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC01580EC1F
+005C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A1207485A48
+5A90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>I<D8038015
+0ED807E0157E01FEEC03FED9FFF0137F91B65A5F5F5F5F5F94C7FC5E5E16F016C093C8FC
+15F801E190C9FC01E0CAFCABEC0FFF027F13F001E3B512FE01E76E7E9026FFF8077FDAC0
+017F49C713F8496E7E49143F4981496E7E6C481680C9FC18C08218E0A418F0A3EA0FE048
+7E487E487E487EA418E0A35B6C484A13C05B491680003EC85A003F17006C6C4A5A6D5D6C
+6C4A5AD807F8495BD803FE01075B2701FFC03F5B6C90B65A013F4AC7FC6D14F8010314C0
+9026007FF8C8FC344F79CD43>I<ED0FFF92B512E0020780021F14FC91397FFE03FE903A
+01FFF0007F4901C0EB3F804990C7121F4948EC7FC0494814FF49484913E049485B01FF5C
+485BA2485B5AA2486F13C04A6D1380486F1300177E94C7FC5AA291CAFC5AA21508913801
+FFF8020713FFB54814C04A14F04AC66C7E023C6D7E4A6D7E4A6D7E7013804A15C0A24A15
+E07013F05C18F8A491C714FCA37EA67EA46C17F880A27E18F06C5D18E06C6D15C07E6E49
+13806C6D15006D6C495A6D6CEB7FFC6DB448485A6D90B55A010315C0010092C7FC023F13
+FC020713C0364F7ACD43>I<171F4D7E4D7EA24D7EA34C7FA24C7FA34C7FA34C7FA24C7F
+A34C8083047F80167E8304FE804C7E03018116F8830303814C7E03078116E083030F814C
+7E031F81168083033F8293C77E4B82157E8403FE824B800201835D840203834B80020783
+5D844AB87EA24A83A3DA3F80C88092C97E4A84A2027E8202FE844A82010185A24A820103
+854A82010785A24A82010F855C011F717FEBFFFCB600F8020FB712E0A55B547BD366>65
+D<932601FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203
+DAE003EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901
+F8824949824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA248
+49181FA3485B1B0FA25AA298C7FC5CA2B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D19
+80A26C1A1F6C7F1C006C6D606C6D187EA26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A
+6D01FC4C5A6D6DEE7F806D6C6C6C4BC7FC6E01E0EC07FE020F01FEEC1FF80203903AFFE0
+01FFF0020091B612C0033F93C8FC030715FCDB007F14E0040101FCC9FC525479D261>67
+D<BA7E19FCF1FF801AF01AFCD8000701F0C7000F13FF060014C0071F7F070713F807017F
+737F747E747F747F86747F747F8886888688A2757EA31D8087A21DC0A51DE0A387A963A3
+1DC0A51D80A2631D00A3515AA2646264505B6264505B505B5090C7FCF2FFFE4F5B07075B
+071F5B96B512C0060F91C8FCBB5A1AF01AC007FCC9FC19805B527CD167>I<BC1280A5D8
+000701F8C7000114C0F0001F19071901851A7F1A3F1A1FA2F20FE0A21A07A31A03A318F8
+1BF01A01A497C7FC1701A317031707170F177F92B6FCA59238F8007F170F170717031701
+A317001B3EA31B7CA395C8FCA21BFCA21BF8A21A01A31A031BF01A071A0FA21A1F1A3FF2
+7FE0F101FF1907191F0603B5FCBCFCA21BC0A34F517CD058>I<932601FFFCEC01C0047F
+D9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7
+383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F882494982494982494982
+4949824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA2
+98C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000A36C7FA36C7FA27E6C7FA2
+6C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF6D6C6D5C6E01F0EC07FB02
+0F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE001F030703FC1307DB007F
+02E01301040149CAFC5B5479D26A>71 D<B812C0A5D8000701F8C7FCB3B3B3B2B812C0A5
+2A527CD132>73 D<B800C091B612F8A5D8000701F8C90003EBF8009738007F8051C7FC50
+5AF203F8F20FF0505A505A505A50C8FCF101FCF107F84F5A4F5A4F5A4F5A07FEC9FCF003
+FC4E5A4E5A4E5A4E5A4E5ADD01FECAFC4D5A4D5A4D5A4D7E173F4D7E4C487E4C7F5E4C80
+4C804C80EEFF7F9226F9FE3F7FDBFBFC809226FFF81F7F4C7EDCC0077F0480804C7E4B6D
+804B6D804B8284727F727F8684727F727F8784728087737F85737F87737F85737F888573
+80747F888697B512FCB800C0013FECFFFEA55F527CD169>75 D<B812F8A5D8000701F8CA
+FCB3B3A91A7CA41AFC1AF8A51901A31903A219071AF0190FA2191F193F197F19FF180360
+183F4DB5FCBB12E0A546527CD151>I<B600FC93B7FC8181A282D800076E9239003FFC00
+70EE07E08282A28202EF7F02E77F02E380A202E18002E0806F7F6F7F6F7FA26F7F6F7F6F
+806F80A26F80707F707F707F707FA2707F7080708070808583717F717F717F717FA27114
+807114C07114E07213F07213F8A27213FC7213FE7213FF721487A27214C77214E77313F7
+7313FF85A285858585A28586868686A286868686A2D93FFC187FB7173F1B1F1B0F1B0775
+5A60527CD169>78 D<BAFC19F819FF1AE086D8000701F0C7001F13FC060113FF726C1380
+7313C0070F13E01BF0857313F81BFCA27313FEA41BFFA81BFEA31BFC61A21BF84F13F04F
+13E0614F13C04F13004E485A061F5B92B812F01AC04FC7FC19E003F8CBFCB3AEB812C0A5
+50527CD15C>80 D<B912F0F0FF8019F819FF1AC0D8000701F0C714F0060F7F060113FE72
+7F737F737F85737F87A2737FA387A863A2616363A24F5B4F5B4F90C8FC4F5A06035B060F
+13F095B512C092B8C9FC19F819E019F89226F0000313FE9439007FFF80727F727F727F72
+7F727F8684A28684A787A71D1C75133EA38575137E73157C7513FC731401B86C6D9038F8
+03F807039038FE07F07390B512E0736C14C0080F1400CEEA7FFC5F537CD164>82
+D<003FBC1280A59126C0003F9038C0007F49C71607D87FF8060113C001E08449197F4919
+3F90C8171FA2007E1A0FA3007C1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A5
+53517BD05E>84 D<EC7FFF0107B512F0013F14FE90B77E48D9E00F7F2703FE000113F048
+6C6D7F6EEB3FFC48826E131F83707FA36C496D7FA26C90C7FC6C5AC9FCA6037FB5FC020F
+B6FC91B7FC01071487013FEBF0074913803901FFFC004813F0485B485B485B4890C7FC5A
+5BA2485AA45EA26D5C007F151D163D6C6C02797F6C6D01F113F86C9026C003E1EBFFE06C
+9026F81FC014F06C90B5487EC6ED001F011F01FC010713E0010101E090C8FC3C387CB641
+>97 D<EB3FF0B5FCA51203C6FCB3A4923801FFE0030F13FE033FEBFFC092B612F002F301
+017F913AF7F8003FFEDAFFE0EB0FFF03806D7F92C76C7F4A6E7F4A824A6E7FA2727EA285
+A28584A31A80AC1A00A44E5AA36118FF616E4A5BA26E4A5B6E4A5B6F495BDACFC04990C7
+FCDA87F0EB7FFC913A03FE03FFF849C6B612E0496D148049011F01FCC8FC90C7000313C0
+41547BD24B>I<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE
+0001FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F130070
+5A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C
+6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49
+C7FC020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13
+FC91B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F48
+4980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D
+5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE
+0FD9003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C0
+4901817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C048
+8191C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06C
+EE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB
+03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>I<ED3F
+FC0203B5FC020F14C0023F14E09139FFF81FF0499038C03FF849EB807F49903800FFFC49
+5A495AA2495AA2EE7FF8495AEE3FF0EE0FC093C7FCAEB712E0A526007FF8C8FCB3B3A700
+7FB512FEA52E547CD329>I<DA3FFF14FF0103B5D8F00713C0010FDAFC1F13E0013FECFF
+7F90267FFC0F9038FF9FF09026FFE001EBF83F48496C13E0484990387FF01F4890C7D83F
+F813E0489338FC0FC0F0078048486E6CC7FCA2003F82A9001F5EA26C6C4A5AA26C5E6C6D
+495A6C6D495A6C6D485BDAFC0F5B4890B6C8FCD803EF14FC01C314F02607C03F90C9FC91
+CBFCA2120FA37FA213F813FE90B7FC6C16F817FF18C06C836C836C836D828448B9FC1207
+4848C700031480D81FF8EC003F4848150748486F13C083485A83A56D5D007F18806D5D00
+3F18006C6C4B5AD80FFEED1FFC6C6C6CEC7FF86C01E049485A6C01FE011F5B6C6CB71280
+010F03FCC7FC010115E0D9000F01FCC8FC3C4F7CB543>I<EB3FF0B5FCA51203C6FCB3A4
+EE1FFC93B512C0030314F0030F8092391FE07FFC92393F001FFE037C8003F07FDAF1E081
+ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542537BD24B>I<137F
+497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017E
+B3B3A6B612E0A51B547BD325>I<EB3FF0B5FCA51203C6FCB3A54CB512F8A59339003FFE
+00EF1FF0EF3FC04D5A4DC7FCEE03FEEE07F84C5A4C5AEE7FC04CC8FC4B5A4B5AED0FF8ED
+1FE04B7E4B7EECF1FF02F37F02F77F91B6FC83159F030F7F02FE80DAF8077F4A7E6F7F6F
+7F83707E82707F84707F707F82707F84707F177F717E4D13C0B6D8F003B6FCA540537CD2
+47>107 D<EB3FF0B5FCA512017EB3B3B3B1B612F0A51C537BD225>I<D93FF0D91FFCEDFF
+E0B591B500C0010713FE030302F0011F6D7E030F6E017F8092271FE07FFCD9FF037F922A
+3F001FFE01F8007F0003027C9126FF03E080C602F06DD90780137FDAF1E0038FC77FDAF3
+C0159EDAF7806D01BC143F07FC8102FFC75C4A5EA24A5EA44A5EB3ACB6D8F807B6D8C03F
+B512FEA567367BB570>I<D93FF0EB1FFCB591B512C0030314F0030F8092391FE07FFC92
+393F001FFE0003027C80C602F07FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3
+ACB6D8F807B612C0A542367BB54B>I<913801FFE0021F13FE91B612C0010315F0010F90
+38807FFC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890
+C86C7EA24883A248486F7EA3007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5F
+A26C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF
+807FFC6D90B55A010015C0023F91C8FC020113E03A387CB643>I<903A3FF001FFE0B501
+0F13FE033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9FFE0EB1FFFC602806D
+7F92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A0060A36118FFA2615F
+616E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FBFE075B02F8B612E06F
+1480031F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I<90397FE003FEB59038
+0FFF80033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014
+EF150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>
+114 D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307D81FE0130148487F
+4980127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15
+F06C816C816C81C681013F1580010F15C01300020714E0EC003F030713F015010078EC00
+7F00F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE90
+39FFC00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB635>I<143EA6147E
+A414FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3
+A9EE07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B
+020313802A4D7ECB34>I<D93FF8913801FFC0B50207B5FCA50003ED001FC61607B3AE5F
+A35FA2017F5D173B177B6D6C14F3DC01E313F06D6CD907C3EBFFC0903A0FFFC03F836D90
+B51203010114FE6D6C13F8020701E091C7FC42377BB54B>I<B6D8E07FB5D8C003B512C0
+A5000101F0C701F0C7381FF8006E027FED07E06C715DA26E023F150F017F705DA26E181F
+013F4B6C92C7FC6E606D70143E94B5FC6F177E6D4A6E137C03C001F315FC6D715B160303
+E001E114016D020702E05B03F013C06D71485A160F03F8D9807F13076D05F85B93381F00
+3F03FC160F027F4902FC5BDBFE3E011F131F023F04FE90C8FC167EDBFF7C010F5B6E01FC
+ECFF3E4C6D137E6E5FA24C7F6E5F4C7F6E5FA24C7F6E5F4C147FA26E5F93C8123F6F5EA2
+033E6FC9FC5A367DB461>119 D<007FB500F090387FFFFEA5C66C48C7000F90C7FC6D6C
+EC07F86D6D5C6D6D495A6D4B5A6F495A6D6D91C8FC6D6D137E6D6D5B91387FFE014C5A6E
+6C485A6EEB8FE06EEBCFC06EEBFF806E91C9FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F
+92B5FCDA01FD7F03F87F4A486C7E4A486C7E020F7FDA1FC0804A486C7F4A486C7F02FE6D
+7F4A6D7F495A49486D7F01076F7E49486E7E49486E7FEBFFF0B500FE49B612C0A542357E
+B447>I<B600F00107B5FCA5C601F8C8EA7FE06EED3F00A26D6C153E187E013F167C6E15
+FC6D5E6F13016D5E6F13036D5E8117076D6D5C170F6D6D5C171F6D93C7FC6F5B027F143E
+6F137E023F147C6F13FCA26E6D5A16816EEBC1F016C36E5C16E76E5C16FF6E5CA26E91C8
+FCA36F5AA26F5AA26F5AA26F5AA26F5AA35E150F5E151F93C9FC5DD81FC0133E486C137E
+486C137C486C13FC5D14015D14034A5A6C48485A49485A263FC07FCAFCEB81FE6CB45A6C
+13F000035BC690CBFC404D7DB447>I<001FB8FC1880A3912680007F130001FCC7B5FC01
+F0495B495D49495B495B4B5B48C75C5D4B5B5F003E4A90C7FC92B5FC4A5B5E4A5B5CC748
+5B5E4A5B5C4A5B93C8FC91B5FC495B5D4949EB0F805B495B5D495B49151F4949140092C7
+FC495A485E485B5C485E485B4A5C48495B4815074849495A91C712FFB8FCA37E31357CB4
+3C>I E /Fh 7 118 df<903901F803F8EB07FE130F131F133FEB7F0EEB7E0201FEC8FC5B
+A21201ACB538FE03F8A53801FC00B3AE253B7FBA2D>12 D<B67E15F815FE6F7E8290C77F
+ED1FF06F7EED03FC150182150082A282A35EA25E15015E1503ED0FF84B5AEDFFE090B65A
+5E4BC7FC15F815E09038000FF01407811403811401816E7E8182153F826F7EA26F7EA26F
+7E1503826F7EA26F7EA2EE7F80EE3FC0A2EE1FE02B3A78B936>82
+D<007FB7FCA55EC8EA03FC15074B5AA24B5A5E153F4B5A5E15FF4A90C7FCA24A5A5D1407
+4A5A5D141F4A5AA24A5A5D14FF4990C8FC5C1303495AA2495A5C131F495A5C137F495AA2
+4890C9FC5B1203485A5B120F485AA2485A5B48B71280B8FCA5293A7BB933>90
+D<12FEB3A2EB01FCEB0FFF013F13C090B57EB67E9038F03FF8EBC007496C7EEB0001486D
+7EA2157FA3ED3F80AAED7F00A35D5D14016C5CEB80039038C00FF89038F03FF090B55A48
+5C6D5BD91FFEC7FC380007F8213B7AB92B>98 D<EB07F8EB1FFE90387FFF8048B512C048
+14E03907FC0FF0390FF003F8EBE001391FC000FC49137C003F147E90C7123E5A127E151F
+12FEB7FCA500FCC8FCA27EA2127EA2127F7E7F6C7E6D13026C6C130E6C6C133E3903FE01
+FE6CB5FC6C14FC6D13F0011F13C0903803FE0020287EA625>101
+D<EB01FC39FE0FFF804913C0017F13E090B512F039FFF81FF8EBE007EBC003018013FC14
+011300A35AB3A71E267AA52B>110 D<00FEEB01FCB3AA1403A214076C131F387F807F90
+B5FC6C13F914F1000F13C1D803FCC7FC1E267AA42B>117 D E /Fi
+10 118 df<0107B612FCEFFF8018C0903B000FF0001FF04BEB07F81703021F15FC17014B
+14FEA2023F1400A24B1301A2147F18FC92C7120318F84A140718F04AEC0FE0EF1FC00101
+ED3F80EF7F004AEB01FEEE07F849B612E05F9139F80007F0EE01FC01076E7E177F4AEC3F
+80A2010F16C0171F5CA2131F173F5CA2133FEF7F805C1800017F5D4C5A91C7485A5F4914
+0FEE1FE0494A5A00014AB45AB748C7FC16F816C037397BB83A>66
+D<147F903803FFC090380FC1E090381F0070017E13784913383901F801F83803F0031207
+13E0120FD81FC013F091C7FC485AA2127F90C8FCA35A5AA45AA3153015381578007C14F0
+007EEB01E0003EEB03C0EC0F806CEB3E00380F81F83803FFE0C690C7FC1D2677A426>99
+D<ED01F815FFA3150316F0A21507A216E0A2150FA216C0A2151FA21680A2153FA202F813
+00EB07FE90381F877F90383E03FF017C5BEBF80112013803F00048485B120FEBC001121F
+5DEA3F801403127F01005BA214075A485CA2140FA248ECC1C0A2141F15C3ED8380143F15
+87007C017F1300ECFF076C485B9038038F8E391F0F079E3907FE03FC3901F000F0253B77
+B92A>I<EB01C0EB07E014F0130F14E01307EB038090C7FCAB13F0EA03FCEA071EEA0E1F
+121CA212385B1270A25BEAF07E12E013FEC65AA212015B1203A25B12075BA2000F13E013
+C013C1001F13C01381A2EB83801303EB0700A2130E6C5AEA07F8EA01E0143879B619>
+105 D<EB0FC0EA07FFA3EA001F1480A2133FA21400A25BA2137EA213FEA25BA21201A25B
+A21203A25BA21207A25BA2120FA25BA2121FA25BA2123FA290C7FCA25AA2EA7E0EA212FE
+131EEAFC1CA2133C133812F81378EA7870EA7CE0121FEA0F80123B79B915>108
+D<D801E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F787F39383FF00114E0
+007813C000708114804A485AEAF07FEAE07EA20000140701FE5C5BA2150F00015D5B151F
+5E12034990383F8380160316070007027F130049137EA2160E000F147C49141E161C5E00
+1FEC3C7849EB1FE00007C7EA0780292679A42F>110 D<147F903803FFC090380FC1F090
+381F00F8017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7FC
+A215FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003EEB
+3F00147E6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391FE0
+3FF090393CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA01
+E113C15CA2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E
+013F495A6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201
+A25BA21203A25B1207B512C0A3293580A42A>I<14FE903807FF8090380F83C090383E00
+E04913F00178137001F813F00001130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F8
+14FE6C7F6D13807F010F13C01300143F141F140F123E127E00FE1480A348EB1F0012E06C
+133E00705B6C5B381E03E06CB45AD801FEC7FC1C267AA422>115
+D<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C01270
+013F131F00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE120349
+EBFC0EA20201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A00F8
+3C78E090393FF03FC090390FC00F00272679A42D>117 D E /Fj
+6 123 df<B61280A819087F9620>45 D<13FFB5FCA412077EAF4AB47E020F13F0023F13
+FC9138FE03FFDAF00013804AEB7FC00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA
+17FCA3EE1FF8A217F06E133F6EEB7FE06E14C0903AFDF001FF80903AF8FC07FE009039F0
+3FFFF8D9E00F13E0D9C00390C7FC2F3A7EB935>98 D<903803FF80011F13F0017F13FC39
+01FF83FE3A03FE007F804848133F484814C0001FEC1FE05B003FEC0FF0A2485A16F81507
+12FFA290B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14F86D14F000071403D801FFEB
+0FE06C9038C07FC06DB51200010F13FC010113E025257DA42C>101
+D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E
+7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE
+140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400
+38E01FF81F257DA426>115 D<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C
+5C6E4813E06CD9C03E13FF90387FFFFC011F13F00103138030257DA435>117
+D<003FB612C0A3D9F0031380EB800749481300003E5C003C495A007C133F5D0078495A14
+FF5D495B5BC6485B92C7FC495A131F5C495A017FEB03C0EBFFF014E04813C05AEC800748
+13005A49EB0F80485A003F141F4848133F9038F001FFB7FCA322257DA42A>122
+D E /Fk 59 123 df<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F
+0007017E497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA48
+6C497E267FFFE0B512C0A32A3B7FBA2E>12 D<001C131C007F137F39FF80FF80A26D13C0
+A3007F137F001C131C00001300A40001130101801380A20003130301001300485B000613
+06000E130E485B485B485B006013601A197DB92A>34 D<121C127FEAFF80A213C0A3127F
+121C1200A412011380A2120313005A1206120E5A5A5A12600A1979B917>39
+D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FC
+A25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E
+1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F
+6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0
+B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7
+FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E00FE14FE397F
+8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE
+3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007
+C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A412011380A212
+0313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C>I<121C127F
+EAFF80A5EA7F00121C0909798817>I<150C151E153EA2153C157CA2157815F8A215F014
+01A215E01403A215C01407A21580140FA215005CA2141E143EA2143C147CA2147814F8A2
+5C1301A25C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B
+1201A25B1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A
+12601F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E03901E000F0484813780007
+147C48487FA248C77EA2481580A3007EEC0FC0A600FE15E0B3007E15C0A4007F141F6C15
+80A36C15006D5B000F143EA26C6C5B6C6C5B6C6C485A6C6C485A90387E0FC0D91FFFC7FC
+EB03F8233A7DB72A>I<EB01C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB5
+12F0A31C3879B72A>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F
+00121C092479A317>58 D<121C127FEAFF80A5EA7F00121CC7FCB2121C127F5A1380A412
+7F121D1201A412031300A25A1206A2120E5A121812385A1260093479A317>I<EB3FE038
+01FFFE3907C03F80390E000FC0003CEB07F000301303007014F8007C130100FE14FC7EA4
+127E003CEB03F8C7FCEC07F0A2EC0FE0EC1F80EC3F00147E147C5C495A5C495A5CA249C7
+FCA31306AA90C8FCA8130EEB3F80497EA56D5A010EC7FC1E3B7CBA27>63
+D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC18
+0FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F167FA20106
+810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D8
+0FFC02071380B56C90B512FEA3373C7DBB3E>65 D<913A01FF800180020FEBE003027F13
+F8903A01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F
+01FE153F12014848151F4848150FA248481507A2485A1703123F5B007F1601A35B00FF93
+C7FCAD127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D000016
+18017F15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFF
+FC020F13F002011380313D7BBA3C>67 D<B712C016F816FE000190398001FF806C90C7EA
+3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC
+18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEB
+FF80B8C7FC16F816C036397DB83F>I<B812FCA30001903880000F6C90C71201EE007E17
+3E171E170EA31706A317078316C0A394C7FCA31501A21503150F91B5FCA3EC000F150315
+01A21500A21860A318E093C712C0A41701A3EF0380A21707A2170F173F177F486D903807
+FF00B9FCA333397DB839>I<B812F8A30001903880001F6C90C71201EE00FC177C173C17
+1CA2170CA4170E1706A2ED0180A21700A41503A21507151F91B5FCA3EC001F15071503A2
+1501A692C8FCAD4813C0B612C0A32F397DB836>I<B612C0A3C6EBC0006D5AB3B3AD497E
+B612C0A31A397EB81E>73 D<B649B5FCA3000101809038007FF06C90C8EA3F80053EC7FC
+173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5AED0780030EC9FC5D153E157E15FF5C
+4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E14804A6C7E6F7EA26F7F707EA2707E
+707EA2707EA2707E707EA2707E707F8484486D497FB6011FEBFF80A339397DB841>75
+D<B612E0A3000101C0C8FC6C90C9FCB3AD1718A517381730A31770A317F0A21601160316
+0FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807FFF86E5DA20001F0FC002600DFC0
+ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2
+027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C1360A26E6C13C0A3913901FC0180
+A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D4849
+7EB500C00203B512F8A2ED018045397DB84C>I<B5913807FFFE8080C69238007FE06EEC
+1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E8114
+0F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F
+1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E486C153E487ED8
+0FFC151EB500C0140EA2170637397DB83E>I<B712C016F816FE000190398001FF806C90
+C7EA3FC0EE0FE0EE07F0EE03F817FC17FE1601A217FFA717FEA2EE03FCA2EE07F817F0EE
+0FE0EE3FC0923801FF0091B512FC16F091C9FCB3A5487FB6FCA330397DB839>80
+D<B612FEEDFFE016F8000190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A6
+5FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82
+707E707EA2161F83A583A6F00180A217F8160F1803486D01071400B66D6C5A0401130693
+3800FE0ECAEA3FFCEF07F0393B7DB83D>82 D<D90FF813C090383FFE0190B512813903F8
+07E33907E000F74848137F4848133F48C7121F003E140F007E1407A2007C140312FC1501
+A36C1400A37E6D14006C7E7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F
+1480010714C0EB007F020713E0EC007FED3FF0151F150FED07F8A200C01403A21501A37E
+A216F07E15036C15E06C14076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03F
+FFF8010F13E0D8C00190C7FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE
+130348EE01F00078160000701770A300601730A400E01738481718A4C71600B3B0913807
+FF80011FB612E0A335397DB83C>I<B5D8FC07B5D8F001B5FCA30007902780001FFEC7EA
+1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E6C1406A2
+80013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5BEE181F
+A26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D913B7F81
+8001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFCEC3FF0
+A302075E4B141FA202035E4B140FA202015E4B1407A2020093C8FC4B80503B7EB855>87
+D<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C1403
+95C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383FE001
+5F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13B016
+E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>89 D<003FB7FCA39039FC0001FE01C0
+130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90C7FCA2
+4A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB0180
+A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E484849
+5A49130FB8FCA329397BB833>I<EAFFF8A4EAF000B3B3B3B3A3EAFFF8A40D5378BD17>I<
+3901800180000313033907000700000E130E485B00181318003813380030133000701370
+00601360A200E013E0485BA400CE13CE39FF80FF806D13C0A3007F137FA2393F803F8039
+0E000E001A1974B92A>I<EAFFF8A4EA0078B3B3B3B3A3EAFFF8A40D537FBD17>I<EB1FE0
+EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA414
+7FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA31401A26C13
+036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007C026277D
+A52A>97 D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F809039F7
+000FC001FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16FEA216FC
+15016D14F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E903800FFF8C7
+EA1FC0283B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F83907E001
+FC380FC003A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127FA26C1406
+7F001F140E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381FFF00EB07
+F81F277DA525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F9038F801
+EF3903F0007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA127E127FA2
+7EA26C6C131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90381FFE0F
+D907F813C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E0
+13F8380FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA212
+7FA26C14037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090
+381FFF80903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790383F0FF0
+137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7F
+BA19>I<ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903E007C03A
+07C003E010000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D48C7FC38
+073FFC38060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815C03A0F80
+007FE048C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0003F1407
+D80F80EB0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A>I<EA03
+F012FFA3120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF70013FE49
+6D7EA25BA35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0487EA56C
+5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<EA03F012
+FFA3120F1203B1913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E1438
+147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F81
+1680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>107 D<EA03F012FFA3120F1203B3
+B3AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01
+E07E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0
+A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF0
+00FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A348
+6C497EB500C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F848
+48137C48487F48487F4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8
+A9007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC6
+6C13F890387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF890
+38F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC1500
+16FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F00
+9038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<3807E01F00FF
+EB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A4
+5BB3A2487EB512F0A31C257EA421>114 D<EBFF03000313E7380F80FF381E003F487F48
+7F00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F010713
+80EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38
+E1FFF038C03F801A277DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6
+FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB2
+20>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F
+0000EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B5
+38803FFEA33A0FF8000FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D13
+0E017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FB
+C7FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF800903800
+0FF86C48017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA201
+7E9038EFC00C15C7A2D93F016D5A15830281EBF038D91F831430150102C3EBF87090260F
+C6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA2010014
+1E4A130E0260130C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7
+FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F80
+4A7E8114CF903801C7E090380383F090380703F8EB0601496C7E011C137E49137F01787F
+496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF800
+0FF06C48EB07C00003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2EC
+C070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430
+A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC027
+357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1F
+C0EC3F800060137F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA2
+485A485A0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F24
+7EA325>I E /Fl 10 58 df<EB3F803801FFF03803E0F83807803C48487E001E7F003E14
+80A2003C1307007C14C0A400FC14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A
+3803E0F86CB45A38003F801B277EA521>48 D<13381378EA01F8121F12FE12E01200B3AB
+487EB512F8A215267BA521>I<13FF000313E0380E03F0381800F848137C48137E00787F
+12FC6CEB1F80A4127CC7FC15005C143E147E147C5C495A495A5C495A010EC7FC5B5B9038
+70018013E0EA0180390300030012065A001FB5FC5A485BB5FCA219267DA521>I<13FF00
+0313E0380F01F8381C007C0030137E003C133E007E133FA4123CC7123E147E147C5C495A
+EB07E03801FF8091C7FC380001E06D7E147C80143F801580A21238127C12FEA21500485B
+0078133E00705B6C5B381F01F03807FFC0C690C7FC19277DA521>I<1438A2147814F813
+01A2130313071306130C131C131813301370136013C012011380EA03005A120E120C121C
+5A12305A12E0B612E0A2C7EAF800A7497E90383FFFE0A21B277EA621>I<0018130C001F
+137CEBFFF85C5C1480D819FCC7FC0018C8FCA7137F3819FFE0381F81F0381E0078001C7F
+0018133EC7FC80A21580A21230127C12FCA3150012F00060133E127000305B001C5B380F
+03E03803FFC0C648C7FC19277DA521>I<EB0FE0EB3FF8EBF81C3801E0063803C01F4848
+5AEA0F005A121E003E131E91C7FC5AA21304EB3FC038FCFFF038FDC078B4C67E143E4813
+1E141FA2481480A4127CA4003C1400123E001E131E143E6C133C6C6C5A3803C1F03801FF
+C06C6CC7FC19277DA521>I<1230123C003FB512E0A215C0481480A23970000700006013
+0E140C48131C5C5CC75A5C1301495AA249C7FC5B130E131EA3133E133CA2137CA413FCA8
+13781B287DA621>I<137F3803FFE0380781F8380E007C48131E5A801278A3127C007E13
+1EEA3F80EBE03C6C6C5A380FFCF03807FFC06C5BC613E0487F38079FFC380F07FEEA1E03
+48C67E48133FEC1F8048130FA21407A315001278140E6C5B6C5B380F80F03803FFE0C66C
+C7FC19277DA521>I<137F3801FFC03807C1E0380F0070001E1378003E7F003C133E007C
+131EA200FC131FA41580A4007C133FA2123C003E137F121E380F01DF3807FF9F3801FE1F
+D8001013001300A2143E123C007E133CA25C5C007C5B383003C0381C0780D80FFFC7FCEA
+03F819277DA521>I E /Fm 43 122 df<4AB4FC021F13C091387F01F0903901FC0078D9
+07F0131C4948133E494813FF49485A137F1400A213FE6F5A163893C7FCAA167FB8FCA339
+00FE00018182B3AC486CECFF80007FD9FC3F13FEA32F407FBF33>12
+D<001E130F397F803FC000FF137F01C013E0A201E013F0A3007F133F391E600F30000013
+00A401E01370491360A3000114E04913C00003130101001380481303000EEB070048130E
+0018130C0038131C003013181C1C7DBE2D>34 D<1430147014E0EB01C0EB03801307EB0F
+00131E133E133C5B13F85B12015B1203A2485AA2120F5BA2121F90C7FCA25AA3123E127E
+A6127C12FCB2127C127EA6123E123FA37EA27F120FA27F1207A26C7EA212017F12007F13
+787F133E131E7FEB07801303EB01C0EB00E014701430145A77C323>40
+D<12C07E12707E7E121E7E6C7E7F12036C7E7F12007F1378137CA27FA2133F7FA2148013
+0FA214C0A3130714E0A6130314F0B214E01307A614C0130FA31480A2131F1400A25B133E
+A25BA2137813F85B12015B485A12075B48C7FC121E121C5A5A5A5A145A7BC323>I<121E
+EA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A120E5A
+1218123812300B1C798919>44 D<B512FEA617067F961E>I<121EEA7F80A2EAFFC0A4EA
+7F80A2EA1E000A0A798919>I<EB01C013031307131F137FEA07FFB5FC139FEAF81F1200
+B3B3ACEB7FF0B612F8A31D3D78BC2D>49 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7
+FCB3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779A619>58 D<15074B7EA34B7EA34B
+7EA34B7EA34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3020E6D7EA34A6D7E
+A34A6D7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001A249C87EA2498201
+0E157FA2011E82011C153FA2013C820138151FA2017882170F13FC00034C7ED80FFF4B7E
+B500F0010FB512F8A33D417DC044>65 D<DB3FF01306912603FFFE130E020F9038FF801E
+913A3FF007E03E9139FF8000F8D903FEC7EA7C7ED907F8EC1EFE4948140FD93FE0140749
+481403495A91C812014848150012034848167E5B000F173EA24848161EA2123F5B180E12
+7FA349160012FFAC127F7F180EA2123FA27F001F171E181C6C7EA20007173C6D16386C6C
+1678000117706C6C16F06EEC01E06D6C15C06D6C1403D90FF0EC07806D6CEC1F00D903FE
+143E902600FF8013F891393FF007F0020FB512C0020391C7FC9138003FF037427BBF42>
+67 D<B912E0A300019038C000016C6C48EB001FEF0FF01703A217011700A31870A41838
+161CA41800A2163CA2167C16FC150391B5FCA3EC80031500167C163CA2161CA21807A318
+0E93C7FCA4181E181CA2183CA2187CA218F8170117031707171F48486CEB01FFB912F0A3
+383E7DBD3E>69 D<B91280A300019038C000036C6C48EB007FEF1FC0170F1707A21703A3
+1701A4EF00E0A21638A31800A31678A216F81501150791B5FCA3EC8007150115001678A2
+1638A693C8FCAF3801FFE0B612F0A3333E7DBD3B>I<B612F0A3C6EBF000EB3FC0B3B3B2
+EBFFF0B612F0A31C3E7EBD21>73 D<B612F8A3000101E0C9FC38007F80B3B0EF0380A517
+071800A45FA35FA25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>76
+D<B712C016FCEEFF800001D9C00013E06C6C48EB1FF0EE07FCEE01FE707E84717EA2717E
+A284A760177F606017FF95C7FCEE01FCEE07F8EE1FE0EEFF8091B500FCC8FC16F0913880
+01FCED003FEE1FC0707E707E83160383160183A383A484A4F0C004190EA28218E0057F13
+1E2601FFE0161CB600C0EB3FF094381FF83805071370CA3801FFE09438003F803F407DBD
+43>82 D<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E1707127C
+00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42>
+84 D<007FB5D8C003B512E0A3C649C7EBFC00D93FF8EC3FE06D48EC1F806D6C92C7FC17
+1E6D6C141C6D6C143C5F6D6C14706D6D13F04C5ADA7FC05B023F13036F485ADA1FF090C8
+FC020F5BEDF81E913807FC1C163C6E6C5A913801FF7016F06E5B6F5AA26F7E6F7EA28282
+153FED3BFEED71FF15F103E07F913801C07F0203804B6C7EEC07004A6D7E020E6D7E5C02
+3C6D7E02386D7E14784A6D7E4A6D7F130149486E7E4A6E7E130749C86C7E496F7E497ED9
+FFC04A7E00076DEC7FFFB500FC0103B512FEA33F3E7EBD44>88 D<B66C0103B51280A300
+0101F0C8EBF8006C6C48ED3FC0725A013F041EC7FC6D7E606D6C15386D6C1578606D6C5D
+6E14016D5E6D6D1303606E6C49C8FC6E6C5B170E6E6C131E171C6E6C5B6E6C137817706E
+6C13F06F5B6E13016EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE5E150F6F5AB3A4ED1FFC
+020FB512FCA3413E7FBD44>I<486C13C00003130101001380481303000EEB070048130E
+0018130C0038131C003013180070133800601330A300E01370481360A400CFEB678039FF
+C07FE001E013F0A3007F133FA2003F131F01C013E0390F0007801C1C73BE2D>92
+D<EB0FF8EBFFFE3903F01F8039078007E0000F6D7E9038E001F8D81FF07F6E7EA3157F6C
+5AEA0380C8FCA4EC1FFF0103B5FC90381FF87FEB7F803801FC00EA07F8EA0FE0485A485A
+A248C7FCEE038012FEA315FFA3007F5BEC03BF3B3F80071F8700261FC00E13CF3A07F03C
+0FFE3A01FFF807FC3A003FC001F0292A7DA82D>97 D<EA01FC12FFA3120712031201B1EC
+03FC91381FFF8091387C07E09039FDE001F09039FFC000FC4A137E91C77E49158049141F
+17C0EE0FE0A217F0A2160717F8AA17F0A2160FA217E0161F17C06D1580EE3F006D5C6E13
+FE9039F3C001F89039F1E003F09039E0780FC09026C03FFFC7FCC7EA07F82D407EBE33>
+I<49B4FC010F13E090383F00F8017C131E4848131F4848137F0007ECFF80485A5B121FA2
+4848EB7F00151C007F91C7FCA290C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13
+076C6C14000003140E6C6C131E6C6C137890383F01F090380FFFC0D901FEC7FC222A7DA8
+28>I<ED01FC15FFA3150715031501B114FF010713E190381F80F990387E003D49131FD8
+03F81307485A49130348481301121F123F5B127FA290C7FCA25AAA7E7FA2123FA26C7E00
+0F14037F000714076C6C497E6C6C497ED8007C017913F890383F01F190380FFFC1903A01
+FE01FC002D407DBE33>I<EB01FE90380FFFC090383F03F09038FC01F848486C7E484813
+7E48487F000F158049131F001F15C04848130FA2127F16E090C7FCA25AA290B6FCA290C9
+FCA67EA27F123F16E06C7E1501000F15C06C6C13036DEB07806C6C1400C66C131E017E5B
+90381F80F8903807FFE0010090C7FC232A7EA828>I<EC1FC0EC7FF8903801F83C903807
+E07E90380FC0FFEB1FC1EB3F811401137FEC00FE01FE137C1500AEB6FCA3C648C7FCB3AE
+487E007F13FFA320407EBF1C>I<167C903903F801FF903A1FFF078F8090397E0FDE1F90
+38F803F83803F001A23B07E000FC0600000F6EC7FC49137E001F147FA8000F147E6D13FE
+00075C6C6C485AA23901F803E03903FE0FC026071FFFC8FCEB03F80006CAFC120EA3120F
+A27F7F6CB512E015FE6C6E7E6C15E06C810003813A0FC0001FFC48C7EA01FE003E140048
+157E825A82A46C5D007C153E007E157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE01
+7FC7FC90383FFFFC010313C0293D7EA82D>I<EA01FC12FFA3120712031201B1EC01FE91
+3807FFC091381E07E091387803F09138E001F8D9FDC07F148001FF6D7E91C7FCA25BA25B
+B3A6486C497EB5D8F87F13FCA32E3F7DBE33>I<EA01E0EA07F8A2487EA46C5AA2EA01E0
+C8FCACEA01FC127FA3120712031201B3AC487EB512F0A3143E7DBD1A>I<EA01FC12FFA3
+120712031201B292B51280A392383FFC0016E0168093C7FC153C5D5D4A5AEC07C04A5A4A
+C8FC143E147F4A7E13FD9038FFDFC0EC9FE0140F496C7E01FC7F496C7E1401816E7E8182
+6F7E151F826F7EA282486C14FEB539F07FFFE0A32B3F7EBE30>107
+D<EA01FC12FFA3120712031201B3B3B1487EB512F8A3153F7DBE1A>I<2701F801FE14FF
+00FF902707FFC00313E0913B1E07E00F03F0913B7803F03C01F80007903BE001F87000FC
+2603F9C06D487F000101805C01FBD900FF147F91C75B13FF4992C7FCA2495CB3A6486C49
+6CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<3901F801FE00FF903807FFC091381E
+07E091387803F000079038E001F82603F9C07F0001138001FB6D7E91C7FC13FF5BA25BB3
+A6486C497EB5D8F87F13FCA32E287DA733>I<14FF010713E090381F81F890387E007E01
+F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8A2003F15FCA248C812
+FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6CEB07E06C6CEB0FC0
+6C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC282A7EA82D>I<3901FC
+03FC00FF90381FFF8091387C0FE09039FDE003F03A03FFC001FC6C496C7E91C7127F49EC
+3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3FC06D1580EE7F007F6E
+13FE9138C001F89039FDE007F09039FC780FC0DA3FFFC7FCEC07F891C9FCAD487EB512F8
+A32D3A7EA733>I<3901F807E000FFEB1FF8EC787CECE1FE3807F9C100031381EA01FB14
+01EC00FC01FF1330491300A35BB3A5487EB512FEA31F287EA724>114
+D<90383FC0603901FFF8E03807C03F381F000F003E1307003C1303127C0078130112F814
+00A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C1480000114C0D8003F13E00103
+13F0EB001FEC0FF800E01303A214017E1400A27E15F07E14016C14E06CEB03C090388007
+8039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6133CA4137CA213FCA2120112
+031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912009038FE01C0A2EB7F03013F1380
+90381F8700EB07FEEB01F81B397EB723>I<D801FC14FE00FF147FA30007140300031401
+00011400B3A51501A31503120015076DEB06FF017E010E13806D4913FC90381FC0789038
+07FFE00100903880FE002E297DA733>I<B539E00FFFE0A32707FE000313006C48EB00FC
+5E00015D7F00005DA26D13016D5CA26D6C485AA2ECC007011F91C7FCA290380FE00EA2EC
+F01E0107131CA26D6C5AA2ECFC7801011370A2ECFEF001005BA2EC7FC0A36E5AA26EC8FC
+A3140E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE003FE00013C06C486D48EB3F806C
+4817006D010F141E00016F131C15076D163C00004A6C1338A2017F5E4B7E151DD93F805D
+ED3DFC1538D91FC04A5AED78FE9238707E03D90FE0017F5BEDE03F02F0140701070387C7
+FC9138F1C01F02F9148F010315CE9138FB800F02FF14DE6D15FCED00076D5DA24A130302
+7E5CA2027C1301023C5C023813003D287EA642>I<B539F01FFFE0A30003D9C00F1300C6
+90388007F8D97F0013E002805BD93FC05B011F49C7FC90380FE00EECF01E6D6C5A01035B
+6D6C5A6E5AEB00FF6E5A6E5A81141F814A7E81147BECF1FC903801E1FEECC0FF01037F49
+486C7ED90F007F011E6D7E013E130F496D7E01FC80486C80000F4A7EB539803FFFF8A32D
+277FA630>I<B539E00FFFE0A32707FE000313006C48EB01FC6F5A00015D7F00005DA201
+7F495AA2EC8003013F5CA26D6C48C7FCA26E5A010F130EA26D6C5AA2ECF83C01031338A2
+6D6C5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2140EA2141E141C143C1438A21478
+00181370127EB45BA2495AA248485AD87E07C9FCEA780EEA3C3CEA1FF8EA07E02B3A7EA6
+30>I E /Fn 10 58 df<EB3FC0EBFFF03803E07C48487E48487E497E001EEB0780A2003E
+14C0A248EB03E0A500FC14F0B0007C14E0A3007E1307003E14C0A36CEB0F806C14006D5A
+3807C03E3803F0FC3800FFF0EB3FC01C2D7DAB23>48 D<130C133C137CEA03FC12FFEAFC
+7C1200B3B113FE387FFFFEA2172C7AAB23>I<EB7F803801FFF0380780FC380E003F48EB
+1F8048EB0FC05A0060EB07E012F000FC14F07E1403A3007C1307C7FCA215E0140F15C014
+1F1580EC3F00147E147C5C495A495A495A495A011EC7FC5B5B4913305B485A4848136048
+C7FC000E14E0001FB5FC5A4814C0B6FCA21C2C7DAB23>I<EB3FC03801FFF03807C0FC38
+0E007E487FEC1F80003F14C0A2EB800F1300A2000C131FC7FC1580A2EC3F00143E5C5CEB
+03F0EBFFC014F0EB00FC143FEC1F8015C0140F15E0A2EC07F0A21238127C12FEA3EC0FE0
+12F8006014C00070131F6C1480001EEB3F00380780FC3801FFF038007FC01C2D7DAB23>
+I<140EA2141E143EA2147E14FEA2EB01BE1303143E1306130E130C131813381330136013
+E013C0EA0180120313001206120E120C5A123812305A12E0B612FCA2C7EA3E00A9147F90
+381FFFFCA21E2D7EAC23>I<000CEB0180380FC01F90B512005C5C14F014C0D80C7EC7FC
+90C8FCA8EB1FC0EB7FF8380DE07C380F801F01001380000E130F000CEB07C0C713E0A214
+0315F0A4127812FCA448EB07E012E0006014C00070130F6C14806CEB1F006C133E380780
+F83801FFE038007F801C2D7DAB23>I<EB03F8EB0FFE90383E0780EBF8013901F007C038
+03E00FEA07C0EA0F80A2391F00078091C7FC123EA2127EA2127CEB0FC038FC3FF0EBF07C
+38FDC01EB4487E01001380EC07C04814E0A214034814F0A4127CA3127EA2003E14E01407
+121E001F14C06CEB0F803907801F003803C03E6C6C5A38007FF0EB1FC01C2D7DAB23>I<
+1230123C003FB512F8A215F05A15E039700001C000601480140348EB0700140E140CC712
+1C5C143014705C495AA2495AA249C7FCA25B130E131EA2133EA3133C137CA413FCA91378
+1D2E7CAC23>I<EB1FC0EBFFF03803E07C3807801E48487E001EEB0780A248EB03C0A412
+3E1407003F1480381FC00F01E01300EBF81E6C6C5A3807FFF86C13E0C6FCEB3FF8EBFFFC
+3803C7FFD807831380D81F0013C0001E133F48EB1FE0007C13070078EB03F012F8481301
+1400A46C14E000781301007C14C0003C13036CEB0780390F800F003807E03C3801FFF038
+003FC01C2D7DAB23>I<EB3F80EBFFF03803E0783807C03E48487E48487E003E14801407
+007E14C0127C00FC14E01403A315F0A5007C1307127EA2003E130F7E6C131F3807803B38
+03E0F33800FFC390383F03E013001407A215C0A2140F001E1480003F14005C143E143C00
+3E5B001C5B380E03E03807FF80D801FEC7FC1C2D7DAB23>I E /Fo
+6 118 df<B512FEA617067F961E>45 D<B612F015FF16C016F016FC90C7EA3FFEED03FF
+03001380EE3FC0EE1FE0160F17F0160717F81603A5160717F0160FA2EE1FE0EE3FC016FF
+03031380031F130090B65A16F85E16C04BC7FC5DEB0001811400816F7E153F82151F826F
+7EA26F7E1503826F7EA26F7EA2EE7F80163F17C0EE1FE0A2EE0FF0A2EE07F8EE03FCA2EE
+01FE2F3F78BE3B>82 D<007FB712F8A517F0C9EA3FE0A2EE7FC0EEFF80A24B13004B5AA2
+4B5A4B5AA24B5A153F5E4B5A15FF5E4A90C7FCA24A5A4A5AA24A5A4A5AA24A5A4A5AA24A
+5A4990C8FCA2495A495AA2495A131F5C495A137F5C495AA24890C9FC485AA2485A485AA2
+485A485AA248B712FCB8FCA52E3F7BBE38>90 D<12FEB3A414FF010713E0011F7F017F7F
+B67E819038F80FFFEBE001D98000138090C7EA7FC0153F48141F16E0150FA3ED07F0AAED
+0FE0A3151FED3FC07E6DEB7F8015FFD9E00313009038F81FFE90B55A485C6D5B6D5B010F
+1380260001FEC7FC244079BE2F>98 D<EB03F8EB1FFF017F13C090B57E488048803807FE
+07390FF801FC9038E000FE4848137E003F143E49133F90C77E5A127EED0F80B7FCA600FC
+C9FCA37E127EA2127FA26C7EA26C7E6D14806C6C1303D807FC131F01FF13FF6C90B5FC7E
+6C6C14006D13FC010F13E0010190C7FC212B7DA928>101 D<00FE147FB3AC15FFA25C6C
+5B6C130FEBC03F90B6FC6CEBFE7F6C13FC6C13E0000390C7FC202979A72F>117
+D E /Fp 7 117 df<16FCA24B7EA24B7EA34B7FA24B7FA34B7FA24B7FA34B7F157C03FC
+7FEDF87FA2020180EDF03F0203804B7E02078115C082020F814B7E021F811500824A8102
+3E7F027E81027C7FA202FC814A147F49B77EA34982A2D907E0C7001F7F4A80010F835C83
+011F8391C87E4983133E83017E83017C81B500FC91B612FCA5463F7CBE4F>65
+D<903807FFC0013F13F848B6FC48812607FE037F260FF8007F6DEB3FF0486C806F7EA36F
+7EA26C5A6C5AEA01E0C8FC153F91B5FC130F137F3901FFFE0F4813E0000F1380381FFE00
+485A5B485A12FF5BA4151F7F007F143F6D90387BFF806C6C01FB13FE391FFF07F36CEBFF
+E100031480C6EC003FD91FF890C7FC2F2B7DA933>97 D<13FFB5FCA512077EAFEDFFE002
+0713FC021FEBFF80027F80DAFF8113F09139FC003FF802F06D7E4A6D7E4A13074A807013
+80A218C082A318E0AA18C0A25E1880A218005E6E5C6E495A6E495A02FCEB7FF0903AFCFF
+01FFE0496CB55AD9F01F91C7FCD9E00713FCC7000113C033407DBE3A>I<EC7FF00107B5
+FC011F14C0017F14E09039FFF01FF0489038800FF848EB001F4848EB3FFC120F485AA248
+5AA2007FEC1FF849EB0FF0ED03C000FF91C7FCAB127F7FA3003F153E7F001F157E6C6C14
+7C6C6C14FC91388001F86C9038C003F0C69038F81FE06DB512C0011F14800107EBFE0090
+38007FF0272B7DA92E>I<3901FE01FE00FF903807FF804A13E04A13F0EC3F1F91387C3F
+F8000713F8000313F0EBFFE0A29138C01FF0ED0FE091388007C092C7FCA391C8FCB3A2B6
+FCA525297DA82B>114 D<90383FFC1E48B512BE000714FE5A381FF00F383F800148C7FC
+007E147EA200FE143EA27E7F6D90C7FC13F8EBFFE06C13FF15C06C14F06C806C806C806C
+80C61580131F1300020713C014000078147F00F8143F151F7EA27E16806C143F6D140001
+E013FF9038F803FE90B55A15F0D8F87F13C026E00FFEC7FC222B7DA929>I<EB07C0A513
+0FA4131FA3133F137FA213FF5A1207001FEBFFFEB6FCA40001EBC000B3151FA96CEBE03E
+A2017F137EECF8FC90383FFFF86D13F0010713E001001380203B7EB929>I
+E /Fq 20 118 df<027FEB3FC0903801FFC013075B5B5B14C190387F804091C9FC5B5BA2
+1201AEB638C03FC0A6D801FEC7FCB3B3A22A467EC534>12 D<B612C0A61A067F9821>45
+D<ED3FFE0203B512F0020F14FE023FECFF8091B7FC5B49D9E0071300010F90C7FCD91FFC
+141F49481407D97FE0804A91C7FC495A4890CAFC5A5B485AA2485AA2485AA2485AA3485A
+A5485AAD6C7EA56C7EA36C7EA26C7EA26C7EA26C7E7F7E6C6D15806D6C14016E1403D93F
+F8140F6D6CEC1FC06DB4147F01039038E003FF6D90B612806DEDFE00023F5C020F14F002
+0314C09126003FFCC7FC32497AC63E>67 D<B47EB3B3B3A990B612FEA6274577C435>76
+D<B612F8EDFF8016F016FC82707E902680000F7F03017F6F6C7EEE1FF8707E1607707EA2
+160183A282A35EA25F1603A24C5A160F4C5AEE7FF04B485A030F5B90B75A4CC7FC5E16F0
+168093C8FCEB800082157F82153F826F7EA26F7E1507821503821501826F7FA2707E163F
+83161F83707EA2707EA2707E160183701380A2EF7FC0324577C43F>82
+D<EC3FF80103B57E010F14E0013F14F84914FE90B7FC5A48EBC00F4890380001FED80FFC
+EB007E49141E4848140E484814064991C7FCA2485AA77FA26C7E7F7F6C7E6CB4FC14E06C
+13FE6CEBFFC06C14FC6C14FF6D14C06D80010F14F8010380D9003F7F02037FEC007F030F
+1380030313C01500167FEE3FE0A2161F17F0A2160FA7EE1FE012600070153F007816C000
+7E157F007FEDFF80D8FFE049130001F813079039FF803FFE6C90B55A001F5D00075D0001
+15C06C6C5C010F01FCC7FC010013E02C497CC636>I<003FB81280A51800C9EA07FEA24C
+5A5F161F4C5AA24C5A4C5AA24B5B4B90C7FCA24B5A4B5AA24B5AA24B5A4B5AA24B5A4A5B
+A24A90C8FC4A5AA24A5A5D141F4A5AA24A5A4A5AA2495B4990C9FCA2495A495AA2495AA2
+495A495AA2495A485BA24890CAFC485AA2485A5B121F485AA248B81280B9FCA531457BC4
+3C>90 D<B4FCB3A6EC3FC0903803FFF0010F13FC013F7F497F90B61280D9FE0313C0D9F0
+0013E049137F49EB1FF05B90C7EA0FF8150716FC1503A316FE1501AAED03FCA3150716F8
+150F16F06D131F6DEB3FE06D137F9039F001FFC0D9FC07138090B612006D5B6D5B6D5B01
+0713E0C790C7FC274679C432>98 D<EC7FE0903803FFFE010FEBFF80013F14E04914F090
+B6FC48EB801F3A03FE0003E04848130048481460491400485AA2485AA2485AA390C9FC5A
+AA6C7EA37F123FA26C6C14106D14306C6C14F06C6C13016C6C13079038FF803F6C90B5FC
+6C6C14E06D14806D1400010713F8010013C0242F7DAD2B>I<EB01FE903807FFC0011F13
+F0017F7F90B57E488048EB03FF3807FC004848EB7F8049133F4848EB1FC0150F484814E0
+491307127FA290C7FCED03F0B7FCA648C9FCA37EA27EA27F123F7FA26C7E6D14106C6C14
+706C6CEB01F06C6C13079038FF803F6C90B5FC6C15E0013F14806DEBFE00010713F80100
+13C0242F7DAD2B>101 D<B4FCB3A6EC7FC0903801FFF801077F011F7F497F491480EBFE
+03D9F80013C049137F49133F4914E0151F5BA390C7FCB3AC234579C432>104
+D<EAFF80A9C7FCB0EA7F80B3B3A809457AC417>I<12FFB3B3B3AF084579C417>108
+D<DA7FC0EB0FF827FF01FFF8EB3FFF01076D90B51280011FD9FE0314C0496D4814E04902
+8F14F0D9FE0390389FC07FD9F8009039FF001FF8496D48130F496D481307494A14FC031F
+1403495CA390C75BB3AC3E2D79AC4D>I<EC7FC039FF01FFF801077F011F7F497F491480
+EBFE03D9F80013C049137F49133F4914E0151F5BA390C7FCB3AC232D79AC32>I<EC7F80
+903803FFF0010F13FC013F13FF498090B67E4801C07F3A03FE001FF048486D7E48486D7E
+49130348486D7E491300003F814980007F1680A390C8123F4816C0AA6C6CEC7F80A36D14
+FF003F16006D5B001F5D6D13036C6C495A6C6C495A6D131F3A03FFC0FFF06C90B55A6C5D
+013F91C7FC6D5B010313F09038007F802A2F7DAD31>I<EC3FC039FF03FFF0010F13FC01
+3F7F497F90B61280D9FE0713C0D9F00013E049137F49EB3FF049131F90C7EA0FF8A2ED07
+FCA21503A216FE1501AAED03FCA3150716F8150FED1FF07F6DEB3FE06D13FF6D4813C0D9
+FC0F138090B612006D5B6D5B6D5B010713E0010090C7FC91C8FCB2274079AC32>I<141F
+00FE13FF13035B131F5B5BEBFFF0148038FFFE005B5B5B5B5BA25BA390C7FCB3A8182D79
+AC21>114 D<EB3FF848B5FC4814C0000F14F04814F85AEBE00F397F8001F090C7127000
+FE14301500A57E7FEA7FE013FC383FFFE06C13FC14FF000714806C14E06C14F06C7E0107
+13F89038003FFC14071403EC01FEA21400A412400070EB01FC1278007E130339FFE01FF8
+90B512F0A26C14E0001F14800003EBFE0038003FF01F2F7DAD25>I<B4EC1FE0B3AE153F
+A2157FA26D13FF1403387FE00F90B6FC6C14DF151F6C13FC000713F0000190C8FC232D79
+AB32>117 D E /Fr 4 116 df<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A78891B>
+58 D<91B612F8A3020001E0C8FC6F5A4B5AA293C9FCA35C5DA314035DA314075DA3140F
+5DA3141F5DA3143F5DA3147F5DA314FF92CAFCA35B4A16C0A21801010317804A15031900
+A201075E4A1506180E181E010F161C4A153C18381878011F16F84A4A5A1703013F150F4D
+5A4A14FF01FF02075BB9FCA2603A447CC342>76 D<01F8D903FCEC7F80D803FED91FFF90
+3803FFE0D8071F903B7C0FC00F81F83E0E0F80E007E01C00FC001C9026C3C0030178137C
+271807C700D9F0E0137E02CE902601F1C0133E003801DCDAFB80133F003001D892C7FCD9
+0FF814FF0070495C0060495CA200E04949485CD8C01F187E4A5C1200040715FE013F6091
+C75BA2040F14014960017E5D1903041F5D13FE494B130762043F160E0001060F130C4992
+C713C0191F4CED801C00031A1849027E1638F2003004FE167000071A60494A16E0F201C0
+030192380F0380000FF18700494AEC03FED80380D90070EC00F84F2D7DAB55>109
+D<EC0FF0EC7FFE903901F00F809039078001C049C712E0011E14605BED01F0491307A201
+F8EB0FE05B7FED03806D90C7FC7F7F14F86DB47E15E06D13F86D7F01077F1300EC07FF14
+0081ED3F80151F120E003FEC0F00487EA25D48C7121EA200FC5C12605D00705C6C495A6C
+EB07C0260F803FC7FC3803FFFC38007FE0242D7BAB2E>115 D E
+/Fs 64 123 df<ED0FFF4AB512C0020F14F0027F80903A01FFF803FC499038C000FE010F
+EB00034948497E49485B5C495A4C138001FF6E13005CA3705AEE01F893C8FCA74BB51280
+B9FCA5C69038E00003B3B0007FD9FFC1B6FCA538467EC53E>12 D<D807C0EB07C0D81FF0
+EB1FF0486C497E486C497E486C497E6D80A36E1480A36C806C80D81FF7EB1FF7D807C7EB
+07C7D80007EB0007010F140FA291C71300A2495C011E141E013E143EA2495C01FC14FC49
+5C4848495A4848495A000714074848495A4848495A001EC7001EC7FC000C140C29227CC4
+3A>34 D<141FA5ECFFE0010713FE013F6D7E4914E048B612F84890389F1FFC3A07FC1F01
+FED80FF0EB007FD81FE08001C0EC1F80003FED0FC001801407007F150F0100EC7FE016FF
+485CA41380A201C06D13C013E001F0EC3F0001F891C7FCEA7FFCEBFF9F14FF6C14C015F8
+6C14FE6C6E7E16E06C816C81C6816D80131F01078001001580141F6F13C0150F81030113
+E0000680EA3FC0D87FE0147FD8FFF0143FA3161FA313E017C01380D87800143F127C1780
+6C157F003FEDFF00D81F80495AD80FE01303D807F8495AD803FFEB3FF86C90B55A6C15C0
+013F91C7FC010F13FC010013E0021FC8FCA52B517ACA38>36 D<EC01E01403EC0FC0EC1F
+80EC3F00147E5C1301495A495A5C130F495A133F5C137F49C7FCA2485AA2485AA212075B
+A2120F5BA2121FA25B123FA4485AA612FFA25BAE7FA2127FA66C7EA4121F7FA2120FA27F
+1207A27F1203A26C7EA26C7EA26D7E133F80131F6D7E1307806D7E6D7E1300147E80EC1F
+80EC0FC0EC03E014011B6476CA2C>40 D<12F07E127E7E6C7E6C7E6C7E7F6C7E6C7E1200
+7F137F80133F806D7EA26D7EA26D7EA2801303A2801301A280A27F1580A4EC7FC0A615E0
+A2143FAE147FA215C0A6ECFF80A415005BA25CA213035CA213075CA2495AA2495AA2495A
+5C137F91C7FC13FE5B1201485A485A5B485A485A48C8FC127E12F85A1B647ACA2C>I<14
+3E147F4A7EA56EC8FC00081508003E153E007F157FD8FFC0903801FF8001E05B9038F03E
+0701F85BD87FFE013F130001FF5B001F9038BEFFFC000390B512E0C66C91C7FC010F13F8
+010113C0A2010F13F8017F13FF0003B612E0001F01BE13FC007F90383E7FFF01FE7FD8FF
+F8010F138001F07F9038E07F0301C07FD87F009038007F00003E153E00081508C791C7FC
+4A7EA56EC8FC143E292C79CA38>I<161E163FB3AF007FBB1280BC12C0A46C1A80C9003F
+CAFCB3AF161E4A4A7ABD57>I<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA7F
+FCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03FF
+133FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D7E
+90B612E0000315F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001C0
+15E001F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B13804B
+1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE49
+5A494814F8D907E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5AB8
+FC17C0A42D417BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3FFE
+D807E06D7E81D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B5A
+4B5A4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF80
+816F13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A4949
+13C05BD83F80491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49C7
+FC010113E02D427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E714
+0715C7EC0F87EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E5B
+A25B485A485A485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280A5
+31417DC038>I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15E0
+92C8FC01C0C9FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01FC
+6D7E01F06D13804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF7F
+A317F05B5D6C4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD807
+FEEBFFFC6CB612F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E021F
+13F0027F13FC49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFFE0
+48495A5A1400485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC91
+381FFF8000FF017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A6C
+13C05B6F13E0A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C15
+C06D4913806C018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC90
+38003FF02D427BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A24816
+80007EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E5D
+A24A5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D5A
+6D5A6D5A2F447AC238>I<EC7FF00103B5FC010F14C0013F14F090397F801FFC3A01FC00
+03FE48486D7E497F4848EC7F80163F484815C0A2001F151FA27FA27F7F01FE143F6D1580
+02C0137F02F014006C01FC5B6E485A6C9038FF83FCEDE7F86CECFFE06C5D6C92C7FC6D14
+C06D80010F14F882013F8090B7FC48013F14802607FC0F14C0260FF80314E04848C6FC49
+6D13F0003F141F48481307496D13F8150000FF157F90C8123F161F160FA21607A36D15F0
+127F160F6D15E06C6C141F6DEC3FC06C6CEC7F80D80FFE903801FF003A07FFC00FFE6C90
+B55AC615F0013F14C0010F91C7FC010013F02D427BC038>I<EC7FF0903807FFFE011F6D
+7E017F14E09039FFE03FF0489038800FF848496C7E48488048486D7E001F80003F1680A2
+484815C08117E0A212FF17F0A617F8A45D127FA3003F5CA26C7E5D6C6C5B12076C6C131E
+6CEBC07C6CEBFFF8013F5B010F01C013F00101130090C8FCA217E05DA2EA03C0D80FF015
+C0487E486C491380A217004B5A150F5E49495A6C48495A01C0EBFFE0260FF0035B6CB65A
+6C4AC7FC6C14F86C6C13E0D907FEC8FC2D427BC038>I<EA07C0EA1FF0EA3FF8EA7FFCEA
+FFFEA7EA7FFCEA3FF8EA1FF0EA07C0C7FCAEEA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7F
+FCEA3FF8EA1FF0EA07C00F2C78AB1F>I<903807FFC0013F13FC48B612804815E0260FF8
+0013F0D81FC0EB3FF848C7EA1FFC4815FE01C0130F486C14FF7FA66C485B6C4814FE000F
+C7FCC8EA3FFCED7FF8EDFFF04A13E04A13801600EC07FC4A5A5D4A5A5D4A5A92C7FCA214
+7E147CA31478AA91C8FCA814F8EB03FE497E497FA2497FA56D5BA26D90C7FC6D5AEB00F8
+28467AC535>63 D<EE1F80A24C7EA24C7EA34C7EA24B7FA34B7FA24B7FA34B7F169F031F
+80161F82033F80ED3E07037E80157C8203FC804B7E02018115F0820203814B137F020781
+5D173F020F814B7F021F8292C77EA24A82023E80027E82027FB7FCA291B87EA2498302F0
+C8FCA20103834A157F0107834A153FA249488284011F8491C97E4984133E017E82B6020F
+B612F0A54C457CC455>65 D<B9FC18F018FE727E19E026003FFCC700077F05017F716C7E
+727E727EA2721380A37213C0A74E1380A24E1300A24E5A4E5A4E5A4D5B05075B94B51280
+91B700FCC7FC18F018FF19E002FCC7000113F8716C7EF01FFE727E7213801AC07213E0A2
+7213F0A31AF8A71AF0A2601AE0604E13C0604E138095B5120005075BBA12F86119C04EC7
+FC18E045447CC350>I<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE07
+91B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948814948
+167F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC
+12FFAE127F7F1AF0A2123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C
+6DEE1F006D6C5E6D6C167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFF
+F001FF80023F90B6C7FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>I<
+BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193EA3191EA21778A285
+A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F101E01778A2F103C0
+A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4DB5FCBBFC61A44344
+7DC34A>69 D<BA1280A419C026003FFEC7121F1701EF007F183F181F180F180719E01803
+A31801A3EE01E0F000F0A419001603A31607160F167F91B6FCA59138FE007F160F160716
+03A31601A693C9FCAFB712F0A53C447CC346>I<DCFFF01470031F01FF14F04AB6EAE001
+0207EDF803023FEDFE0791B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990
+C87E4948814948814948167F4849163F4849161F5A4A160F485B19074890CAFC19035A5B
+A2007F1801A34994C8FC12FFAD057FB612F0127F7FA3003FDC0001EBF000A27F7EA26C7F
+A26C7F807E6C7F6C7F6D7E6D6C5D6D6C7E6D6D5C6D01F05C010101FE143F6D903AFFF001
+FF9F023F90B6120F0207EDFC030201EDF000DA001F02C01330030001FCC9FC4C467AC458
+>I<B712E0A5D8001F90C7FCB3B3B3A4B712E0A523447DC32A>73
+D<B76C0103B512F8A526003FFEC93807E0004F5A4F5A077EC7FC614E5A4E5A4E5AF01F80
+4EC8FC187E604D5AEF07F0EF0FC04D5A4DC9FC177E4C5AEE03F04C5A4C5A4C7EEE7FF04C
+7E5D4B7F4B7F4B7FED3F3FDB7E1F7F03FC806E486C7F4B7E4B6C7F0380804B6C7F4A7F71
+7E84717F83717F85717F83717F85717F187F727E86727F84727F86727F84B76C90B612FC
+A54E447CC358>75 D<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187E
+A218FE170117031707171F177FEE03FFB95AA539447CC343>I<B500FE067FB512806E95
+B6FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161E
+A26E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6C
+EC0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA3
+706C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057F
+B6128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181A281D8003F6D91C7EA7800
+81013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E6F7F83816F7F6F7F6F7F6F
+7F6F7F8382707F707F707F707F8482707F707F717E7113807113C019E0837113F07113F8
+7113FC7113FE19FF847213F884848484A28484197F193F191FA2190F1907B61603190119
+001A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC
+902601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E49486F7E49486F7E01
+FF8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F04982003F19F8A300
+7F19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0
+A26C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C001
+075B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002004AC8FC030713
+C047467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F7F05017F716C7E727E727E
+721380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A4D485A050F5B92B712C096
+C7FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<B812F8EFFFC018F818FE727ED800
+1F90C7003F13E005037F05007F727E727E727EA28684A286A762A24E90C7FCA24E5A6118
+7F943801FFF005075B053F138092B7C8FC18F818E018F892C77FEF3FFF050F7F717F717F
+A2717FA2717FA785A61B0F85A2187F73131F72141EB700E06DEB803E72EBE0FC72EBFFF8
+060114F0726C13E0CC0007138050457DC354>82 D<DAFFE0131C010701FE133C013F9038
+FF807C90B6EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F49
+1407007F15035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEB
+FFF015FF6C15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F8014000307
+7FED007F82040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701
+F84A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F048010713
+8031467AC43E>I<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C716
+07A2007E1803007C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA545
+437CC24E>I<B76C010FB512F8A526003FFEC93803E000B3B3A9011F17076280190F6D60
+6F151F6D95C7FC6D6D5D197E6D6D5D6D6D1403DA7FFC4A5A6EB4EC3FF0020F9039F003FF
+E06E90B61280020193C8FC6E6C14FC030F14E09226007FFEC9FC4D457CC356>I<B600FE
+017FB691B512FEA526007FFCC8D83FFEC9EA7C006E82013F701778807415F86D705F6F70
+14016D705FA26F7014036D64814E6D14076D646F70140F6D041E94C7FCA26F023E6D5C6D
+DC3C7F151E81027F037C6D5CF0783F6F70147C023F4B6C1578A26F01016F13F86E4B6C5D
+16806E02036F485A4E7E04C0EEE0036E4A486C5DA2DCE00FEDF0076E4B6C5D16F06E4A6F
+48C8FC051E7F04F8705A6E4A027F131EA2DCFC7CEDFE3E037F0178023F133C04FE16FF03
+3F01F85E4D8004FF17F86F496E5BA36F496E5BA26F604D80A26F90C86C5BA36F486F90C9
+FCA26F48167EA30478163C6F457EC374>87 D<B51280A600FCC7FCB3B3B3B3B0B51280A6
+116475CA1F>91 D<01181418013C143C01FC14FC4848495A4848495A495C4848495A4848
+495A001F141F90C790C7FC003E143EA2003C143C007C147C00781478A200F814F8A2485C
+D8F1F0EBF1F0D8F7FCEBF7FCB46CEBFFFE6D806E1480A36C80A36C806C496C13006C486D
+5A6C486D5AD801F0EB01F0292274C43A>I<B51280A6EA001FB3B3B3B3B0B5FCA611647E
+CA1F>I<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E48
+6C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FF
+FC01000313E0000F1380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83F
+FE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36
+>97 D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF
+000FFE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A217
+7F18F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512
+F0D9F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14
+FC90397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E
+5AED00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB
+1F006C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7C
+AD32>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010FEBFF8F013F14CF9039
+FFF807FF48EBC00148903880007F4890C7123F4848141F49140F121F485AA3127F5BA212
+FFAC127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC6CD9C00314FC6C9038
+F01FEF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467CC43E>I<EC3FF80103
+B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E48486D1380485A
+001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2
+123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE
+01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>I<EDFF80020F13E002
+7F13F049B512F849EB8FFC90390FFE0FFE90381FFC1F14F8133FEB7FF0A2ED0FFCEBFFE0
+ED03F0ED00C01600ABB612F8A5C601E0C7FCB3B0007FEBFFE0A527467DC522>I<DAFFE0
+137E010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF84848EB0FFC
+4848903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D5B000F5D
+6C6C495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F90CAFCA4
+7F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77ED83FC014
+074848020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3F
+F83B07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427DAC38>I<
+EB7FC0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F03FFC9138CF80
+1F9139DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA537457CC43E>I<13
+7C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7FC0EA
+7FFFA512037EB3AFB6FCA518467CC520>I<EB7FC0B5FCA512037EB293387FFFE0A59338
+0FE0004C5A4CC7FC167E5EED03F8ED07E04B5A4B5A037FC8FC15FEECC1FCECC3FE14C7EC
+DFFF91B57E82A202F97F02E17F02C07FEC807F6F7E826F7E816F7F836F7F816F7F83707E
+163FB60003B512F8A535457DC43B>107 D<EB7FC0B5FCA512037EB3B3B3A3B61280A519
+457CC420>I<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B512E00281
+6E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C01
+9E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA557
+2D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC91388F80
+1F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC
+3E>I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F48496C7F4848
+C7EA3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF1780AA007F17
+00A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F
+90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC00FF8B590
+B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D13804A15
+C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E
+4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1FF092C9FC
+ADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC91389F1F
+FE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B612E0A527
+2D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383FC00049133F48
+C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015F06C14FC
+6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F150FA27EA2
+6C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E026E007FE
+C7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF1203000F90
+B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F8090391F
+FC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB50103B5FCA5
+0003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76DB512C701
+0F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B5D8FE1FB539801FFFF0A5000190
+27C0003FE0C7EA7C007114786E17F86C6F6C5C6E1601017F6E6C5CA26E011F1403013F6F
+5C6E013F1407011F6F5CA26E0179140F010F048090C7FC6E01F95C6D02F0EBC01E15806D
+902681E07F5B18E003C3157C6D9139C03FF07815E76DDA801F5B18F803FF14F96E903900
+0FFDE018FF6E486D5BA36E486D5BA26E486D90C8FCA24B7F02075DA26E48147C4B143C4C
+2C7EAB51>119 D<B500FE90383FFFF0A5C601F0903803E0006D6C495A013F4A5A6D6C49
+C7FC6E5B6D6C137E6DEB807C6D6D5A6DEBC1F0EDE3E06DEBF7C06EB45A806E90C8FC5D6E
+7E6E7F6E7FA24A7F4A7F8291381F3FFCEC3E1F027C7F4A6C7E49486C7F01036D7F49487E
+02C08049486C7F49C76C7E013E6E7E017E141FB500E090B512FCA5362C7EAB3B>I<B690
+3803FFFCA5000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303
+010F5D6E13076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8
+F8023F5B15FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D1401
+5D001F1303D83F805B387FC007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB4
+5A6C5B000790CAFCEA01FC36407EAB3B>I<001FB71280A49026FC001F130001E0495A5B
+49495A90C7485A48495B123E4A5B4A5B003C495BA24A90C7FC4A5A4A5AC7FC4A5A495B49
+5BA2495B499038800780491300A2495A4948130F49481400A2485B48495B485BA248495B
+4890C75A48485C15034848EB1FFEB7FCA4292C7DAB32>I E /Ft
+39 122 df<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007C7FC
+B3B3B3B3007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F8010315FF
+010F16C0013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F86E14
+8048486E14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380A219
+FFA283A36C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D13E0
+A294B512C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B1380
+4B90C8FC4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC7F80
+92C9FC02FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A5A5A
+5A5ABAFCA219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F0010FD9
+C01F13FC90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0486D
+826E806E82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A614C91
+C7FC604C5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F817FF
+91C7003F13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A31AC0
+EA03FCEA0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485BD81F
+F85F000F5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90B65A
+011F16F0010716C001014BC8FCD9001F14F0020149C9FC426079DD51>I<F01F804E7E18
+7F18FFA25F5F5F5FA25F5F5FA294B5FC5E5E5EA25E5EEE3FBFEE7F3FA216FEED01FCED03
+F8ED07F0A2ED0FE0ED1FC0ED3F8016005D15FE4A5A4A5AA24A5A4A5A4A5A4A5AA24AC7FC
+14FE495A5C1303495A495A495A5C133F49C8FC13FE485AA2485A485A485A5B121F485A48
+C9FC12FEBCFCA6CA6CEBC000B1037FB8FCA6485E7CDD51>I<01C0EE01C0D801F8160F01
+FF167F02F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17E017
+8004FCC8FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E91B7
+12E001FDD9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC496F13
+C04917E07113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E487E48
+7FA2B57EA319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E6C6C
+17C06D4B1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B55A6D
+B712C0010F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>I<EE1FFF
+0303B512E0031F14F892B612FE0203814AD9FC037F021F9039C0007FC04A90C7EA1FE0DA
+FFFC6E7E494914074949EC7FF8494914FF49495B4949497F4990C7FC495D5C13FF485BA2
+5A4A6E5B5A715B48496E5B725A4894C8FCA35AA35C48913801FFE0030F13FE033F6D7E4B
+14E092B612F89126E1FE037FB53AE3F0007FFEDAE7E06D7EDAEFC06D7F4B6D7F02FFC76C
+7F4A82717F4A82A24A828385A24A1780A54A17C0A37EA77EA47E6E1780A27EA21A007E4D
+5B7E6E5E7E6E5E6C4C5B6D7E013F4B5B6D6C4A5B6D01C0495B6D6D90B5C7FC6DD9FC0713
+FC6D90B65A6D5E023F15C0020F92C8FC020114F8DA001F1380426079DD51>I<EA07E012
+0F7F13FCEBFFFC91B912F8A45AA21AF01AE01AC01A801A00A248606161616101E0C9123F
+01804C5A48CA485A4D90C7FC60007E4C5A17074D5A4D5A4D5A485F4D5A17FF4C90C8FCC9
+485A5F4C5A160F4C5A5F163F4C5A16FF5F5D94C9FC5D5D5E150FA24B5AA2153FA24B5AA2
+15FFA34A5BA25CA35CA44A5BA45CA65CAD6E5BA26E5BDA03FECAFC6E5A456377E051>I<
+F00FE04E7EA24E7EA34E7EA24E7EA34D7FA24D80A24D80A34D80A24D80A34D80A2DD7FBF
+7FA2181F05FF8017FE04016D7FA24D7E04038217F804076D80A24D7E040F8217E0041F6D
+80A24D7F043F825F047F6E7FA294C77E4C825E03016F7FA24C800303845E03076F80A24C
+80030F845E031F6F80A24C81033F845E037F707F93B9FCA292BA7EA24A85A203FCC91207
+0203865D020771805D86020F864B82021F865D87023F864B83027F8692CBFC874A864A84
+0101875C496C728090381FFFC0B700E092B812FEA66F647BE37A>65
+D<4DB5ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC
+137F033F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A
+91C9001FB5FC023F01FC16074A01F08291B54882490280824991CB7E4949844949844949
+8449865D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA448
+99C7FCA25CA3B5FCB07EA380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E
+1A00A26C6E616D1BFE6D7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A
+6E6DEFFF806E01FC4C90C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF91
+3803FFE0033F02F8013F1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8
+C9FC050191CAFC626677E375>67 D<BD12E0A41CF0A2D8000102C0C71207F1003F1A0F1A
+031A001B7F1B3FF31FF81B0FA21B07A21B03A21B011CFCA31B00A419FCA21C7EA41C00A2
+1801A31803A21807180F183FEF01FF93B6FCA6EEC001EF003F180F18071803A21801A318
+00A896C9FCB3A5B912F8A657617AE065>70 D<4DB5ED03C0057F02F014070407B600FE14
+0F047FDBFFC0131F4BB800F0133F030F05FC137F033F9127F8007FFE13FF92B6C73807FF
+814A02F0020113C3020702C09138007FE74A91C9001FB5FC023F01FC16074A01F08291B5
+4882490280824991CB7E49498449498449498449865D49498490B5FC484A84A2484A84A2
+4891CD127FA25A4A1A3F5AA348491A1FA44899C8FCA25CA3B5FCB07E071FB812F880A37E
+A296C70001ECC000A26C7FA37E807EA26C80A26C80A26C807F6D7F816D7F7F6D7F6D6D5F
+6D14C06D6E5E6E7F6E01FC5E020F01FF5E6E02C0ED7FEF020102F8EDFFC76E02FF020713
+83033F02FC013F1301030F91B638FC007F03014D131F6F6C04E01307040704801301DC00
+7F02F8CAFC050191CBFC6D6677E37F>I<B912E0A6C702E0C7FCB3B3B3B3AEB912E0A633
+627CE13C>73 D<B912F8A6D8000102C0CBFCB3B3B1F307E0A5F30FC0A61B1FA31B3F1C80
+A21B7FA21BFFA262A262625013006262624FB5FC1907191F4EB6FCBDFC63A553627AE161
+>76 D<B700C0083FB612F070627097B7FCA37061D800010DF8C7FC70F103EFA202FD6DF1
+07CFA202FC6DF10F8FA36F6DF01F0FA26F6D183EA26F6D187CA26F6D18F8A36F6DEF01F0
+A26F6DEF03E0A26F6DEF07C0A26F6DEF0F80A3706DEE1F00A2706D163EA2706D5EA2706D
+5EA3706D4B5AA2706D4B5AA2706D4B5AA2706D4B5AA3716D4AC7FCA2716D143EA2716D5C
+A2716D5CA3716D495AA2716D495AA2716D495AA2716D495AA3726D48C8FCA272EBC03EA2
+726D5AA2726D5AA372EBF9F0A272EBFFE0A2725CA2725CA37390C9FCA2735AA2735A9038
+1FFFC0B700F86E480207B812F0A3735AA2735A8C627AE199>I<94381FFFE00407B67E04
+3F15F04BB712FE030FEEFFC0033FD9FC0014F092B500C0010F13FC020349C7000113FF4A
+01F86E6C7F021F496F13E04A01C0030F7F4A496F7F91B5C96C7F0103497013FF49497080
+4B834949717F49874949717F49874B8390B586484A717FA24891CB6C7FA2481D804A8448
+1DC0A348497214E0A3481DF0A34A85481DF8A5B51CFCB06C1DF8A36E96B5FCA36C1DF0A4
+6C6D4E14E0A36C1DC06E606C1D80A26C6E4D1400A26C6E4D5BA26C6E4D5BA26D6D4D5B6D
+636D6D4D5B6F94B5FC6D636D6D4C5C6D6D4C91C7FC6D6E4B5B6D02E0031F5B023F6D4B13
+F06E01FC92B55A6E01FF02035C020302C0010F91C8FC020002FC90B512FC033F90B712F0
+030F17C0030394C9FCDB007F15F804071580DC001F01E0CAFC666677E379>79
+D<BA12F8F1FFE01AFEF2FFC01BF01BFED800010280C76C7F070714C0070014F0747F081F
+7F747F747F7480A2748089A37480A389A865A3505CA265A2505C9AC9FC505B505B505B08
+7F5B4FB55A0707148096B548CAFC93B812F81BC050CBFC621AFF932680000314C0DE007F
+7F071F13F8737F737F737F73808885888688A2747FA688A688A676140FF71F80A374801F
+3F86771400745E746E5BB96E6E5B746E485A75EBFE07091F90B55A090715E009015DCF00
+3F91C7FC0A0013FC71647AE178>82 D<001FBEFCA64849C79126E0000F148002E0180091
+C8171F498601F81A0349864986A2491B7FA2491B3F007F1DC090C9181FA4007E1C0FA600
+FE1DE0481C07A5CA95C7FCB3B3B3A3021FBAFCA663617AE070>84
+D<B96C023FB612FEA6D8000102C0CA0007EBF000E2007FC7FCB3B3B3AA656D63A2821C01
+806570170380525A6E7F6E4F5A70171F6E626E6D4D5A6E6D177F525A6E6E030390C8FC03
+3F01E04B5A6F6DED1FFC6F01FCED7FF80303D9FF80903803FFE06F02F8017F5B6F6C90B7
+C9FC041F5E040716F8040016C0050F4ACAFCDD003F13C06F647AE17C>I<B800F8011FB8
+0203B7FCA6D8000F91C9000102E0CAEBFE006D72F20FF07072715A230F6D73627072171F
+6D6A708277173F6D7397C7FC70846B6E72197E707217FE6E726170855118016E68707315
+03636E68704C6E15076E68718451180F6EDE7E7F607172151F6E06FE61714B7E08016F15
+3F6E4E6C95C8FC71840803616F4D6C177E7102076F15FE6F66714B7E080F7013016F4D6C
+5F7185081F18036F4D6C5F71023F7013076F94C75F728450180F6F047E6E5E7272131F1A
+FE6F4C6E5EDEE00171133F6F4C6E93C9FC06F084070361704B6E157E06F87213FE190770
+4B6E5DDEFC0F1881704B6E5D06FE19C1071F18C3704B6E5DDEFF3F18E7706407BFC9FC07
+FF18FF704A705CA3704A705CA27099CAFC4F82A27149705BA37149705BA27149705BA371
+49705BA37190CB5BA27148725AA37148725A714872CBFCA0637DE1A7>87
+D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD97FE001077F
+D9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5AEB1FC090
+C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048B512C04891
+C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F96C6DD903
+F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E011F02FC13
+0F010302F001011400D9001F90CBFC49437CC14E>97 D<92380FFFF04AB67E020F15F002
+3F15FC91B77E01039039FE001FFF4901F8010113804901E0010713C04901804913E0017F
+90C7FC49484A13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE0095C7FC
+485BA4B5FCAE7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F06C18E06C
+6D150F6D6DEC1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03FFC010091
+B512F0023F5D020F1580020102FCC7FCDA000F13C03E437BC148>99
+D<F17FF8050FB5FCA6EF000F8484B3A892380FFF804AB512F8020F14FE023FECFF8391B7
+12E301039138807FF3499039F8000FFB011F01E00103B5FC494913004990C87E49488148
+498148834A815A485BA2485BA25AA3485BA4B5FCAE7EA46C7FA37EA26C7FA26C5F806C5F
+6C6D5D6C6D5D017F93B5FC6D6C6C0103806D6D49806D01F0D91FF7EBFFFE6D9039FE01FF
+E7010190B612876D6CECFE07021F14F8020314E09127003FFE00ECC0004F657BE35A>I<
+92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE037F499039F0007FFF01
+1F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A804884485B727E5A5C4871
+7EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E160FF11F806C
+183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE00103
+01FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092C8FC030713F0
+41437CC14A>I<EE3FFC0307B51280033F14C04AB612F0020715F84A9038F03FFC4AEB80
+7F913A7FFE00FFFE4A5A4B4813FF4913F05B4913E0A24913C0A27013FE4949EB7FFCEF3F
+F8EF1FF0EF07C094C7FCB0B812C0A6D8001F01C0C8FCB3B3B0007FB612FCA638657CE431
+>I<F107F8DB7FFEEC3FFE020FB5D8F001B5FC027FDAFE03148049B7128F49DCDFFD13C0
+010FD9F00FEBFFC149D9800114014990C7EBFC0349486E6C7E4948EC3FFF48496E018113
+800780130048F0C03E97C7FC48496E7FA34884A96C60A36C6D4A5BA26C60A26C6D4A90C8
+FC6D6C4A5A6D6C4A5A6D6D485BDBF00F5B4990B612C060D97C7F4AC9FCD9FC0F14F09126
+007FFECAFC92CCFC1201A47FA27F8014F091B77E18FE6CEFFFC019F06D17FC19FF6D846D
+846D846D84013F8490BAFC0003854801E0C712014890C9000F7F484816014848EE007F48
+48717E8512FF5B85A56D5F007F616D173F003F616D177F6C6C4D5A6C01C003035B6C6D4B
+5B6C01F8031F5BC601FF92B5C7FC6D01F8011F5B011F90B712F8010717E0010094C8FC02
+0F15F0DA003F01FCC9FC4A607CC151>I<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B5
+12F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7FDB87F07FDB8F
+C0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651647B
+E35A>I<EB0FE0EB3FF8497E48B5FCA24880A24880A76C5CA26C91C7FCA238007FFC6D5A
+EB0FE090C9FCAF903807FF80007FB5FCA6C6FC7F7FB3B3AEB712C0A622657BE42C>I<90
+3807FF80B6FCA6C6FC7F7FB3A90503B61280A6DD003FEB8000DE0FFCC7FCF01FF04E5AF0
+FFC04D5B4D90C8FCEF07FC4D5AEF3FF04D5A4D5A4C90C9FC4C5AEE0FFC4C5A4C5AEE7FC0
+4C7E03837F03877F158F039F7F03BF7F92B5FC838403FC804B7E03F0804B6C7F4B6C7F15
+80707F707F707FA270807080717FA2717F717F717FA2717F717F83867180727F95B57EB7
+D8E00FECFFF0A64C647BE355>107 D<903807FF80B6FCA6C6FC7F7FB3B3B3B3ADB712E0
+A623647BE32C>I<902607FF80D91FFFEEFFF8B691B500F00207EBFF80040702FC023F14
+E0041F02FF91B612F84C6F488193267FE07F6D4801037F922781FE001F9027E00FF0007F
+C6DA83F86D9026F01FC06D7F6DD987F06D4A487F6DD98FC0DBF87EC7804C6D027C80039F
+C76E488203BEEEFDF003BC6E4A8003FC04FF834B5FA24B5FA24B94C8FCA44B5EB3B2B7D8
+F007B7D8803FB612FCA67E417BC087>I<902607FF80EB1FFFB691B512F0040714FC041F
+14FF4C8193267FE07F7F922781FE001F7FC6DA83F86D7F6DD987F07F6DD98FC0814C7F03
+9FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651417BC05A>I<92
+3807FFE092B6FC020715E0021F15F8027F15FE494848C66C6C7E010701F0010F13E04901
+C001037F49496D7F4990C87F49486F7E49486F7E48496F13804819C04A814819E048496F
+13F0A24819F8A348496F13FCA34819FEA4B518FFAD6C19FEA46C6D4B13FCA36C19F8A26C
+6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C6D4B13006D6C4B5A6D6D495B6D6D495B
+010701F0010F13E06D01FE017F5B010090B7C7FC023F15FC020715E0020092C8FC030713
+E048437CC151>I<902607FF80EBFFF8B6010FEBFF80047F14F00381B612FC038715FF03
+8F010114C09227BFF0003F7FC6DAFFC0010F7F6D91C76C7F6D496E7F03F86E7F4B6E7F4B
+17804B6F13C0A27313E0A27313F0A21BF885A21BFCA3851BFEAE4F13FCA41BF861A21BF0
+611BE0611BC06F92B512801B006F5C6F4A5B6F4A5B03FF4A5B70495B04E0017F13C09226
+CFFC03B55A03C7B648C7FC03C115F803C015E0041F91C8FC040313E093CBFCB3A3B712F0
+A64F5D7BC05A>I<D90FFFEB0FFCB690383FFF8093B512E04B14F04B14F8923907FC7FFC
+92390FE0FFFEC6EC1F806DD93F0113FF6D133E157E157C15F8A215F07013FEA24BEB7FFC
+EF3FF8EF0FE04B90C7FCA55DB3B0B712F8A638417BC042>114 D<913A3FFF8007800107
+B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0014890C7121FD80FFC1407D81FF08016
+00485A007F167F49153FA212FF171FA27F7F7F6D92C7FC13FF14E014FF6C14F8EDFFC06C
+15FC16FF6C16C06C16F06C826C826C826C82013F1680010F16C01303D9007F15E0020315
+F0EC001F1500041F13F81607007C150100FC81177F6C163FA2171F7EA26D16F0A27F173F
+6D16E06D157F6D16C001FEEDFF806D0203130002C0EB0FFE02FCEB7FFC01DFB65A010F5D
+D8FE0315C026F8007F49C7FC48010F13E035437BC140>I<EC07E0A6140FA5141FA3143F
+A2147FA214FF5BA25B5B5B5B137F48B5FC000F91B512FEB8FCA5D8001F01E0C8FCB3AFEF
+0FC0AC171F6D6D1480A2173F6D16006F5B6D6D137E6D6D5B6DEBFF836EEBFFF86E5C020F
+14C002035C9126003FFCC7FC325C7DDA3F>I<902607FFC0ED3FFEB60207B5FCA6C6EE00
+076D826D82B3B3A260A360A2607F60183E6D6D147E4E7F6D6D4948806D6DD907F0ECFF80
+6D01FFEB3FE06D91B55A6E1500021F5C020314F8DA003F018002F0C7FC51427BC05A>I<
+007FB600C0017FB512F8A6D8001F01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D
+6D4A5A70495A6D4C5A6E7F6E6D495A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13
+FFEF8FF06EEC9FE06FEBFFC06F5C6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B80
+5D4B80DB0FF37FDB1FE17F04C080153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D
+7F020F6E7F4A486D7F4A486D804A5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F0
+49B7FCA650407EBF55>120 D<B700C00103B512FCA6D8003F01C0C8381FFE006FED07F0
+A26D6D5E190F6D6D5E191F6D6D5E193F6D95C7FC6F5D6D177E6F15FEA26D6E495AA26E6D
+5C18036E6D5C18076E5E70130F6E5E70131FA26E6D495AA26E6D91C8FC606E6D137E18FE
+6E5D17816F5C17C3A26FEBE7F0A26FEBF7E017FF6F5CA26F5CA26F91C9FCA36F5BA26F5B
+A2705AA2705AA2705AA35FA25F163F94CAFC5E167E16FED807E05CD81FF81301487E486C
+495AA2B5495AA24B5A5E151F4B5A6C4849CBFC15FEEBFC01393FF807FC391FF03FF06CB5
+5A6C5C6C91CCFCC613FCEB1FE04E5D7DBF55>I E /Fu 85 125 df<9239FFC001FC020F
+9038F80FFF913B3F803E3F03C0913BFC00077E07E0D903F890390FFC0FF0494890383FF8
+1F4948EB7FF0495A494814E049C7FCF00FE04991393FC0038049021F90C7FCAFB912F0A3
+C648C7D81FC0C7FCB3B2486CEC3FF0007FD9FC0FB512E0A33C467EC539>11
+D<4AB4FC020F13E091387F80F8903901FC001C49487FD907E0130F4948137F011FECFF80
+495A49C7FCA25B49EC7F00163E93C7FCACEE3F80B8FCA3C648C7FC167F163FB3B0486CEC
+7FC0007FD9FC1FB5FCA330467EC536>I<913801FFC0020FEBFB8091387F803F903801FC
+00494813FFEB07E0EB1FC0A2495A49C7FC167F49143F5BAFB8FCA3C648C7123FB3B2486C
+EC7FC0007FD9FC1FB5FCA330467EC536>I<DBFF80EB3FE0020F9039F001FFFC913B3F80
+7C0FF01F913CFC000E3F800380D903F86D48486C7E4948D90FFC804948D93FF8130F4948
+017F4A7E49485C49C75BA25B494B6D5A041F6E5A96C8FCACF107F0BBFCA3C648C7391FC0
+001F190F1907B3B0486C4A6C497E007FD9FC0FB50083B512E0A34B467EC551>I<001EEB
+03C0397F800FF000FF131F01C013F8A201E013FCA3007F130F391E6003CC0000EB000CA4
+01E0131C491318A3000114384913300003147090C712604814E0000614C0000E130148EB
+038048EB070048130E0060130C1E1D7DC431>34 D<121EEA7F8012FF13C0A213E0A3127F
+EA1E601200A413E013C0A312011380120313005A1206120E5A5A5A12600B1D78C41B>39
+D<140C141C1438147014E0EB01C01303EB0780EB0F00A2131E5BA25B13F85B12015B1203
+A2485AA3485AA348C7FCA35AA2123EA2127EA4127CA312FCB3A2127CA3127EA4123EA212
+3FA27EA36C7EA36C7EA36C7EA212017F12007F13787FA27F7FA2EB0780EB03C01301EB00
+E014701438141C140C166476CA26>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA2
+1378137C133C133E131E131FA2EB0F80A3EB07C0A3EB03E0A314F0A21301A214F8A41300
+A314FCB3A214F8A31301A414F0A21303A214E0A3EB07C0A3EB0F80A3EB1F00A2131E133E
+133C137C13785BA2485A485AA2485A48C7FC120E5A5A5A5A5A16647BCA26>I<14F0A280
+5CA70078EC01E000FCEC03F0B4140FD87F80EB1FE0D83FC0EB3FC03A0FF060FF003903F8
+61FC3900FC63F090383F6FC0D90FFFC7FCEB03FCEB00F0EB03FCEB0FFF90383F6FC09038
+FC63F03903F861FC390FF060FF3A3FC0F03FC0D87F80EB1FE0D8FF00EB0FF000FC140300
+78EC01E0C790C7FCA7805CA2242B7ACA31>I<16C04B7EB3AB007FBAFCBB1280A26C1900
+C8D801E0C9FCB3AB6F5A41407BB84C>I<121EEA7F8012FF13C0A213E0A3127FEA1E6012
+00A413E013C0A312011380120313005A1206120E5A5A5A12600B1D78891B>I<B612C0A6
+1A067F9721>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A78891B>I<1618163C167C
+A2167816F8A216F01501A216E01503A216C01507A21680150FA2ED1F00A2151E153EA215
+3C157CA2157815F8A25D1401A24A5AA25D1407A25D140FA292C7FC5CA2141E143EA2143C
+147CA25CA25C1301A25C1303A25C1307A25C130FA291C8FC5BA2133EA2133C137CA21378
+13F8A25B1201A25B1203A2485AA25B120FA290C9FC5AA2121E123EA2123C127CA2127812
+F8A25A126026647BCA31>I<14FF010713E090381F81F890383E007C01FC133F4848EB1F
+8049130F4848EB07C04848EB03E0A2000F15F0491301001F15F8A2003F15FCA390C8FC48
+15FEA54815FFB3A46C15FEA56D1301003F15FCA3001F15F8A26C6CEB03F0A36C6CEB07E0
+000315C06D130F6C6CEB1F806C6CEB3F00013E137C90381F81F8903807FFE0010090C7FC
+28447CC131>I<143014F013011303131F13FFB5FC13E713071200B3B3B0497E497E007F
+B6FCA3204278C131>I<EB03FE90381FFFC0017F13F03901F80FFC3903C001FE48486C7E
+000EC7EA7F8048EC3FC0ED1FE04815F00030140F007015F800601407126CB415FC7F7F15
+03A46C4813076CC7FCC8FC16F8A2150F16F0151F16E0A2ED3FC0ED7F8016005D5D4A5A4A
+5A4A5A5D4A5A4A5A4AC7FC147C5C5C495A495A495A49C7120C131E5B013814185B5B485A
+4848143848C81230000E1570001FB612F0A25A5AB712E0A326427BC131>I<49B4FC010F
+13E0013F13FC9038FE01FE3A01F0007F80D803C0EB3FC048C7EA1FE0120EED0FF0EA0FE0
+486C14F8A215077F5BA26C48130FEA03C0C813F0A3ED1FE0A2ED3FC01680ED7F0015FE4A
+5AEC03F0EC1FC0D90FFFC7FC15F090380001FCEC007FED3F80ED1FC0ED0FE016F0ED07F8
+16FC150316FEA2150116FFA3121EEA7F80487EA416FE491303A2007EC713FC0070140700
+3015F80038140F6C15F06CEC1FE06C6CEB3FC0D803E0EB7F803A01FE01FE0039007FFFF8
+010F13E0010190C7FC28447CC131>I<ED0380A21507150FA2151F153FA2157F15FFA25C
+EC03BF153F14071406140C141C141814301470146014C013011480EB03005B13065B131C
+13185B1370136013E0485A5B120390C7FC1206120E120C5A123812305A12E0B812C0A3C8
+383F8000ADEDFFE0027FEBFFC0A32A437DC231>I<000615C0D807C0130701FCEB7F8090
+B612005D5D5D15E0158026063FFCC7FC90C9FCAE14FF010713C090381F01F090383800FC
+01F0137ED807C07F49EB1F8016C090C7120F000615E0C8EA07F0A316F81503A216FCA512
+3E127F487EA416F890C712075A006015F0A20070140F003015E00038EC1FC07E001EEC3F
+806CEC7F006C6C13FE6C6C485A3901F807F039007FFFE0011F90C7FCEB07F826447BC131
+>I<EC07FCEC3FFF91B512C0903903FC03E0903907E000F0D91FC0133849C71258017EEB
+01FC01FE1303491307485A485AA24848EB03F8000FEC01F092C7FC485AA3485AA3127FA2
+9038007F80903801FFF090380780FC39FF0E003E49EB1F8049EB0FC049EB07E0136001E0
+EB03F04914F8150116FC5BED00FEA390C812FFA47EA57F123FA216FE121F15016D14FC12
+0FED03F86C7EED07F06C6C14E06C6CEB0FC06C6CEB1F80017EEB3F0090383F80FE90380F
+FFF8010313E00100138028447CC131>I<121CA2EA1F8090B712C0A3481680A217005E00
+38C8120C0030151C00705D0060153016705E5E4814014B5A4BC7FCC81206150E5D151815
+385D156015E04A5AA24A5A140792C8FC5CA25C141E143EA2147E147CA214FCA21301A349
+5AA41307A6130FAA6D5AEB01C02A457BC231>I<14FF010713E0011F13F890387F00FE01
+FC133FD801F0EB1F804848EB0FC049EB07E00007EC03F048481301A290C713F8481400A4
+7FA26D130116F07F6C6CEB03E013FC6C6CEB07C09039FF800F806C9038C01F006CEBF03E
+ECF87839007FFEF090383FFFC07F01077F6D13F8497F90381E7FFFD97C1F1380496C13C0
+2601E00313E048486C13F000079038007FF84848EB3FFC48C7120F003EEC07FE15014814
+0016FF167F48153FA2161FA56C151E007C153EA2007E153C003E157C6C15F86DEB01F06C
+6CEB03E06C6CEB07C0D803F8EB1F80C6B4EBFF0090383FFFFC010F13F00101138028447C
+C131>I<14FF010713E0011F13F890387F80FC9038FC007E48487F4848EB1F804848EB0F
+C0000FEC07E0485AED03F0485A16F8007F140190C713FCA25AA216FE1500A516FFA46C5C
+A36C7E5D121F7F000F5C6C6C1306150E6C6C5B6C6C5BD8007C5B90383F01E090390FFF80
+FE903801FE0090C8FC150116FCA4ED03F8A216F0D80F801307486C14E0486C130F16C0ED
+1F80A249EB3F0049137E001EC75A001C495A000F495A3907E01FE06CB51280C649C7FCEB
+1FF028447CC131>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3A5121EEA7F80A2
+EAFFC0A4EA7F80A2EA1E000A2B78AA1B>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7
+FCB3A5121E127FEAFF80A213C0A4127F121E1200A512011380A3120313005A1206120E12
+0C121C5A5A12600A3E78AA1B>I<007FBAFCBB1280A3CEFCB0BB1280A36C190041187BA4
+4C>61 D<ED1FFC4AB512C0913907E003F0021EC7123C0278140FD901E0EC03C0D90380EC
+00E0010FC91278011C161C4982498249707E4916010001844848D90FF06D7E90C7D83FFC
+146048DAFC0F1470000E902703F003C07F000C902707C000E01318001CD91F800170131C
+0018013F6E130C003891C76C130E0030017E91380FF00614FE00704902071307D8600183
+A2495AA200E019804848481601AB6C6C7E1260A26D7E1903D87000180000306D140F147E
+00386D141F00186E013F5B001C011F02771306000CD907C09038E3F80E000E902703F003
+C35B6C903B00FC0F00FC386CDA3FFCEB7FF06DD90FF0EB0FC06C6C90CBFC12007F13707F
+7F010FEF1F80D90380167FD901E0923803FE00D90078ED1FF0021E913801FF80DA07E0D9
+7FF8C7FC0201B6C8FCDA001F13C041477BC54C>64 D<16C04B7EA34B7EA34B7EA34B7EA3
+ED19FEA3ED30FFA203707FED607FA203E07FEDC03FA2020180ED801FA2DA03007F160FA2
+0206801607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202E08191B7FCA2498202
+80C7121FA249C87F170FA20106821707A2496F7EA3496F7EA3496F7EA201788313F8486C
+83D80FFF03037FB500E0027FEBFFC0A342477DC649>I<B8FC17E017FC00019039C00003
+FF6C6C4801007FEF3FC0717E717E717E84170384170184A760A21703601707604D5A4D5A
+EF7FC04DC7FCEE03FEEE3FF091B65A17FC0280C7B47EEF1FC0EF0FF0717E717E717E717E
+1980187F19C0A2183F19E0A8F07FC0A2198018FF4D1300A24D5AEF0FFC4D5AEF7FE04848
+6C903803FFC0B9C7FC17FC17C03B447CC345>I<DB0FFE146092B500C013E0020314F091
+3A0FFC01FC0191393FC0003E02FFC7EA0F83D903FCEC03C74948EC01E74948EC00FF4948
+157F4948153F4948151F49C9120F485A491607120348481603A248481601A248481600A2
+123FA2491760127FA31900485AAE6C7EA21960A2123F7FA2001F18E07F000F18C0A26C6C
+160119806C6C160312016DEE07006C6C16066D6C150E6D6C5D6D6C5D6D6C15786D6C5D6D
+6C4A5AD900FFEC0780DA3FC0011FC7FCDA0FFC13FC0203B512F0020014C0DB0FFEC8FC3B
+487BC546>I<B8FC17F017FC00019039C00007FF6C499038007FC0017FED1FE0EF07F0EF
+03FC717E717E84727E727E727EA2727E85180385A2180185A38584A31A80AD1A00A36061
+A361180361180761180F614E5A183F614EC7FC18FEEF03FC4D5AEF1FE001FFED7FC0486D
+D907FFC8FCB812FC17F094C9FC41447CC34B>I<B912F8A3000101C0C7127F6C6C48EC07
+FC17011700187C183C181CA284A31806A4180704067FA395C7FCA4160EA2161E163E16FE
+91B5FCA3EC8000163E161E160EA21606A319C0A3F0018093C7FCA41803A21900A260A260
+A2181EA2183E187EEF01FE170748486C147FB95AA33A447CC342>I<B912F0A3000101C0
+C7127F6C6C48EC0FF817031701170018781838A2181CA3180CA4180E1806160CA21800A5
+161CA2163C167CED01FC91B5FCA3EC8001ED007C163C161CA2160CA793C8FCB08048487E
+B612F8A337447CC340>I<DB0FFE146092B500C013E0020314F0913A0FFC01FC0191393F
+C0003E02FFC7EA0F83D903FCEC03C74948EC01E74948EC00FF4948157F4948153F494815
+1F49C9120F485A491607120348481603A248481601A248481600A2123FA2491760127FA3
+96C7FC485AAD4CB612C06C7EA293C7387FF000725A003F171F7FA2121F7F120FA26C7EA2
+6C7E6C7EA26C7E6D7E6D6C153F6D7E6D6C157F6D6C15E7D903FEEC01C7D900FFEC0383DA
+3FE0EB0F01DA0FFCEBFE000203B500F81360020002E090C7FCDB0FFEC9FC42487BC54D>
+I<B6D8C003B6FCA3000101E0C70007138026007F80913801FE00B3A991B7FCA30280C712
+01B3AC2601FFE0913807FF80B6D8C003B6FCA340447CC349>I<B612F0A3C6EBF0006D5A
+6D5AB3B3B3A4497E497EB612F0A31C447DC323>I<010FB512FEA3D9000313806E130080
+B3B3AB123F487E487EA44A5A13801300006C495A00705C6C13076C5C6C495A6CEB1F8026
+03E07FC7FC3800FFFCEB1FE027467BC332>I<B600C049B512C0A3000101E0C8387FFC00
+6C49ED3FE06D481680063EC7FC183C183860604D5A4D5A4DC8FC171E17385F5F4C5A4C5A
+4CC9FC160E5E5E5E5E4B5A4B7E4B7E150F4B7E4B7E1577EDE3FE913881C1FFEC8381DA87
+007F028E6D7E149C02B86D7E02F06D7E14C04A6D7E707EA2707E707EA2707F717EA2717E
+717EA2717E717EA2717E717EA2717F8585496C82486D4A13FCB600C0011FEBFFE0A34344
+7CC34C>I<B612F8A3000101E0C9FC6C6C5A5CB3B31830A418701860A518E0A3EF01C0A2
+17031707A2170F173F177FEE01FF48486C011F1380B9FCA334447CC33D>I<B56C933807
+FFFC6E5EA20001F1FE0026006FE0EE1BF8A3D967F01633A2D963F81663A3D961FC16C3A3
+D960FEED0183A2027FED0303A36E6C1406A36E6C140CA26E6C1418A36E6C1430A36E6C14
+60A26E6C14C0A36E6CEB0180A3037FEB0300A292383F8006A36F6C5AA36F6C5AA26F6C5A
+A36F6C5AA36F6C5AA26FB45AA370C7FC13F0A2486C143ED80FFFEF0FFEB500F0011C0107
+B512FCA34E447BC359>I<B56C020FB5FC8080C6040013F06D6CED1F80D96FF8ED0F00A2
+D967FC1506EB63FEA2EB61FF01607FA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E7E6E7FA2
+6F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE0FF8A2EE
+07FCEE03FEA2EE01FF701386A2EF7FC6EF3FE6A2EF1FF6EF0FFEA217071703A217011700
+A201F0167E183E487ED80FFF161EB500F0150EA2180640447CC349>I<ED1FFC4AB512C0
+913907F007F091391F8000FC027EC7123FD901F8EC0FC049486E7E49486E7E49486E7E49
+486E7E49C9127E017E8201FE834848707E4848707EA24848707EA2000F84491603001F84
+A24848707EA3007F84A24982A300FF1980AD6C6C4C1300A4003F606D1603A2001F60A26C
+6C4C5AA26C6C4C5AA20003606D161F6C6C4C5A000060017F4CC7FC6E5D013F5E6D6C4A5A
+D907E0EC03F06D6C4A5AD901FCEC1FC0D9007E4AC8FCDA1F8013FC913907F007F00201B5
+12C09126001FFCC9FC41487BC54C>I<B712FCEEFFC017F800019039C0000FFC6C6C48EB
+01FF9338007F80EF1FE0170FEF07F018F8EF03FCA218FE1701A218FFA718FEA2170318FC
+A2EF07F818F0EF0FE0EF1FC0EF7F80933801FE00EE0FFC91B612F017800280C9FCB3AA38
+01FFE0B612C0A338447CC342>I<ED1FFC4AB512C0913907F007F091391F8000FC027EC7
+123F4948EC1FC0D903F0EC07E049486E7E49486E7E49486E7E49C9127E49167F01FE707E
+4848707E00038449160F000784491607000F84A24848707EA2003F84491601A2007F84A3
+4982A200FF1980AD007F19006D5EA3003F60A26D1603001F60A2000F606D16070007606D
+D903F0130F0003DA0FFC5C6DD91C0E131F00014A6C5C6C6C903A3003803F80017FD97001
+49C7FC92386000C0D93F8015FED91FC0ECE1FCD907E0EC63F0D903F0EC77E0902601FC70
+EB7FC09026007E3091C8FCDA1FB813FC912707FC07F814C00201B57E9139001FFC3C92C7
+FC053E1301171E051F13031A80F08007F0C00F94380FF03F95B51200A28361715BA2715B
+9438007FE0F01F8042597BC54C>I<B712E016FF17C000019039C0003FF86C6C48EB03FC
+EE00FF717E717E717E717E717EA284170384A760A21707604D5AA24D5A4D5A4DC8FCEE01
+FEEE07F8EE3FE091B6C9FC16FC913980007F80EE0FE0707EEE03FC707E160083717EA271
+7EA784A71A6084171FA21AE0716C13C02601FFE002071301B600C01680943801FC039439
+00FE0700CBEA3FFEF007F843467CC348>I<49B41303010FEBE007013F13F89039FE00FE
+0FD801F8131FD807E0EB079F49EB03DF48486DB4FC48C8FC4881003E81127E82127C00FC
+81A282A37E82A27EA26C6C91C7FC7F7FEA3FF813FE381FFFE06C13FE6CEBFFE06C14FC6C
+14FF6C15C0013F14F0010F80010180D9001F7F14019138001FFF03031380816F13C0167F
+163F161F17E000C0150FA31607A37EA36C16C0160F7E17806C151F6C16006C5D6D147ED8
+FBC05CD8F9F0495AD8F07C495A90393FC00FE0D8E00FB51280010149C7FC39C0003FF02B
+487BC536>I<003FB912F8A3903BF0001FF8001F01806D481303003EC7150048187C0078
+183CA20070181CA30060180CA5481806A5C81600B3B3A54B7EED7FFE49B77EA33F447DC3
+46>I<B600C0010FB5FCA3000101E0C813F026007F80ED1F80F00F00A21806B3B3A7180E
+6D6C150CA2181C131F6E1518010F163818306D6C1570606D6C14016D6C5D6D6CEC078002
+7F4AC7FC6E6C131EDA1FE0137C913907FC03F00201B55A6E6C1380DB07FCC8FC40467CC3
+49>I<B692383FFFF0A3000301E003071300C649ED01FC4A5E017F705A6E5E133F616E15
+01011F5FA26D6C4BC7FCA28001071606A26E150E0103160CA26D6C5DA2806D5EA26F1470
+027F156081023F5DA281021F4A5AA26F1303020F92C8FC8102071406A26F130E0203140C
+A26E6C5BA2816E5CA2EE8070037F1360A26F6C5AA216E092381FE180A216F3030F90C9FC
+16FBED07FEA36F5AA36F5AA26F5AA3166044467EC349>I<B60107B500F890380FFFFEA3
+000301E0D9001F90C813F06C0180DA0FFCED3FC091C86C48ED1F006C871C0E6D6C6E7E1C
+0CA26D6C6F5DA36EDA06FF1538011F1A30A26E020E6D1470010FDB0C7F1560A26E021C7F
+0107DB183F5DA2856D6CDA301F4A5AA36D6C4A6C6C49C7FCA36D6C4A6C6C1306A3DB8001
+6E130E027FDA8003140CA2DBC00380023FDA00015CA203E081021F01066D5CA36E6C486E
+6C5AA36E6C486E6C5AA36F48EC1FE1020360A2DBFE7015F302010160020F90C8FCA2DBFF
+E015FB6E49EC07FEA36F486E5AA36FC86C5AA3031E6F5AA4030C16605F467EC364>I<B6
+6C91380FFFFCA3000101F8C8000313C026007FE0923800FE0061013F17F06D6C5E80010F
+5F6D6C4B5A18036D6C93C7FC6E15066D160E6D6D140C181C6E6C14186E6C5C18706E6C14
+6018E06E6C5C6E6C495A17036E6C91C8FC5F6E6C13066E6D5A171C92387FC0185FED3FE0
+6F6C5A17E06F6C5AEEF980ED07FF6F90C9FCA26F5AB3A6923807FF800203B6FCA346447F
+C349>89 D<001FB81280A39126800001130001FCC7FC01F04A5A01C04A5A5B90C8485A12
+1E4C5A484B5AA200384B5A4C5AA24B90C7FC00304A5AA24B5AA24B5AC8485AA24B5A4B5A
+A24B5A5C93C8FC4A5AA24A5A4A5AA24A5A4A5AA24A5A14FF5D4990C9FCEF0180495A495A
+A2495A494814031800495AA2495A495A5F4890C8FC485A5F485A48485D5F48485D17FE48
+4814034848140F16FFB8FCA331447BC33C>I<EAFFFCA4EAF000B3B3B3B3B3A2EAFFFCA4
+0E6476CA1B>I<01C01318000114384848137048C712E0000EEB01C0000C1480001C1303
+0018140000385B003013060070130E0060130CA300E0131C481318A400CFEB19E039FFC0
+1FF801E013FCA3007F130FA2003F130701C013F8390F0001E01E1D71C431>I<EAFFFCA4
+EA003CB3B3B3B3B3A2EAFFFCA40E647ECA1B>I<130C131E133F497EEBF3C03801E1E038
+03C0F03807807848487E001E7F487F0070EB038048EB01C00040EB00801A0E75C331>I<
+EB07FC90383FFF809038F80FE03903C003F048C66C7E000E6D7ED80FC0137E486C137F6D
+6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49B5FC90380FFE1FEB3FC0EBFF00EA03FC485A
+485A485A485A127F5B176048C7FCA3153FA36D137F007F14EF6D9038C7E0C0003F13013A
+1FE00783F13B07F81E03FF802701FFFC0113003A001FE0007C2B2E7CAC31>97
+D<EA01FC12FFA3120712031201B3EC03FC91380FFF8091383C07E091387001F89039FDE0
+007E02807F01FFEC1F8091C713C049EC0FE049140717F0A2EE03F8A217FCA2160117FEAB
+17FC1603A217F8A2EE07F0A26DEC0FE017C06D141F01FBEC3F80D9F380EB7E00D9E1C05B
+9039E0F001F89039C03C07E09039801FFF80C7D803FCC7FC2F467DC436>I<EC7F809038
+03FFF090380FC07C90383F000F01FCEB03804848EB01C00003140F4848EB1FE049133F12
+0F485AA2485AED1FC0007FEC070092C7FCA290C9FC5AAB7E7FA2123F16307F001F15706C
+6C146016E06C6C14C06C6C13010001EC03806C6CEB0700013F131E90381FC078903807FF
+F001001380242E7DAC2B>I<167FED3FFFA315018182B3EC7F80903803FFF090380FC07C
+90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA2127FA290C8FC5A
+AB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C010E13C0013F01
+1C13FE90380FC0F8903803FFE09026007F0013002F467DC436>I<EB01FE903807FFC090
+381F03F090387E00FC49137E48487F485A4848EB1F80000F15C049130F121F484814E015
+07A2007F15F090C7FCA25AA390B6FCA290C9FCA67EA27FA2123F16306C7E1670000F1560
+6D14E06C6C14C0000314016C6CEB03806C6CEB0700013E131E90381F80F8903803FFE001
+0090C7FC242E7DAC2B>I<EC0FE0EC7FF8903801F81E903803F03F90390FE07F8090381F
+C0FF5C133F495AA2ED7F0001FE131C92C7FCAFB67EA3C648C8FCB3B2486C7E007F13FFA3
+21467EC51E>I<EE0F80D901FCEB7FE0903A0FFF81F0F090393F07E3819039FC01FF033A
+01F800FE014848017E13E00007027FC7FC497F000F8149131F001F81A9000F5D6D133F00
+0792C7FC6D5B0003147E6C6C5B6D485A3903BF07E090380FFF80260701FCC8FC90CAFCA2
+5AA37F6C7E7F90B512F86C14FF16E06C15F86C6C8048B67E3A07C0000FFF48481300003F
+C8EA3F80003E151F48ED0FC0A2481507A56C150F007C1680007E151F003E16006C153E6C
+6C5CD807E0495AD801F8EB07E0D8007FEB3F8090261FFFFEC7FC010113E02C427DAC31>
+I<EA01FC12FFA3120712031201B3EC01FE913807FFC091381E07F091383801F802707FEC
+E000D9FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FEA32F457DC4
+36>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCADEA01FC12FFA3120712031201B3B0
+487EB512F8A315437DC21C>I<143C14FFA2491380A46D1300A2143C91C7FCADEC7F80EB
+3FFFA31300147F143FB3B3AA123E127F39FF807F00A2147EA25C6C485A383C01F06C485A
+3807FF80D801FEC7FC195785C21E>I<EA01FC12FFA3120712031201B3A292381FFFE0A3
+6F1300ED07F816E05E5E030EC7FC5D5D5D5D4A5A4A5A4AC8FC5CEC3F804A7E14FF9038FD
+CFE09038FF8FF01407496C7E01FC7F14016E7E81816F7E82151F6F7E821507826F7E8282
+486C491380B5D8F81F13F8A32D457DC433>I<EA01FC12FFA3120712031201B3B3B3A548
+7EB512F8A315457DC41C>I<D801FC01FFEC1FE000FF010701E0EBFFFC913B0F03F801E0
+7F913C3C01FC07803F800007903C7000FE0E001FC0000349D97E1C130F2601FDC0D97F38
+804A143001FFDA3FF06D7E91C75BA2495DA3495DB3A8486C4A6C497EB5D8F81FB50003B5
+12E0A34B2C7DAB52>I<3901FC01FE00FF903807FFC091381E07F091383801F800070170
+7F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FE
+A32F2C7DAB36>I<EC7F80903803FFF090380FC0FC90383E001F496D7E496D7E48486D7E
+48486D7E48486D7E000F81A24848147E003F157FA290C87E481680A44816C0AA6C1680A2
+6D147F003F1600A2001F157E6D14FE000F5D6D130100075D6C6C495A6C6C495A6C6C495A
+013E49C7FC90381FC0FE903807FFF89038007F802A2E7DAC31>I<3901FC03FC00FF9038
+0FFF8091383C07E091387001F83A07FDE000FE00010180137F01FFEC3F8091C7EA1FC049
+15E049140F17F0160717F8160317FCA3EE01FEABEE03FCA3EE07F8A217F0160F6D15E0EE
+1FC06D143F17806EEB7E00D9FDC05B9039FCF003F891383C0FE091381FFF80DA03FCC7FC
+91C9FCAE487EB512F8A32F3F7DAB36>I<91387F8003903903FFE00790380FE07890393F
+801C0F90387E000E496D5AD803F8EB039F0007EC01BF4914FF48487F121F5B003F81A248
+5AA348C8FCAB6C7EA3123F7F121F6D5C120F6D5B12076C6C5B6C6C497E6C6C130E013F13
+1C90380FC0F8903803FFE09038007F0091C7FCAEEEFF80033F13FEA32F3F7DAB33>I<39
+03F803F000FFEB1FFCEC3C3EEC707F0007EBE0FF3803F9C000015B13FBEC007E153C01FF
+13005BA45BB3A748B4FCB512FEA3202C7DAB26>I<90383FE0183901FFFC383907E01F78
+390F0003F8001E1301481300007C1478127800F81438A21518A27EA27E6C6C13006C7E13
+FC383FFFE06C13FC6C13FF6C14C06C14E0C614F0011F13F81300EC0FFC140300C0EB01FE
+1400157E7E153EA27EA36C143C6C147C15786C14F86CEB01F039F38003E039F1F00F8039
+E07FFE0038C00FF01F2E7DAC26>I<1306A5130EA4131EA3133E137EA213FE1201120700
+1FB512F0B6FCA2C648C7FCB3A4150CAA017E131C017F1318A26D133890381F8030ECC070
+903807E0E0903801FFC09038007F001E3E7EBC26>I<D801FC147F00FFEC3FFFA3000714
+01000380000181B3A85EA35DA212006D5B017E9038077F80017F010E13C06D011C13FE90
+380FC078903803FFF09026007F8013002F2D7DAB36>I<B539F001FFFCA3000790C7EA7F
+E06C48EC1F8000011600160E1200160C017F5CA280013F5CA26E1370011F146080010F5C
+A2ECF00101075CA26D6C48C7FCA26E5A01011306A26D6C5AA214FF6E5AA215B8EC3FB015
+F06E5AA36E5AA26E5AA36EC8FC2E2C7EAA33>I<B500E0B539E03FFF80A30007903C000F
+FE000FFC00D803FCD903F8EB03F8F001E0120103015D6D80000060A26D6E13036DD9037E
+91C7FCA20280017F5B013FD9063F1306A2D91FC06E5AED0C1FA2D90FE06E5AED180FA2D9
+07F06E5AED3007A2D903F86E5AED6003A2902601FCE06D5AEDC00117FCD900FFECFD80ED
+800017FF027F92C8FC92C77EA26E147E023E143EA2021E143C021C141CA2412C7EAA46>
+I<B539F007FFFCA30003D9C00113C0C6496C1300017F14FC013F5C6E13E06D7E010F495A
+6D6C485A02F890C7FC903803FC060101130E6E5A903800FF186E5AEC3FF05D141F140F6E
+7E81140FEC0DFCEC19FEEC38FF4A7E9138603F8002C07F0101131F49486C7E02007F0106
+6D7E010E1303496D7E013C80017C80D801FC1580D80FFE4913C0B5D8800F13FFA3302B7F
+AA33>I<B539F001FFFCA3000790C7EA7FE06C48EC1F8000011600160E0000150C6D141C
+6D1418A26E1338013F1430A26D6C5BA26E13E0010F5CA26D6C485AA2ECF803010391C7FC
+A2903801FC06A2ECFE0E0100130CA2EC7F18A215B8EC3FB0A2EC1FE0A36E5AA26E5AA36E
+C8FCA21406A35CA25CA2123C007E5BB4FC5CA25CEAFE01387C0380D87007C9FCEA3C1EEA
+0FFCEA03F02E3F7EAA33>I<003FB612E0A29038C0003F90C713C0003CEC7F800038ECFF
+00A20030495A0070495AA24A5A0060495AA24A5A4A5AA2C7485A4AC7FC5B5C495A13075C
+495A131F4A1360495A495AA249C712C0485AA2485A485A1501485A48481303A24848EB07
+804848131F00FF14FF90B6FCA2232B7DAA2B>I<B9FCA23002809B31>I<BF1280A2610280
+9B62>I E /Fv 24 122 df<15E01401EC03C0EC0780EC0F00141E5C147C5C495A13035C
+495A130F5C131F91C7FC133E137EA25BA2485AA25B1203A2485AA3120F5BA2121FA25BA2
+123FA290C8FCA35AA5127EA312FEB3A3127EA3127FA57EA37FA2121FA27FA2120FA27F12
+07A36C7EA212017FA26C7EA2137EA2133E7F80130F8013076D7E8013016D7E147C143C80
+80EC0780EC03C0EC01E014001B7974D92E>40 D<12E07E12787E7E7E6C7E7F6C7E6C7E7F
+1200137C137E133E133F7F6D7E80A26D7EA26D7EA2130180A26D7EA380147EA2147FA280
+A21580A2141FA315C0A5140FA315E0B3A315C0A3141FA51580A3143FA21500A25CA2147E
+A214FE5CA3495AA25C1303A2495AA2495AA25C49C7FC5B133E137E137C5B12015B485A48
+5A5B48C8FC121E5A5A5A5A1B797AD92E>I<120FEA3FC0EA7FE012FF13F0A213F8A3127F
+123FEA0F381200A513781370A313F013E0A2120113C0120313801207EA0F00121EA25A5A
+12300D23768B21>44 D<120FEA3FC0EA7FE0EAFFF0A6EA7FE0EA3FC0EA0F000C0C768B21
+>46 D<14075C5C147F5C1307133F000FB5FCB6FC13F913C1EAF0011200B3B3B3A7497F01
+0F13E0B712FEA4274F75CE3B>49 D<EC3FF849B57E010F14E090391FC01FF890397E0003
+FC01F86DB4FCD801E06D13804848EC7FC0484815E048C8123F01C015F013F0486CEC1FF8
+7FA56C5AA2EA03E0C9EA3FF0A317E0167F17C016FF17804B13005E4B5A4B5A4B5AED3FC0
+DA07FFC7FC903803FFFC5DEDFF8090C7EA1FE0ED07F8ED01FE6F7EEE7F8017C0EE3FE0EE
+1FF017F8A2EE0FFC17FEA2160717FFA3120FEA3FC0487E487EA417FE160F5B6C4815FC90
+C8FC0078ED1FF87E003EED3FF06CED7FE06C7E6C6CECFFC0D803F0491380D801FC903807
+FE003A00FFC01FFC013FB512F0010F14C0010391C7FC9038003FF830517BCE3B>51
+D<EC1FF891B5FC010314C090390FF00FE090391FC003F890397F8001FC01FEC77E000115
+7F4848EC3F805B0007ED1FC0484815E0001F150F4915F0123F1607007F16F85BA217FC12
+FFA2160317FEA617FFA35E127FA37F003F5DA2121F6D5C000F151B0007153B7F6C6C1473
+000115E36C6C1301017FEB03C3903A3FC00F83FE010FB51203010313FC010013F091C7FC
+160717FCA317F8A2160F17F0A2161FD803C015E0EA0FF0486CEC3FC01780167F170016FE
+150149495AD80FC0495A90C7485A6C6C495A01E0495A2703FC01FFC7FC6CB55A6C6C13F8
+011F13E0010390C8FC30517BCE3B>57 D<EE7FF80307B57E033F14F09239FF8007FCDA03
+F8C7127FDA0FC0EC0FC0023FC8EA03F0027CED00F84A167CD903E0161F4948707E494870
+7E49CA6C7E013E717E013C170049187849DA1FE0804848DAFFFC80030713FF484890270F
+F01F807F484890273FC007C0EB078092397F0001F048C700FE6D6CEB03C04A481478000E
+01036F1301001E49486E14E0001C4A91380FF800003C010F7013F00038494802071470A2
+0078494802031478A200701A384A5AA200F01A3C481A1C4AC8FCAB6E7E7E1270A26E7E12
+781B3800386D6C1407A2003C6D6C140F001C1307001E6E021F1470000E6D6C143F000F01
+01157B6E6CDAF9FE13E06C6C017FD901F1130192273FC007C0EB03C06C6C903C0FF01F80
+7F07806C6C6DB539003FFF00030001FCEB0FFE6C6CDA1FE0EB03F8017891CBFC7F133E7F
+6D7E6D7E6D6CEF01FCD900F81707027CEF3FF0023F933801FF80DA0FC092381FFE00DA03
+F8913801FFF0912600FF8090B5C7FC033FB612F8030792C8FCDB007F13804E557AD35B>
+64 D<49B612FEA490C7003F138092380FFE001507B3B3B3A21206EA3FC0487E487EA44B
+5AA25B007F5D0180131F0078C75B6C143F003E4A5A6C5D6C6C495A2707E003FEC7FC3901
+FC07FC6CB512F0013F13C0D907FCC8FC2F547BD13C>74 D<B712E0A4C66C90CAFCEB3FFC
+6D5AB3B3A9191CA51938A61978A319F819F0A218011803A21807180F181F183F18FF013F
+1503496C023F13E0BAFCA43E527BD149>76 D<ECFFC0010F13F8013F13FE9039FF00FF80
+D801F0EB3FE0D803C0EB0FF0486C6D7E01F86D7E000F816D13016F7EA3707E6C5AEA01E0
+C9FCA6ED3FFF020FB5FC9138FFFC7F01071300EB1FF0EB7FC04848C7FCEA03FC485A485A
+485A123F5B485A187012FF90C8FCA216FFA35D6D14BF007F14036DEB073F6C6C90390F1F
+C0E06C6C131E6C6C90393C0FE1C02707FE01F013FF0001B5486C13806C6C90398003FE00
+D907FCC712F834367BB43B>97 D<EB7F80B5FCA41203C6FC137FB3A6ED07FC92387FFF80
+0281B512E0913987F00FF891398F8001FC029EC7B4FC02BC6E7E02F86E7E4A6E7E4A6E7E
+4A1407844A6E7EA2841701A284A283A21980AB19005FA360A24D5AA24D5A804D5A6E5D6E
+4A5AD97E784A5A6E4AC7FCD97C1EEB01FE6E495A903A7807E01FF00201B512C090267000
+7F90C8FC90C7EA0FF839547DD241>I<EC0FFE91387FFFE049B512F8903907F801FE9039
+1FE0001FD93F80EB078049C7EA0FC001FE143F484815E00003157F485A485AA2485AEE3F
+C0003FED0F004991C7FCA2127FA35B12FFAB127F7FA3123F6D1570121F6D15F0000F16E0
+6D140112076C6CEC03C06D15806C6C14076C6DEB0F00D93FC0131E6D6C137C903907FC03
+F06DB55AD9007F1380DA0FF8C7FC2C367CB434>I<EB7F80B5FCA41203C6FC137FB3A6ED
+07FC92383FFF8092B512E0913981F00FF8913983C007FC9139870003FE028E1301029C6D
+7E14B814B002F06E7E5CA25CA35CB3AD2601FFE0903801FFE0B600C0B612C0A43A537CD2
+41>104 D<1378EA01FE487E487FA66C90C7FC6C5AEA007890C8FCB0EB7F80B5FCA41203
+C6FC137FB3B3A43801FFE0B61280A419507CCF21>I<EB7F80B5FCA41203C6FC137FB3B3
+B3B13801FFE0B612C0A41A537CD221>108 D<01FFD907FEEC03FFB590261FFFC0010F13
+E0037F01F0013F13F8912701F80FFC9038FC07FE913D03C003FE01E001FF000390260700
+019038038000C6010E6D6C48C76C7E6D48DA7F8E6E7E4A159CA24ADA3FF86E7E02605D14
+E04A5DA34A5DB3AD2601FFE0DAFFF0EC7FF8B6D8C07F9026FFE03FB512F0A45C347CB363
+>I<01FFEB07FCB590383FFF8092B512E0913901F00FF8913903C007FC000349C66C7EC6
+010E13016D486D7E5C143002706E7E146014E05CA35CB3AD2601FFE0903801FFE0B600C0
+B612C0A43A347CB341>I<EC0FFC91387FFF8049B512E0903907F807F890391FE001FE90
+393F80007F017EC7EA1F80496E7E48486E7E00038248486E7EA248486E7EA248486E7EA2
+003F82A24848ED7F80A400FF17C0AB007F1780A26D15FFA2003F1700A2001F5E6D140100
+0F5E6D140300075E6C6C4A5A6C6C4A5AA2D8007FEC3F806D6C49C7FC90391FE001FE9039
+07F807F86DB55AD9007F1380DA0FFCC8FC32367CB43B>I<90397F8007FCB590387FFF80
+0281B512E0913987F00FF891398F8003FC000190399E0001FF6C01BC6D7FD97FF86E7E4A
+6E7E4A6E7E4A140F844A6E7EA2717EA3717EA4711380AB4D1300A44D5AA24D5AA2606E14
+0F4D5A6E5D6E4A5A6E4A5A02BC4AC7FC029E495A028FEB07FC913987E01FF00281B512C0
+DA807F90C8FCED0FF892CAFCB13801FFE0B612C0A4394B7DB341>I<01FFEB1F80B5EB7F
+F0913801FFF8913803E1FC91380783FE0003EB0F07C6131EEB7F1C1438143091387003FC
+91386000F0160014E05CA45CB3AA8048487EB612F0A427347DB32E>114
+D<D907FE13C090387FFF8148B512E33907F803FF390FC0007F4848133F48C7121F003E14
+0F007E1407127C00FC1403A315017EA27E7F6C6C90C7FC13F013FF6C13F86CEBFF806C14
+E06C14F86C14FEC680013F1480010714C0D9003F13E014039138007FF0151F00E0140FED
+07F8A26C1403A215017EA36C15F0A26C14036C15E015076DEB0FC06DEB1F80D8FDF0EB3F
+0039F8FC01FE39F07FFFF8D8E01F13E0D8C00390C7FC25367CB42E>I<D97F80EC7F80B5
+91B5FCA400031503C61500017F157FB3AC17FFA35EA3013F5C6EEB077FA2011F020E7F6D
+6C011C13F06E0178EBFFC0903903FC01F06DB512E06D6C1380912607FC00EB80003A357C
+B341>117 D<B60103B51280A4000301F09039007FF800C601C0EC3FE0017FED1F8095C7
+FC133F6E141E131F171C6E143C010F15388001075DA26E14F001035D8001014A5AA26E13
+036D5D1580027F49C8FCA26F5A023F130E15E0021F5BA2EDF03C020F133815F802075BA2
+EDFCF002035B15FE6E6C5AA36E5BA26FC9FCA3153EA2151CA2153C153815781570A215F0
+5D14015DA2003E495A127F486C48CAFCA2140E141E495A6C5B007C5B383F03E06CB45A00
+075BD801FCCBFC394B7EB23E>121 D E /Fw 25 122 df[<1638167816F0ED01E0ED03C0
+ED0780ED0F00151E153E5D5D4A5A4A5AA24A5A4A5A141F92C7FC143E147E147C14FC495A
+A2495AA2495AA2495AA2495AA2133F91C8FC5B137EA213FE5B1201A25B1203A3485AA448
+5AA4485AA5123F5BA5127FA390C9FCA65AB3A87EA67FA3123FA57F121FA56C7EA46C7EA4
+6C7EA312017FA212007F137EA2137F7F80131FA26D7EA26D7EA26D7EA26D7EA26D7E147C
+147E143E8081140F6E7E6E7EA26E7E6E7E157C81151E81ED0780ED03C0ED01E0ED00F016
+781638>37 172 113 256 61 40 D[<12E07E12787E7E7E6C7E6C7E7F6C7E6C7E137C7F
+A27F6D7E8013076D7E801301806D7EA2147EA280A26E7EA26E7EA2811407811403A28114
+0181A2140081A3157FA4ED3F80A4ED1FC0A516E0150FA516F0A31507A616F8B3A816F0A6
+150FA316E0A5151F16C0A5ED3F80A4ED7F00A415FEA35D1401A25D14035DA214075D140F
+5DA24A5AA24AC7FCA2147EA25CA2495A5C13035C495A130F5C49C8FC133EA25B5B485A48
+5A5B485A48C9FC121E5A5A5A5A>37 172 120 256 61 I<150E151E153E157E15FE1403
+1407141F14FF130790B5FCB6FC14E7140713F81300C7FCB3B3B3B3B24A7E4A7F49B512F8
+007FB812E0A5337272F14F>49 D<EA0780EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0
+EA1FE0EA0780C7FCB3B3AAEA0780EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0
+EA07800E4A72C92B>58 D<F007804E7EA34E7EA34E7EA34E7EA34E7EA24D7FA34D7F18DF
+18CF0507801887A2050F801803A2051F80EF1E01A2053E80EF3C00A24D80197FA24D8019
+3F0401815F191F0403815F850407824D7FA2040F8294C77EA24C82041E80A2043E82043C
+80A24C821A7FA24C821A3F0301835E1A1F0303835E860307844C81A2030F8493C97EA24B
+84031E82A2033FB97EA34B84A20378CA127F4B841B3F0201855D1B1F0203855D87020786
+4B83A2020F8692CB7EA24A86021E84A2023E86023C84A24A861C7FA24A861C3F010187A2
+01031A1F891307010F86496C4F7F496C87D9FFFE4F7F00076D6C4DB512F8B600F8057FEC
+FFFCA56E7A7CF977>65 D<B812E0A5D8003F49CCFC010713F05D6D5BB3B3B3AC1C70A51C
+E0A81B01A31CC01B03A41B07A21B0FA21B1FA2F33F80A21B7F1BFF62621A0F621A7F494D
+B5FC6F150F013F6D4AB61200BDFCA5547678F563>76 D<BA12F0F1FF801AF01AFCF2FF80
+D8003F01F0C86C7F010749030713F04B030013FC6DF03FFEF20FFF747F08017F747F757E
+88757E1B1F881B0F88A2751380A21DC0A287A21DE0AA1DC0A263A21D80A2511300A2641B
+1F64515A515A1BFF6408035B5090C7FC505AF23FFCF2FFF007075B077F138092B848C8FC
+1AF01A8007F0C9FC03C0CDFCB3B3AB497FA2013F13FCB8FCA55B7678F56C>80
+D<B912FCF0FFF019FEF1FFC01AF8D8003F01F0C7000713FE0107499139003FFF804B0307
+7F6D050113F0736C7E747EF20FFF747F747F86747F88757EA2757EA2757EA288A28789A9
+9AC8FCA263A264A2515A641B7F64515A64505B5090C9FC505A505AF23FF8F27FE0963801
+FF80DF0FFECAFCF17FF895380FFFE092B8CBFC19F019FC03C0C7380FFF80060113E09538
+003FF8F11FFEF107FF737F7313E0737F747E1A3F87747E1A0F878688A3747FAB88AC1F10
+1F38747FA47416787614701B7F496D1BF0756C14E0013F01FC051F1401B8707E0907EC03
+C0756CEB0780759038800F009839007FE03ECF381FFFFC0A075B9938007FC06D7978F575
+>82 D<DB3FF815E00203B512C0021F02F81301027F14FE49B7128049D9C007EBC003D90F
+FEC7EA3FF0D91FF8913807F807D93FE0EC01FC4948913800FE0F4948153F4890C9EA1F9F
+4848EE0FDF49EE07FF484882000F834982121F49177F003F183F5B191F127F190F5B1907
+12FFA21903A31901A27FA36D1700A2127F7F7F1A006C7E7F7F6C7F806C7F14F86C7F6CEB
+FF8015F86CECFF806C15F86DECFF806D15F06D15FF6D16E0010316F86D16FE6D6C81021F
+16C0020382DA003F81030781DB007F80040780DC007F7F050F14801700063F13C07213E0
+18077213F084841AF8197F193F1AFC191FA2190F00E019FE1907A41903A27EA57E1AFCA2
+7E19077E1AF86C180FA26D18F0191F6D18E06D173F6D18C06DEF7F806D17FF017E4C1300
+6D6C5E486C6C4B5AD90FF0ED0FF826FC07FC4B5AD901FF4B5A486C01F0ECFFC091273FFF
+800F5B48010F90B548C7FC020315F8020015E048020F14809226007FF8C8FC477C78F858
+>I<001FBE12F8A502F8C7000F01F0C7121F4801806E49020113FC01FCC86C49EC003F49
+1B1F01E01B07491B03491B0190C91800A2003E1D7CA2003C1D3CA3481D1EA500701D0EA8
+481D07A6CA1900B3B3B3B14D7F4D7F057F13FE031FB812F8A568757BF473>I<913803FF
+80021F13F891B512FE903A03FC01FF80903A07E0003FE0D91F80EB0FF8013EC76C7E496E
+7E01F06E7E48486E7F717E4848153F4982D807A06F7E13FC487E6D6F7E80A2717EA46C90
+C8FC6C5A6C5ACAFCA6EE07FF0303B5FC157F913903FFFE07021F138091387FF800903801
+FFC0010790C7FCEB1FFCEB3FF0EBFFE0485B485B4890C8FC5B485A485AA2485A1A0E485A
+A312FF5B170FA4171FA26D153F007F163B177B6DDBF1FE131C003F16E16C6C14016C6C91
+2603C0FF13386C6CEC0F806C6C6C903A1F007F80706C6D017CECE1E028007FF803F8EB3F
+FF011FB500E06D1380010391C7000713009026003FF8EC01FC474D79CB4F>97
+D<14F8EA03FFB5FCA5C6FC133F131FA2130FB3B04CB47E041F13F8047F13FE923A01FC01
+FF80923A07E0003FE0031FC7EA0FF0033EEC07FC0378EC01FE4B6E7EDAF9E06F7EDAFBC0
+6F7EDAFF808292C96C7E737E5C4A707E864A160386851B80A37313C0A31BE0A31A7FA21B
+F0AE1BE0A21AFFA31BC0A2611B80A21B0061626E1607626E160F626E4C5A02F75FDAE780
+4B5ADAE3C0157FDAC1E04B5ADAC0F04A48C7FC03784A5A4A6CEC0FF8031F4A5A4A6C6CEB
+7FC0922703F803FFC8FC0300B512FC010E023F13E090C8D807FEC9FC4C797BF758>I<ED
+07FE92387FFFE00203B512FC91390FFC01FF913A3FE0001FC0DA7F80EB03E0D901FEC812
+F84948157C494881494881494881013FEE0780494815034948ED0BC048177F91C9EAFFE0
+48485D00075EA2485AA2485AA27113C0003F70138049EE7F0095C7FC127FA35BA212FFAE
+127F7FA4123F7FA2121F6D1738120F19786C6C1770A26C6C17F019E06C6D15016C18C06D
+6C15036D6CED07806EED0F006D6C151E6D6C153ED903FE5D6D6C15F06D01C0EB03E0DA3F
+F0EB0FC0DA0FFE01FFC7FC0203B512FCDA007F13E0030790C8FC3D4D7BCB46>I<ED1FFC
+4AB512C0020714F091391FF00FFC91397F8001FFD901FEC7EA7FC049486E7E49486E7E49
+486E7E49486E7E49486E7E4948140101FF824890C91380A24848EE7FC0A2485A000FEF3F
+E05BA2001F18F0181F485AA3007F18F8A349160FA212FF90B9FCA301E0CBFCAB127F7FA3
+123FA36C7EA219386C7E1978000718707F000318F06C6C17E018016C6DED03C06D6C1680
+013F16076D6CED0F006D6C151E6D6C5D6D6C5D6DB44A5A6D6C6C495ADA3FE0EB1F80DA0F
+FE01FEC7FC0203B512F8DA007F13E0DB07FEC8FC3D4D7BCB46>101
+D<EE7FC0923803FFF8030F7F92383FC07F9239FF000F804A48EB3FC04A48137F4A48EBFF
+E04A485AEC1FE0143F15C0147F158002FF6D13C0EF7F804990C7EA0C0094C7FCA3495AB3
+A9B812C0A5260003FEC9FCB3B3B3A7805B011F13E0001FB612F8A533797DF82F>I<F103
+F8F13FFEDB1FF891B5FC92B5903903FC078002079139E007E01F913D1FF00FF81F803FC0
+913B3FC003FC3E0002FFC7B45A49486E5A49486E5A49486E48EB1F8049486E6CEB060097
+C7FC49486E7E013F82A249486E7EA201FF82A24A80A24884AA6C95C8FCA26E5CA2017F5E
+A26D6C4A5AA2011F5E6D6C4A5AA26D6C4A5A6D6C4A5A496C4A5A6E4AC9FC903A0F3FC003
+FC903A1E1FF00FF80207B512E0D91C0091CAFC013CEB1FF892CCFCA25BA3137CA4137EA2
+7F8080EB1FF091B612FE6DEDFFF818FF6D17E06D17F8010017FE010383010F84D93FE0C7
+000114E001FFC9120FD801FC04017F48489338003FF84848171F4848717E48481707003F
+727E49170148CBFC737EA200FE85A76C616C616D1701003F616D17036C6C4D5A6C6C4D5A
+6C6C4D5A6C6C4D5A6C6C4D5A26007F80DB01FEC7FCD93FE0ED07FCD90FF8ED1FF0D903FF
+EDFFC0010001F8011F90C8FC021FB612F802011580DA000F01F0C9FC4A707DCC4F>I<13
+1EEB7F80497E487F487FA66C5B6C5B6D5A011EC7FC90C8FCB3A7EB01F0EA07FFB5FCA512
+01EA007F133FA2131FB3B3B3A3497EEBFFFEB612FCA51E727AF12A>105
+D<EB01F0EA07FFB5FCA51201EA007F133FA2131FB3B3B3B3B3AC497EEBFFFEB612FEA51F
+787AF72A>108 D<D901F0903803FF80D807FF021F13F8B5027F13FE923A01FC03FF8092
+3A03E0007FE0DB0F80EB1FF0031EC76C7EC65C013F496E7E011F496E7E5DEB0FF1DAF3C0
+6E7E5D14F792C9FC02FF835CA35CA45CB3B3A8496C4B7FD97FFF030713F0B7D8800FB612
+F8A54D4B7ACA58>110 D<ED07FE92387FFFE00203B512FC91390FFC03FF913A3FC0003F
+C04AC7EA0FE0D901FEEC07F8D903F8EC01FC49486E7E4948157F49486F7E49486F7E017F
+8349C96C7E4916070001844848707EA2000784491601000F84A24848701380A2003F19C0
+A349177F007F19E0A412FF1AF0AD007F19E0A26D17FFA2003F19C0A46C6C4C1380A2000F
+1900A26C6C4C5AA26C6C4C5A0001606D160F6C606D6C4B5A6D6C4B5AA26D6C4B5AD907F0
+03FEC7FCD903FCEC03FC6D6C4A5A6D6C6CEB1FF0DA3FE0EB7FC091270FFC03FFC8FC0203
+B512FCDA007F13E0DB07FEC9FC444D7BCB4F>I<02F849B47ED803FF021F13F8B5027F13
+FE923A01FC01FF80923A07E0003FE0031FC76C7E033EEC0FFCC60278EC03FE013F496E7E
+90261FF9E06E7FDAFBC0826DB4486F7E92C96C7E737E5C4A707E864A160786851B80A285
+1BC0A2851BE0A5F27FF0AEF2FFE0A54F13C0A34F1380A21B0061626E160F626E161F626E
+4C5A4F5A6F5EDAFBC015FFDAF9E04A5BDAF8F04A48C7FC03784A5A6F4A5A031FEC3FF06F
+6CEBFFC0922603F80790C8FC0300B512FC043F13E0DC07FEC9FC93CBFCB3A7497EEB7FFF
+B77EA54C6C7BCA58>I<D903E0EB1FE0D80FFFECFFFCB501037F923907E01F8092391F80
+7FC092383E00FF4B4813E000011478D8007F13F090383FE1E015C0EB1FE39126E7800013
+C0EF7F8092C7EA3F0002EF91C7FC14EE14FE5CA45CA55CB3B3A480133F90B5FCB712C0A5
+334B7ACA3D>114 D<DA1FFFEB038049B512E0010FECF807903A3FE001FE0F01FEC7EA1F
+9FD801F8EC07DFD807E0EC03FF484880498048C9127F48163F003E161F127E170F127C12
+FC1707A46C1603A27E7F6C7E7F6D92C7FCEA3FFC13FF6C13E06C13FF6C14F06CECFF806C
+15F86C15FE013F6E7E010F15E0010381010081020F14FEDA007F7F1503DB003F13800407
+13C0040113E000E081177FEF3FF06C161F170FEF07F8A217037E1701A27EA37E18F07E17
+036D16E0A26D15076DED0FC06D168000FE161F017CED3F00486C157E6DEC01F826F80FC0
+EB07F026F003F8EB7FC00100B6C7FC48013F13FC02071380354D7CCB3E>I<B600F84AB5
+12FCA5000191C9003F13C026007FFC040F13006D4817FC011F715A62010F715A6E5F1307
+4F5A6D7E97C7FC6E5E6D170EA26F151E6D171C81027F5EA26F1578023F167081021F5EA2
+6F1401020F5E8102074B5AA26F1407020393C8FC816E150EA270131E6E151C82037F5CA2
+701378033F147082031F5CA2EEF801030F5CA26F6C485AA2EEFE07030391C9FCA2705A6F
+130E178E6F139CA217FC705AA2705AA3705AA2705AA3705AA24E4B7EC953>118
+D<B600F84AB512FCA5000191C9003F13C026007FFC040F13006D4817FC011F715A62010F
+715A6E5F13076E4C5A130397C7FC6E5E6D170E816D5FA26F153C027F163881023F5EA26F
+15F0021F5E81020F4B5AA26F140302075E8102034BC8FCA26F5C6E150E826E5DA270133C
+037F143882033F5CA27013F0031F5C82030F495AA2EEFC0303075C16FE030349C9FCA270
+5A6F130E178E6F139CA217FC705AA2705AA3705AA2705AA3705AA294CAFCA25E160EA25E
+A2163C1638A25EA216F05EA24B5A120FD83FC01303486C5C486C130793CBFC5D150E5D15
+3C6C485B495B6C48485A383C0003001F495A260FE03FCCFC3803FFFE6C13F838003FE04E
+6C7EC953>121 D E /Fx 4 118 df<003FBCFCA863A263CC00075B616361634F5B616396
+B5FC4E91C7FC626062604E5B626062604E5B6295B5FC97C8FC5F4D5B615F615F4D5B615F
+615F94B55A96C9FC5E605E4C5B605E605E4C5B605E6093B5FC4B91CAFC5F5D5F5D4B5B5F
+5D5F5D4B5B5F92B5FC94CBFC5C4A5B5E5C5E5C4A5B5E5C5E5C91B55A93CCFC5B5D5B495B
+5D5B5D5B495B5D5B5D90B5FC4891CDFC5C5A5C485B5A5C5A5C4890BB12805AA2BDFCA851
+7877F763>90 D<EAFFF8B3B3A9EEFFE0031F13FC92B57E02036E7E020F81023F15F091B7
+7E01F98290B8FC8484DB803F14809138FC000702F0010114C002C06D6C13E04A8091C86C
+13F049814981496F13F88319FC83A2187F19FEA2183FA319FF84AD6019FEA4187F19FC18
+FFA24D13F8A25F6D17F05F6D4B13E06D5D6E4A13C06E91B5FC6E0103148002F8010F1400
+02FF90B55A92B6FC6001FB5E01F95E01F85E6E1580021F92C7FC6E14FC02035CDA007F13
+C0C8D807FEC8FC407973F753>98 D<ED1FFC92B512C0020714F8021F14FE027F8091B712
+C0498201078249824982498249EBF807DBC0007F90B5C7003F13804849804801F86E13C0
+4A8048496E13E083485B4A6E13F048177F91C9FC4917F8003F173FA25B007F171F90B9FC
+19FCA3BAFCA601F0CBFCA57FA2127FA37FA2123F7FA26C7EA26C7F807E6E16106C6D1670
+6E16F06C6D15036C01FF150F6F147F6D01F0903803FFF86D01FE137F6D90B7FC7F7F6D17
+F0010017C06E1600021F5D6E15F0020115C06E6C01FCC7FC030713C03E4D7BCB48>101
+D<D8FFF8923807FFC0B3B3B15FA25FA25FA25F6D92B5FC16036C6C5C6D141FDAE001B6FC
+91B8FC6C16F717E76C16876CEDFE076C15FC6C15E06C15806C6CEBF800010F90CAFC3A4B
+74C953>117 D E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 237 809 a Fx(Zebu)p Fw(:)70 b(A)52 b(T)-13 b(o)t(ol)53
+b(for)g(Sp)t(ecifying)i(Rev)l(ersible)f(LALR\(1\))1671
+1017 y(P)l(arsers)810 1313 y Fv(Joac)m(him)36 b(Laubsc)m(h)j(\(laubsc)m
+(h at hplabs.hp.com\))1483 1592 y(Jan)m(uary)f(13,)f(1999)2143
+3922 y Fu(Application)30 b(Engineering)i(Departmen)m(t)2331
+4043 y(Soft)m(w)m(are)i(T)-8 b(ec)m(hnology)33 b(Lab)s(oratory)2446
+4163 y(Hewlett-P)m(ac)m(k)-5 b(ard)33 b(Lab)s(oratories)2247
+4283 y(1501)f(P)m(age)h(Mill)d(Road,)i(Bldg.)43 b(1U-17)3056
+4404 y(P)-8 b(.O.)33 b(Bo)m(x)g(10490)1610 4524 y(P)m(alo)f(Alto,)f
+(Calif.)42 b(94304-1126)30 b(laubsc)m(h at hpl.hp.com)3091
+4764 y(\(415\))i(857-7695)1896 5656 y(1)p eop
+%%Page: 2 2
+2 1 bop 120 407 a Ft(Con)l(ten)l(ts)120 720 y Fs(1)90
+b(In)m(tro)s(duction)2780 b(3)120 1030 y(2)90 b(The)38
+b(Represen)m(tations)f(of)h(Grammars)f(in)g(Files)1303
+b(5)266 1207 y Fu(2.1)100 b(Grammar)30 b(notation)80
+b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g
+(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)192 b
+Fu(5)491 1383 y(2.1.1)111 b(Grammar)30 b(Rules)46 b Fr(:)k(:)g(:)g(:)g
+(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)
+g(:)g(:)g(:)g(:)192 b Fu(5)120 1693 y Fs(3)90 b(Grammar)37
+b(Options)2501 b(9)266 1870 y Fu(3.1)100 b(Keyw)m(ord)34
+b(Argumen)m(ts)f(to)f(Grammar)e(Construction)87 b Fr(:)50
+b(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)192 b Fu(9)266
+2047 y(3.2)100 b(De\014ning)32 b(a)g(Domain)77 b Fr(:)50
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g
+(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(10)120
+2357 y Fs(4)90 b(The)38 b Fq(Zebu)f Fs(Meta)h(Grammar)2104
+b(13)266 2534 y Fu(4.1)100 b(Domain)30 b(De\014nition)94
+b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g
+(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b
+Fu(15)266 2710 y(4.2)100 b(Example)32 b(Grammars)26 b
+Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g
+(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b
+Fu(15)266 2887 y(4.3)100 b(The)33 b(Kleene)g(*)f(Notation)59
+b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g
+(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(18)120
+3197 y Fs(5)90 b(Using)37 b(the)h(Compiler)2376 b(19)266
+3374 y Fu(5.1)100 b(Compiling)29 b(a)j(grammar)99 b Fr(:)50
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
+(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(19)266 3550 y(5.2)100
+b(Loading)31 b(a)h(grammar)41 b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g
+(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)
+g(:)g(:)143 b Fu(22)266 3727 y(5.3)100 b(P)m(arsing)32
+b(a)g(string)g(with)h(a)f(grammar)23 b Fr(:)50 b(:)g(:)g(:)f(:)h(:)g(:)
+g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143
+b Fu(22)266 3904 y(5.4)100 b(P)m(arsing)32 b(from)f(a)i(\014le)f(with)g
+(a)g(grammar)67 b Fr(:)50 b(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
+(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(23)266 4080 y(5.5)100
+b(P)m(arsing)32 b(from)f(a)i(list)e(of)h(tok)m(ens)62
+b Fr(:)50 b(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
+(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(24)266 4257 y(5.6)100
+b(Debugging)31 b(a)h(grammar)84 b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g
+(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)
+143 b Fu(25)120 4567 y Fs(6)90 b(Lexical)37 b(Analysis)2548
+b(25)266 4744 y Fu(6.1)100 b(Customization)31 b(and)h(Regular)g
+(Expressions)c Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)
+g(:)g(:)g(:)g(:)143 b Fu(25)266 4920 y(6.2)100 b(In)m(tro)s(ducing)32
+b(new)i(Categories)e(b)m(y)i(Regular)d(Expressions)66
+b Fr(:)50 b(:)g(:)g(:)f(:)h(:)g(:)g(:)g(:)g(:)143 b Fu(25)266
+5097 y(6.3)100 b(The)33 b(functional)e(in)m(terface)i(to)f(the)h
+(parsing)f(engine)84 b Fr(:)50 b(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g(:)g(:)
+g(:)g(:)143 b Fu(27)120 5407 y Fs(7)90 b(F)-9 b(uture)38
+b(W)-9 b(ork)2710 b(28)1896 5656 y Fu(2)p eop
+%%Page: 3 3
+3 2 bop 120 407 a Fs(A)61 b(Installation)2784 b(29)1720
+1001 y Fp(Abstract)500 1234 y Fo(Zebu)690 1201 y Fn(1)760
+1234 y Fm(is)29 b(part)h(of)g(a)h(set)g(of)f(to)s(ols)g(for)g(the)g
+(translation)g(of)g(formal)f(languages.)41 b Fo(Zebu)364
+1347 y Fm(con)m(tains)32 b(a)h(LALR\(1\))h(parser)d(generator)j(lik)m
+(e)e(Y)-8 b(acc)34 b(do)s(es.)46 b(Aside)32 b(from)g(generating)h(a)364
+1460 y(parser,)h Fo(Zebu)g Fm(will)d(also)j(generate)h(the)f(in)m(v)m
+(erse)f(of)h(a)h(parser)e(\(unparser\).)50 b(In)33 b(con)m(trast)364
+1573 y(to)g(Y)-8 b(acc,)34 b(the)e(seman)m(tics)g(is)f(not)h(giv)m(en)g
+(in)f(terms)h(of)g(\\routines")g(but)f(declarativ)m(ely)g(in)364
+1686 y(terms)f(of)h(t)m(yp)s(ed)f(feature)h(structures.)500
+1803 y(The)39 b(abilit)m(y)f(to)i(declarativ)m(ely)f(de\014ne)g(a)h
+(rev)m(ersible)e(grammar,)k(together)f(with)d(a)364 1916
+y(rewrite-rule)29 b(mec)m(hanism)i(\()p Fo(Zebu-RR)p
+Fm(\))h(for)f(transforming)f(abstract)i(syn)m(tax)g(trees)f(con-)364
+2029 y(stitute)f(the)h(basic)f(to)s(ols)g(for)g(sp)s(ecifying)e
+(translators)i(for)g(formal)g(languages.)364 2294 y Fs(Keyw)m(ords)91
+b Fm(F)-8 b(ormal)33 b(language,)g(LALR-grammar,)g(parsing,)f
+(translation,)g(genera-)364 2407 y(tion,)e(in)m(terop)s(erabilit)m(y)-8
+b(,)29 b(LEX,)h(Y)-8 b(A)m(CC.)120 2809 y Ft(1)161 b(In)l(tro)t
+(duction)120 3080 y Fu(Our)37 b(goal)e(is)h(to)g(dev)m(elop)h(an)g(en)m
+(vironmen)m(t)g(for)f(the)h(design,)h(analysis)e(and)g(manipulation)d
+(of)120 3200 y(formal)43 b(languages,)48 b(suc)m(h)e(as)g(programming)c
+(languages,)48 b(markup)d(languages,)j(data)d(in)m(ter-)120
+3321 y(c)m(hange)h(formats)e(or)g(kno)m(wledge)i(represen)m(tation)f
+(languages)g(\(suc)m(h)h(as)f(the)g(translation)e(to)120
+3441 y(and)28 b(from)e(KIF\))i([4].)42 b(Being)27 b(able)g(to)h
+(design,)g(analyze,)h(and)f(manipulate)e(formal)f(languages)i(is)120
+3562 y(crucial)32 b(for)h(ac)m(hieving)g(soft)m(w)m(are)h(in)m(terop)s
+(erabilit)m(y)e([3)o(],)i(automatic)e(co)s(de)h(analysis,)h(indexing,)
+120 3682 y(and)42 b(retriev)-5 b(al)40 b(for)i(p)s(oten)m(tial)e
+(reuse.)72 b(Zebu)42 b(has)g(b)s(een)h(applied)e(to)g(writing)f
+(translators)h(for)120 3802 y(formal)32 b(languages)i([6].)50
+b(The)36 b(main)c(idea)i(of)h(this)f(w)m(ork)i(is)e(that)g(a)g(mo)s
+(dule)g Fr(m)h Fu(comm)m(unicates)120 3923 y(b)m(y)k(sending)f(or)g
+(receiving)f(messages)i(in)e(some)h(language)f Fr(L)p
+Fu(\()p Fr(m)p Fu(\),)j(and)e(that)g(for)f(v)-5 b(arious)37
+b(rea-)120 4043 y(sons)g(di\013eren)m(t)f(mo)s(dules)f(use)h
+(di\013eren)m(t)g(languages.)53 b(F)-8 b(or)35 b(comm)m(unication)f(to)
+h(b)s(e)h(successful,)120 4163 y(translators)d(ha)m(v)m(e)i(to)f(b)s(e)
+g(used.)48 b Fq(Zebu)34 b Fu(pro)m(vides)g(to)s(ols)f(to)g(de\014ne)i
+(translators)e(at)h(a)f(high)g(lev)m(el)120 4284 y(of)f(abstraction)709
+4248 y Fn(2)748 4284 y Fu(.)266 4451 y(McCarth)m(y)38
+b(in)m(tro)s(duced)e(the)h(notion)e(of)g(\\abstract")h(and)g
+(\\concrete")h(syn)m(tax.)55 b(The)37 b(con-)120 4572
+y(crete)f(syn)m(tax)g(describ)s(es)h(the)e(surface)h(form)e(of)g(a)h
+(linguistic)d(expression,)37 b(while)d(the)i(abstract)120
+4692 y(syn)m(tax)30 b(describ)s(es)f(a)f(\(comp)s(osite\))f(ob)5
+b(ject.)43 b(E.g.)g(\\1+a")27 b(is)h(the)g(surface)i(string)d(rendered)
+j(b)m(y)f(a)120 4813 y(particular)e(concrete)i(syn)m(tax)i(for)d(an)g
+(ob)5 b(ject)29 b(describ)s(ed)h(b)m(y)f(an)f(abstract)h(syn)m(tax:)43
+b(an)29 b(addition)p 120 4917 1440 4 v 232 4979 a Fl(1)269
+5009 y Fk(\\)p Fj(zebu)p Fi(n)p Fk(.,)k Fi(pl)p Fk(.)49
+b Fj(-bus)p Fk(,)32 b Fj(-bu)p Fk(:)45 b(1.)j(an)31 b(o)n(xlik)n(e)g
+(domestic)g(animal)g(\()p Fi(Bos)j(indicus)p Fk(\))f(nativ)n(e)e(to)g
+(Asia)g(and)h(parts)120 5108 y(of)c(Africa:)36 b(it)28
+b(has)f(a)g(large)f(h)n(ump)i(o)n(v)n(er)e(the)i(shoulders,)f(short,)f
+(curving)h(horns,)g(p)r(endulous)h(ears,)e(and)h(a)g(large)120
+5208 y(dewlap)34 b(and)g(is)g(resistan)n(t)g(to)g(heat)g(and)g
+(insect-b)r(orn)g(diseases.")55 b([W)-7 b(ebster's)34
+b(New)g(W)-7 b(orld)34 b(Dictionary)-7 b(.])57 b(A)120
+5308 y(zebu)28 b(should)f(not)h(b)r(e)g(confused)f(with)h(a)f(y)n(acc)g
+(or)g(a)g(gn)n(u)g(although)g(it)h(b)r(ears)f(similarit)n(y)f(to)i(eac)
+n(h)f(of)g(them.)232 5377 y Fl(2)269 5407 y Fk(The)22
+b(rewrite-rule)f(mec)n(hanism)g(\(Zebu-RR\))h(is)g(implemen)n(ted,)i
+(and)d(will)h(b)r(e)g(describ)r(ed)g(in)g(a)g(future)g(rep)r(ort.)1896
+5656 y Fu(3)p eop
+%%Page: 4 4
+4 3 bop 120 407 a Fu(op)s(eration)33 b(with)i(t)m(w)m(o)g(op)s(erands,)
+h(the)f(\014rst)h(b)s(eing)e(the)h(n)m(umeral)f(\\1",)h(and)f(the)i
+(second)g(b)s(eing)120 527 y(the)d(v)-5 b(ariable)31
+b(named)h(\\a".)266 695 y(Manipulation)39 b(of)i(linguistic)d
+(expressions)43 b(is)e(m)m(uc)m(h)g(easier)h(to)e(express)k(in)c(the)i
+(abstract)120 815 y(syn)m(tax)34 b(than)f(in)f(the)h(concrete)g(syn)m
+(tax.)266 983 y(If)42 b(w)m(e)g(w)m(ere)g(to)f(design)h(an)f(algorithm)
+d(for)i(simplifying)e(expressions)43 b(of)e(some)g(language)120
+1103 y(|)46 b(sa)m(y)h(\\arithmetic")d(|)i(w)m(e)h(w)m(ould)f(use)h(as)
+g(the)g(fron)m(t)f(end)h(the)f(\\arithmetic-parser")e(to)120
+1224 y(translate)36 b(in)m(to)g(abstract)h(syn)m(tax,)j(then)d(express)
+i(the)e(simpli\014cation)d(rules)i(in)g(terms)h(of)f(tree)120
+1344 y(transformation)25 b(rules)i(that)g(op)s(erate)g(on)f(the)i
+(abstract)f(syn)m(tax,)j(and)d(\014nally)f(add)h(as)g(the)g(bac)m(k-)
+120 1464 y(end)33 b(the)g(\\arithmetic-unparser".)266
+1632 y(More)d(generally)-8 b(,)29 b(if)f(w)m(e)j(w)m(ere)g(to)e(design)
+g(an)h(algorithm)c(for)j(translating)e(from)i(language)f(A)120
+1752 y(to)j(language)f(B,)h(w)m(e)h(w)m(ould)f(de\014ne)i(rev)m
+(ersible)e(grammars)f(for)g(languages)h(A)g(and)g(B,)h(and)f(sets)120
+1873 y(of)k(rewrite)g(rules)g(to)g(transform)f(the)i(abstract)f(syn)m
+(tax)i(trees)f(from)e(the)i(domain)d(of)i(language)120
+1993 y(A)45 b(to)f(the)i(domain)d(of)h(language)g(B.)h(The)h(fron)m(t)e
+(end)i(w)m(ould)f(b)s(e)g(the)g(\\A-parser")g(and)g(the)120
+2114 y(bac)m(k-end)34 b(the)f(\\B-unparser")266 2281
+y(The)f(w)m(ork)f(describ)s(ed)g(in)f(this)g(rep)s(ort)g(o)m(w)m(es)i
+(a)e(lot)f(to)h(the)h(pioneering)e(researc)m(h)j(at)e(Kestrel)120
+2402 y([9])38 b(that)f(resulted)h(in)f(the)h Fq(Re\014ne)1394
+2365 y Fn(3)1471 2402 y Fu(program)f(transformation)e(system)k([8].)58
+b(The)39 b(basic)e(ideas)120 2522 y(underlying)45 b Fq(Zebu)g
+Fu(are)g(already)f(presen)m(t)j(in)d Fq(Re\014ne)p Fu(.)82
+b Fq(Zebu)45 b Fu(is)f(m)m(uc)m(h)i(more)e(compact)h(than)120
+2642 y Fq(Re\014ne)371 2606 y Fn(4)411 2642 y Fu(,)37
+b(and)f(the)g(seman)m(tics)g(is)g(expressed)i(in)d(t)m(yp)s(ed)i
+(feature)g(structures.)55 b Fq(Zebu)36 b Fu(also)f(o\013ers)120
+2763 y(the)25 b(p)s(ossibilit)m(y)e(of)i(de\014ning)g(a)f
+(meta-grammar.)38 b Fq(Zebu)25 b Fu(lac)m(ks)g Fq(Re\014ne)p
+Fu('s)h(abilit)m(y)d(to)i(declarativ)m(ely)120 2883 y(sp)s(ecify)33
+b(transformations)e(using)h(a)g(pattern)h(language.)2231
+2847 y Fn(5)266 3051 y Fu(The)45 b(LALR\(1\))e(parsing)g(table)g
+(generated)i(b)m(y)g Fq(Zebu)f Fu(follo)m(ws)e(algorithms)f(describ)s
+(ed)k(in)120 3171 y([1])j(or)f([2].)89 b(The)48 b(curren)m(t)h
+(implemen)m(tation)c(w)m(as)j(dev)m(elop)s(ed)h(from)d(the)i
+Fq(Scheme)h Fu(program)120 3291 y(dev)m(elop)s(ed)34
+b(b)m(y)f(William)28 b(W)-8 b(ells)32 b(and)h(is)f(written)g(in)g
+Fq(Common)h(Lisp)p Fu(.)266 3459 y(The)h(next)g(section)f(will)e
+(explain)h(ho)m(w)i(a)e(grammar)f(can)i(b)s(e)g(de\014ned,)i(and)e(ho)m
+(w)h(seman)m(tics)120 3579 y(can)45 b(b)s(e)g(asso)s(ciated)g(with)f(a)
+h(grammar)d(rule.)80 b(Section)45 b(3)f(describ)s(es)i(the)f
+(de\014nition)f(of)h(the)120 3700 y(seman)m(tic)36 b(domain.)52
+b(With)35 b(this)g(capabilit)m(y)g(it)g(is)g(p)s(ossible)g(to)h(state)g
+(declarativ)m(ely)f(what)i(the)120 3820 y(abstract)43
+b(syn)m(tax)i(should)d(lo)s(ok)g(lik)m(e.)74 b(Section)42
+b(4)h(describ)s(es)h(a)e(simpler)g(grammar)e(notation)120
+3941 y(that)33 b(is)f(v)m(ery)i(close)f(to)g(ordinary)f(BNF.)44
+b(Section)33 b(5)g(summarizes)f(the)h(functional)e(in)m(terface)i(of)
+120 4061 y(Zebu)j(and)g(explains)f(ho)m(w)i(a)e(parser)h(can)g(b)s(e)g
+(customized.)53 b(Section)36 b(6)f(describ)s(es)i(ho)m(w)g(lexical)120
+4181 y(analysis)32 b(can)h(b)s(e)g(extended)h(using)e(regular)g
+(expressions)i(and)f(parameterization.)p 120 5017 1440
+4 v 232 5078 a Fl(3)269 5108 y Fh(Re\014ne)27 b Fk(is)g(a)h(trademark)e
+(of)h(Reasoning)f(Systems,)i(P)n(alo)e(Alto.)232 5178
+y Fl(4)269 5208 y Fh(Zebu)i Fk(runs)f(on)g(a)g(MacIn)n(tosh)g(in)h
+(MacIn)n(tosh)e(Common)i(Lisp.)232 5277 y Fl(5)269 5308
+y Fh(Zebu)52 b Fk(can)g(b)r(e)h(obtained)f(via)g(anon)n(ymous)f(ftp)i
+(from)f(ftp.cs.cm)n(u.edu)h(as)f(a)g(compressed)f(tar)h(\014le:)120
+5407 y(/user/ai/lang/lisp/co)r(de/zebu/zebu-???.tar.gz.)31
+b(It)d(con)n(tains)e(sev)n(eral)g(example)h(grammar)f(de\014nitions.)
+1896 5656 y Fu(4)p eop
+%%Page: 5 5
+5 4 bop 120 407 a Ft(2)161 b(The)53 b(Represen)l(tations)f(of)i
+(Grammars)f(in)h(Files)120 704 y Fg(2.1)135 b(Grammar)46
+b(notation)120 937 y Fu(W)-8 b(e)31 b(\014rst)h(describ)s(e)f(the)h(n)m
+(ull-grammar,)27 b(whic)m(h)k(is)g(a)g(p)s(o)m(w)m(erful)g(but)g(v)m
+(erb)s(ose)h(w)m(a)m(y)g(to)f(sp)s(ecify)g(a)120 1057
+y(grammar.)43 b(Only)33 b(a)g(parser)g(and)h(optionally)c(a)j(domain)e
+(will)g(b)s(e)j(generated)f(but)h(an)f(unparser)120 1178
+y(\(prin)m(ter\))f(will)f(not.)43 b(If)33 b(this)f(is)h(desired,)g(y)m
+(ou)g(m)m(ust)g(use)h(the)f(notation)e(of)h(the)h(meta-grammar)120
+1298 y("zebu-mg")f(whic)m(h)h(is)f(describ)s(ed)h(in)f(section)65
+b(4.)266 1466 y(Non-terminals)21 b(are)j(represen)m(ted)i(b)m(y)e(sym)m
+(b)s(ols,)h(terminals)d(\(also)g(referred)j(to)e(as)g(k)m(eyw)m(ords\))
+120 1586 y(b)m(y)33 b(strings.)44 b(There)34 b(are)e(the)h(follo)m
+(wing)d(op)s(en)j(classes)g(of)f(non-terminals)2878 1550
+y Fn(6)2916 1586 y Fu(:)283 1870 y Ff(identifier)j Fu(::=)d
+Fe(h)p Fu(lisp)f(sym)m(b)s(ol)p Fe(i)283 1991 y Ff(number)239
+b Fu(::=)32 b Fe(h)p Fu(in)m(teger)p Fe(i)283 2111 y
+Ff(keyword)188 b Fu(::=)32 b Fe(h)p Fu(string)p Fe(i)120
+2231 y Fu(where)283 2352 y Fe(h)p Fu(in)m(teger)p Fe(i)177
+b Fu(::=)32 b Fe(h)p Fu(digit)p Fe(i)n Fu(*)283 2472
+y Fe(h)p Fu(string)p Fe(i)222 b Fu(::=)32 b(")h Fe(h)p
+Fu(c)m(haracter)p Fe(i)p Fu(*)f(")266 2756 y(A)48 b Fe(h)p
+Fu(lisp)32 b(sym)m(b)s(ol)p Fe(i)47 b Fu(ma)m(y)g(b)s(e)i(quali\014ed)e
+(b)m(y)i(a)f(pac)m(k)-5 b(age)48 b(name,)k(e.g.)90 b
+Ff(zb:cons-1-3)51 b Fu(is)c(a)120 2877 y(v)-5 b(alid)41
+b(iden)m(ti\014er.)75 b(In)43 b(case)h(pac)m(k)-5 b(ages)44
+b(should)f(b)s(e)h(disallo)m(w)m(ed)e(during)g(lexical)f(analysis,)46
+b(the)120 2997 y(v)-5 b(ariable)33 b Ff(*disallow-packages*)39
+b Fu(should)c(b)s(e)f(b)s(ound)h(to)f Fd(true)p Fu(.)50
+b(\(It)35 b(defaults)f(to)g Fd(false)p Fu(\).)49 b(The)120
+3117 y(alphab)s(etic)37 b(case)i(of)e(a)h(k)m(eyw)m(ord)i(is)e(not)f
+(signi\014can)m(t)h(if)f(the)h(v)-5 b(ariable)36 b Ff(*case-sensitive*)
+42 b Fu(is)120 3238 y Fd(false)32 b Fu(\(the)h(default\))f(when)h(the)g
+(grammar)e(is)h(loaded.)266 3405 y(If)c(alphab)s(etic)e(case)j(of)e
+(iden)m(ti\014ers)h(is)f(to)g(b)s(e)h(preserv)m(ed,)j
+Ff(*preserve-case*)h Fu(should)27 b(b)s(e)h(set)120 3526
+y(to)k Fd(true)p Fu(.)44 b(Other)33 b(categories)f(can)h(b)s(e)g
+(de\014ned)h(as)f(regular)e(expressions)k(\(see)e(6.2\).)120
+3840 y Fs(2.1.1)112 b(Grammar)37 b(Rules)120 4074 y(Grammar)25
+b(Rule)g(Syn)m(tax)99 b Fu(A)22 b(grammar)f(\014le)h(consists)h(of)f(a)
+h(header)g(\(the)g(\\options)f(list",)h(see)120 4194
+y(section)62 b(3.1\))30 b(follo)m(w)m(ed)g(b)m(y)h(one)g(or)g(more)f
+(domain)f(de\014nitions)h(or)g(grammar)f(rules.)43 b(The)31
+b(non-)120 4314 y(terminal)h(de\014ned)k(b)m(y)g(the)e(\014rst)h
+(grammar)e(rule)h(is)g(also)f(the)i Fd(start-symb)-5
+b(ol)69 b Fu(of)34 b(the)h(grammar.)120 4435 y(A)e(parser)g(will)d
+(accept)k(exactly)f(the)g(strings)f(that)g(rewrite)h(to)f(the)h
+Fd(start-symb)-5 b(ol)p Fu(.)266 4602 y(This)31 b(example)e(sho)m(ws)j
+(ho)m(w)f(a)f(BNF-lik)m(e)f(rule)h(can)g(b)s(e)h(enco)s(ded)g(as)f(a)g
+Fq(Zebu)g Fu(grammar)e(rule)120 4723 y(\(using)k(the)h(n)m
+(ull-grammar\):)265 5007 y Fe(\017)49 b Fu(BNF)32 b(rule)g(example)578
+5217 y Fe(h)p Fu(A)p Fe(i)h Fu(::=)f Fe(h)p Fu(B)p Fe(i)g(j)g(h)p
+Fu(C)p Fe(i)h(h)p Fu(n)m(um)m(b)s(er)p Fe(i)f(j)h Fu(\\fo)s(o")e
+Fe(h)p Fu(A)p Fe(i)h(j)g Fu(\\c")g Fe(j)h(h)p Fu(the-empt)m(y-string)p
+Fe(i)p 120 5316 1440 4 v 232 5377 a Fl(6)269 5407 y Fk(The)28
+b(Kleene)f(*)g(indicates)h(0)f(or)g(more)f(o)r(ccurrences)g(of)i(the)g
+(preceding)f(constituen)n(t)1896 5656 y Fu(5)p eop
+%%Page: 6 6
+6 5 bop 265 407 a Fe(\017)49 b Fq(Zebu)32 b Fu(n)m(ull-grammar)d
+(example:)364 667 y Ff(\(defrule)53 b(A)825 788 y(:=)f(B)1282
+b(;)52 b(\(1\))825 908 y(:=)g(\(C)g(NUMBER\))822 b(;)52
+b(\(2\))825 1028 y(:=)g(\("foo")h(A\))872 b(;)52 b(\(3\))825
+1149 y(:=)g("c")1180 b(;)52 b(\(4\))825 1269 y(:=)g(\(\))1231
+b(;)52 b(\(5\))825 1389 y(\))266 1679 y Fu(The)45 b(rule)f(describ)s
+(es)h(5)f(pro)s(ductions,)i(all)c(deriving)h(the)i(non-terminal)c
+Ff(A)p Fu(.)j(Eac)m(h)h(of)f(the)120 1800 y(pro)s(ductions)36
+b(has)g(the)h(left-hand)e(side)h Ff(A)p Fu(.)g(The)h(righ)m(t-hand)e
+(side)i(of)e(\(1\))h(consists)h(of)e(just)i(one)120 1920
+y(constituen)m(t,)32 b(the)f(non-terminal)e Ff(B)p Fu(.)i(\(2\))f(has)i
+(a)e(righ)m(t-hand)g(of)h(length)f(2,)h(and)h(its)e(second)i(con-)120
+2040 y(stituen)m(t)i(is)f(the)g(non-terminal)e Ff(NUMBER)k
+Fu(\(whic)m(h)f(rewrites)f(to)g(an)m(y)h(in)m(teger,)g(real)e(or)h
+(rational\).)120 2161 y(\(3\))38 b(is)g(a)h(recursiv)m(e)h(pro)s
+(duction.)61 b(\(4\))38 b(con)m(tains)h(just)g(the)g(terminal)d(\(or)i
+(k)m(eyw)m(ord\))j Ff("c")p Fu(.)62 b(\(5\))120 2281
+y(deriv)m(es)34 b(the)f(empt)m(y)g(string.)266 2449 y(None)42
+b(of)f(these)i(pro)s(ductions)e(has)h(a)g(seman)m(tic)f(action)f(attac)
+m(hed.)72 b(By)42 b(default,)h(the)f(se-)120 2569 y(man)m(tic)35
+b(action)g(is)h(the)g Ff(identity)i Fu(function)e(if)f(the)i(righ)m
+(t-hand)e(side)h(of)f(the)i(rule)f(consists)g(of)120
+2690 y(a)30 b(single)g(constituen)m(t)i(and)e(the)i Ff(identity*)h
+Fu(function)d(otherwise.)43 b(\()p Ff(identity*)33 b
+Fu(is)e(de\014ned)h(as)120 2810 y(the)h(function)f(that)g(returns)i
+(all)c(its)i(argumen)m(ts)h(as)g(a)f(list.\))120 3129
+y Fs(Grammar)f(Rule)g(Seman)m(tic)f(Actions)97 b Fu(If)27
+b(w)m(e)i(w)m(an)m(t)f(to)g(attac)m(h)f(other)h(than)g(these)h(default)
+120 3250 y(seman)m(tic)j(actions,)h(w)m(e)g(ha)m(v)m(e)h(to)e(use)i(a)e
+Ff(:build)i Fu(clause)f(after)f(a)h(pro)s(duction.)266
+3417 y(The)h(build)d(clause)i(has)g(the)g(syn)m(tax:)120
+3707 y Fe(h)p Fu(build)e(clause)p Fe(i)i Fu(::=)f Ff(:build)i
+Fu(\()p Fe(h)p Fu(lisp)d(function)p Fe(i)h(h)p Fu(argumen)m(t)g(list)p
+Fe(i)n Fu(\))120 3828 y Fe(h)p Fu(build)f(clause)p Fe(i)i
+Fu(::=)f Ff(:build)i Fe(h)p Fu(atomic)d(lisp)g(form)p
+Fe(i)120 3948 y(h)p Fu(build)g(clause)p Fe(i)i Fu(::=)f
+Ff(:build)i Fu(\()p Ff(:form)g Fe(h)p Fu(lisp)d(form)p
+Fe(i)o Fu(\))120 4068 y Fe(h)p Fu(build)g(clause)p Fe(i)i
+Fu(::=)f Ff(:build)i Fu(\()p Ff(:type)g Fe(h)p Fu(struct-t)m(yp)s(e)p
+Fe(i)1275 4189 y Ff(:map)85 b Fu(\(\()p Fe(h)p Fu(non-terminal)p
+Fe(i)29 b Fu(.)44 b Fe(h)p Fu(Slot)p Fe(i)n Fu(\)*\)\))266
+4478 y(The)34 b(\014rst)f(case)364 4739 y Ff(:build)h
+Fu(\()p Fe(h)p Fu(lisp)d(function)p Fe(i)h(h)p Fu(argumen)m(t)g(list)p
+Fe(i)n Fu(\))266 4999 y(is)41 b(lik)m(e)g(a)h(function)f(call.)69
+b(It)42 b(ma)m(y)f(con)m(tain)g(free)h(v)-5 b(ariable)40
+b(o)s(ccurrences.)73 b(These)43 b(will)d(b)s(e)120 5119
+y(b)s(ound)28 b(to)f(the)i(non-terminal)c(constituen)m(ts)k(of)e(the)h
+(same)g(name)f(o)s(ccurring)h(in)f(the)h(righ)m(t-hand)120
+5240 y(side)33 b(of)f(the)h(pro)s(duction)f(at)g(the)h(time)e(of)h
+(applying)f(the)i(seman)m(tic)g(action.)266 5407 y(In)g(the)g(second)h
+(case)1896 5656 y(6)p eop
+%%Page: 7 7
+7 6 bop 364 407 a Ff(:build)34 b Fe(h)p Fu(atomic)c(lisp)i(form)p
+Fe(i)266 672 y Fu(the)k Fe(h)p Fu(atomic)31 b(lisp)g(form)p
+Fe(i)j Fu(m)m(ust)h(b)s(e)h(a)f(function.)51 b(It)35
+b(will)e(b)s(e)j(applied)e(to)h(the)h(constituen)m(ts)120
+792 y(of)e(the)h(righ)m(t-hand)e(side.)50 b(This)34 b(function)g
+(should)g(ha)m(v)m(e)i(the)f(same)f(n)m(um)m(b)s(er)h(of)f(argumen)m
+(ts)h(as)120 913 y(the)e(righ)m(t-hand)f(side)g(of)g(the)h(corresp)s
+(onding)g(pro)s(duction)f(has)h(constituen)m(ts.)266
+1080 y(Since)i(it)f(happ)s(ens)i(often,)f(that)g(only)f(some)g(of)h
+(the)g(constituen)m(ts)h(of)e(the)h(righ)m(t-hand)f(side)120
+1201 y(are)23 b(selected,)j(or)d(com)m(bined,)i(a)e(few)h(useful)f
+(seman)m(tic)g(actions)g(ha)m(v)m(e)h(b)s(een)g(prede\014ned)h(in)d
+Fq(Zebu)p Fu(.)3680 1164 y Fn(7)266 1368 y Fu(An)35 b(example)g(for)f
+(suc)m(h)i(a)f(prede\014ned)h(action)e(is)h(the)g(function)f
+Ff(cons-2-3)j Fu(whic)m(h)e(tak)m(es)h(3)120 1489 y(argumen)m(ts)d(and)
+f(returns)i(a)e Fd(c)-5 b(ons)32 b Fu(of)g(its)g(second)i(and)f(third)f
+(argumen)m(t.)266 1656 y(The)g(third)e(form)g(of)g(the)h
+Ff(:build)i Fu(clause)e(is)f(just)h(a)g(long)f(w)m(a)m(y)i(to)e(write)h
+(the)g(\014rst)g(form,)f(i.e.)364 1921 y Ff(:build)k
+Fu(\()p Fe(h)p Fu(lisp)d(function)p Fe(i)h(h)p Fu(argumen)m(t)g(list)p
+Fe(i)n Fu(\))266 2186 y(is)g(the)h(same)g(as)364 2451
+y Ff(:build)h Fu(\()p Ff(:form)g Fu(\()p Fe(h)p Fu(lisp)d(function)p
+Fe(i)h(h)p Fu(argumen)m(t)g(list)p Fe(i)n Fu(\)\))266
+2716 y(Similarly)-8 b(,)364 3013 y Ff(:build)34 b Fu(\(progn)e
+Fe(h)p Fu(atomic)f(lisp)g(form)p Fe(i)o Fu(\))266 3310
+y(is)h(the)h(same)g(as)364 3607 y Ff(:build)h Fu(\()p
+Ff(:form)g Fe(h)p Fu(atomic)c(lisp)i(form)p Fe(i)n Fu(\))266
+3904 y(The)i(last)e Ff(:build)i Fu(clause)f(is)f(more)f(in)m
+(teresting:)608 4169 y Ff(:build)j Fu(\()p Ff(:type)g
+Fe(h)p Fu(struct-t)m(yp)s(e)p Fe(i)986 4289 y Ff(:map)85
+b Fu(\(\()p Fe(h)p Fu(Non)m(terminal)p Fe(i)30 b Fu(.)43
+b Fe(h)p Fu(Slot)p Fe(i)o Fu(\)*\)\))266 4554 y(where)50
+b Fe(h)p Fu(struct-t)m(yp)s(e)p Fe(i)e Fu(is)g(a)g(sym)m(b)s(ol)f(that)
+h(m)m(ust)g(b)s(e)h(the)f(name)g(of)f(a)h(structure)h(t)m(yp)s(e)3652
+4518 y Fn(8)3693 4554 y Fu(.)120 4674 y(Instead)37 b(of)f(ha)m(ving)g
+(to)f(write)h(the)h(seman)m(tic)f(action)f(as)h(a)g(constructing)g
+(form,)g(w)m(e)h(just)g(ha)m(v)m(e)120 4795 y(to)k(sp)s(ecify)i(the)f
+(t)m(yp)s(e)h(and)f(the)g(mapping)e(of)h(non-terminals)f(to)h(slots,)j
+(as)e(in)f(the)i(follo)m(wing)120 4915 y(example)470
+4879 y Fn(9)509 4915 y Fu(:)p 120 5017 1440 4 v 232 5078
+a Fl(7)269 5108 y Fk(These)79 b(seman)n(tic)g(actions)f(\()p
+Fc(cons-1-3)41 b(cons-2-3)f(empty-seq)g(empty-set)g(k-2-1)i(k-2-2)f
+(k-3-2)120 5208 y(k-4-3)h(identity*)d(seq-cons)i(set-cons)p
+Fk(\))24 b(are)j(describ)r(ed)g(in)h(the)g(\014le)g
+("zebu-actions.lisp".)232 5277 y Fl(8)269 5308 y Fk(a)g(t)n(yp)r(e)f
+(de\014ned)h(b)n(y)g Fc(defstruct)c Fk(or)i Fc(defclass)p
+Fk(.)232 5377 y Fl(9)269 5407 y Fk(\(tak)n(en)i(from)f(the)h(grammar)e
+(named)h(\\p)r(c1";)g(see)g(the)h(\014le)g(\\p)r(c1.zb")e(in)i(the)g
+(test)g(directory\))1896 5656 y Fu(7)p eop
+%%Page: 8 8
+8 7 bop 120 407 a Ff(\(defrule)53 b(Boolean-Expr)581
+527 y(:=)f(\(Formula.1)i("and")f(Formula.2\))581 648
+y(:build)g(\(:type)g(Boolean-And)992 768 y(:map)f(\(\(Formula.1)i(.)103
+b(:-rand1\))1299 888 y(\(Formula.2)54 b(.)103 b(:-rand2\)\)\))581
+1129 y(:=)52 b(\(Formula.1)i("or")e(Formula.2\))581 1249
+y(:build)h(\(:type)g(Boolean-Or)992 1370 y(:map)f(\(\(Formula.1)i(.)103
+b(:-rand1\))1299 1490 y(\(Formula.2)54 b(.)103 b(:-rand2\)\)\))581
+1611 y(\))266 2122 y Fu(The)41 b(map)e(indicates)g(that)g(the)h(slot)f
+Ff(-rand1)i Fu(is)e(to)g(b)s(e)h(\014lled)f(b)m(y)h(the)g(v)-5
+b(alue)39 b(of)g(the)h(non-)120 2243 y(terminal)30 b
+Ff(Formula.1)p Fu(,)35 b(etc.)266 2410 y(This)f(example)e(also)h(mak)m
+(es)h(use)g(of)f(the)g Ff(".n")h Fu(notation:)44 b(If)33
+b(on)g(the)h(righ)m(t-hand)e(side)h(of)g(a)120 2531 y(pro)s(duction)e
+(a)h(non)m(terminal)e(o)s(ccurs)i(rep)s(eatedly)-8 b(,)33
+b(w)m(e)g(distinguish)d(it)h(b)m(y)i(app)s(ending)e Ff(".")i
+Fu(and)120 2651 y(a)f(digit,)f(to)h(the)h(non)m(terminal)e(\(e.g.)i
+Ff(Formula.1)p Fu(\).)266 2819 y(The)45 b(function)f
+Ff(print-actions)k Fu(applied)43 b(to)h(the)g(name)g(of)g(a)g(grammar)d
+(ma)m(y)j(b)s(e)h(used)120 2939 y(to)d(\014nd)i(out)f(what)g(the)g
+(generated)h(co)s(de)f(for)f(the)h(seman)m(tic)g(actions)f(lo)s(oks)g
+(lik)m(e,)j(e.g.)e(after)120 3060 y(compiling)29 b(the)k(sample)f
+(grammar)e Ff(``pc1.zb'')p Fu(:)120 3571 y Ff(\(print-actions)55
+b("pc1"\))120 3812 y(...)120 3932 y(Rule:)e(BOOLEAN-EXPR)120
+4053 y(\(LAMBDA)g(\(FORMULA.1)h(DUMMY)f(FORMULA.2\))530
+4173 y(\(DECLARE)h(\(IGNORE)f(DUMMY\)\))530 4294 y(\(MAKE-BOOLEAN-AND)j
+(:-RAND1)d(FORMULA.1)h(:-RAND2)f(FORMULA.2\)\))120 4414
+y(\(LAMBDA)g(\(FORMULA.1)h(DUMMY)f(FORMULA.2\))530 4534
+y(\(DECLARE)h(\(IGNORE)f(DUMMY\)\))530 4655 y(\(MAKE-BOOLEAN-OR)j
+(:-RAND1)d(FORMULA.1)g(:-RAND2)h(FORMULA.2\)\))120 4775
+y(...)266 5287 y Fu(These)30 b(seman)m(tic)e(actions)g(ha)m(v)m(e)i(b)s
+(een)f(generated)g(from)e(the)i Ff(:build)h Fu(clauses)f(of)e(the)i(ab)
+s(o)m(v)m(e)120 5407 y(rule)j(for)g Ff(Boolean-Expr)p
+Fu(.)1896 5656 y(8)p eop
+%%Page: 9 9
+9 8 bop 120 407 a Ft(3)161 b(Grammar)53 b(Options)120
+1372 y Fg(3.1)135 b(Keyw)l(ord)46 b(Argumen)l(ts)f(to)h(Grammar)f
+(Construction)120 2274 y Fu(Some)40 b(global)e(information)f(to)j(con)m
+(trol)g(grammar)e(compilation,)h(lexical)f(analysis,)k(and)f(the)120
+2394 y(generation)e(of)h(seman)m(tic)g(actions)f(is)h(declared)g(in)f
+(the)i(b)s(eginning)e(of)g(a)h(grammar)e(\014le)3480
+2358 y Fn(10)3554 2394 y Fu(.)66 b(A)120 2515 y(grammar)41
+b(\014le)i(m)m(ust)h(b)s(egin)e(with)h(a)g(list)f(of)h(alternating)e(k)
+m(eyw)m(ords)46 b(and)e(argumen)m(ts.)76 b(The)120 2635
+y(follo)m(wing)30 b(k)m(eyw)m(ords)35 b(are)e(v)-5 b(alid:)p
+120 5316 1440 4 v 199 5377 a Fl(10)269 5407 y Fk(A)28
+b(grammar)e(\014le)i(has)f(the)h(default)g(t)n(yp)r(e)g(".zb".)1896
+5656 y Fu(9)p eop
+%%Page: 10 10
+10 9 bop 316 391 a Fm(:name)839 b Fu(a)32 b(string,)g(the)h(name)f(of)g
+(the)h(grammar)d(to)j(b)s(e)f(de\014ned.)316 512 y Fm(:pac)m(k)-5
+b(age)745 b Fu(a)22 b(string,)h(the)g(name)f(of)g(the)g(pac)m(k)-5
+b(age)23 b(where)h(the)e(non-terminal)1392 632 y(sym)m(b)s(ols)33
+b(and)i(the)f(function)g(sym)m(b)s(ols)g(used)h(in)e(seman)m(tic)h(ac-)
+1392 753 y(tions)e(reside.)316 873 y Fm(:iden)m(ti\014er-start-c)m
+(hars)246 b Fu(a)41 b(string.)69 b(During)40 b(lexical)f(analysis)i(an)
+m(y)h(c)m(haracter)g(in)f(this)1392 993 y(string)36 b(can)i(start)f(an)
+h Ff(identifier)i Fu(non-terminal.)55 b(The)39 b(de-)1392
+1114 y(fault)31 b(is)h Ff(*identifier-start-chars*)p
+Fu(.)316 1234 y Fm(:iden)m(ti\014er-con)m(tin)m(ue-c)m(hars)100
+b Fu(a)41 b(string.)69 b(During)40 b(lexical)f(analysis)i(an)m(y)h(c)m
+(haracter)g(in)f(this)1392 1355 y(string)34 b(can)i(con)m(tin)m(ue)g
+(an)f Ff(identifier)j Fu(\(i.e.)51 b(c)m(haracters)37
+b(not)1392 1475 y(in)45 b(this)h(string)f(terminate)g
+Ff(identifier)p Fu(\).)87 b(The)47 b(default)e(is)1392
+1595 y Ff(*identifier-continue-chars*)q Fu(.)316 1716
+y Fm(:in)m(tern-iden)m(ti\014er)432 b Fd(true)p Fu(,)47
+b(if)42 b(the)j(iden)m(ti\014er)e(is)g(to)h(b)s(e)g(returned)h(as)e(an)
+h(in)m(terned)1392 1836 y(Lisp)38 b(sym)m(b)s(ol,)i(or)f
+Fd(false)g Fu(if)f(the)h(iden)m(ti\014er)g(is)g(to)f(b)s(e)i(returned)
+1392 1956 y(as)32 b(a)h(string)f(\(default)f Fd(true)p
+Fu(\).)316 2077 y Fm(:string-delimiter)436 b Fu(a)40
+b(c)m(haracter,)k(the)d(c)m(haracter)h(that)f(delimits)d(a)j(string)f
+(to)g(b)s(e)1392 2197 y(represen)m(ted)35 b(as)d(a)h
+Fq(Common)f(Lisp)h Fu(string.)43 b(\(default)32 b Ff(#\\")p
+Fu(\))316 2318 y Fm(:sym)m(b)s(ol-delimiter)383 b Fu(a)40
+b(c)m(haracter,)k(the)d(c)m(haracter)h(that)f(delimits)d(a)j(string)f
+(to)g(b)s(e)1392 2438 y(represen)m(ted)35 b(as)d(a)h
+Fq(Common)f(Lisp)h Fu(sym)m(b)s(ol.\(default)e Ff(#\\')p
+Fu(\))316 2558 y Fm(:domain)757 b Fu(a)45 b(list,)i(represen)m(ting)g
+(the)f(t)m(yp)s(e)g(hierarc)m(h)m(y)g(of)f(the)h(domain.)1392
+2679 y(See)33 b(section)g(3.2)f(b)s(elo)m(w.)316 2799
+y Fm(:domain-\014le)610 b Fu(a)57 b(string)h(naming)e(the)j(\014le)f
+(where)h(the)g(generated)g(Com-)1392 2919 y(mon)33 b(Lisp)h(program)f
+(that)h(implemen)m(ts)e(the)j(domain)e(will)e(b)s(e)1392
+3040 y(stored.)42 b(De\014nitions)26 b(of)g(functions)h(for)g(seman)m
+(tic)g(actions)g(and)1392 3160 y(regular)i(expression)j(for)e(lexical)f
+(categories)h(are)g(k)m(ept)i(here)f(as)1392 3281 y(w)m(ell.)73
+b(This)43 b(string)g(defaults)f(to)h(the)g(concatenation)g(of)f(the)
+1392 3401 y(grammar's)30 b(:name)j(and)f(\\-domain".)316
+3521 y Fm(:grammar)692 b Fu(a)21 b(string,)i(b)m(y)g(default:)37
+b Ff("null-grammar")p Fu(,)28 b(naming)20 b(the)i(gram-)1392
+3642 y(mar)j(to)i(b)s(e)f(used)i(to)f(parse)g(the)g(grammar)e
+(de\014ned)j(in)e(this)g(\014le.)1392 3762 y(If)h(the)g(grammar)e
+Ff("zebu-mg")30 b Fu(is)d(used,)i(an)e(unparser)i(will)c(also)1392
+3883 y(b)s(e)32 b(generated.)316 4003 y Fm(:lex-cats)751
+b Fu(an)35 b(asso)s(ciation)e(list)h(of)h(terminal)e(category)i(names)h
+(and)f(reg-)1392 4123 y(ular)c(expressions)j(\(see)g(section)f(6.2\).)
+316 4244 y Fm(:white-space)591 b Fu(a)33 b(list)f(of)h(c)m(haracters)i
+(eac)m(h)f(of)f(whic)m(h)h(will)d(b)s(e)j(ignored)f(b)s(efore)1392
+4364 y(a)f(tok)m(en,)h(\(default)f Ff(\(#\\Space)54 b(#\\Newline)105
+b(#\\Tab\))p Fu(\))316 4484 y Fm(:case-sensitiv)m(e)525
+b Fd(true)27 b Fu(if)e(the)i(case)h(of)e(k)m(eyw)m(ords)k(is)c
+(signi\014can)m(t,)h Fd(false)f Fu(otherwise)1392 4605
+y(\(default)31 b Fd(false\).)120 4932 y Fg(3.2)135 b(De\014ning)45
+b(a)h(Domain)120 5166 y Fu(The)g Ff(:domain)h Fu(k)m(eyw)m(ord)g(is)d
+(used)j(to)d(sp)s(ecify)i(a)e(t)m(yp)s(e)i(hierarc)m(h)m(y)-8
+b(.)82 b(This)45 b(sp)s(eci\014cation)f(will)120 5287
+y(expand)e(in)m(to)d Ff(defstruct)k Fu(forms)d(that)g(implemen)m(t)f
+(this)h(hierarc)m(h)m(y)-8 b(.)68 b(It)41 b(is)f(also)f(p)s(ossible)h
+(to)120 5407 y(write)33 b(suc)m(h)j(structure)f(de\014nitions)e
+(directly)g(in)m(to)g(the)h(grammar)d(\014le.)47 b(The)35
+b(argumen)m(t)e(to)h(the)1871 5656 y(10)p eop
+%%Page: 11 11
+11 10 bop 120 407 a Ff(:domain)34 b Fu(k)m(eyw)m(ord)h(argumen)m(t)d(m)
+m(ust)h(b)s(e)g(a)f(list)f(of)h(the)h(follo)m(wing)d(form:)283
+677 y(\()p Fe(h)p Fu(Ro)s(ot)h(Struct)p Fe(i)283 797
+y Ff(:subtype)j Fe(h)p Fu(Struct)f(Desc)p Fe(i)283 917
+y Ff(:subtype)h Fe(h)p Fu(Struct)f(Desc)p Fe(i)283 1038
+y Fu(...\))283 1279 y Fe(h)p Fu(Ro)s(ot)e(Struct)p Fe(i)i
+Fu(::=)f Fe(h)p Fu(Sym)m(b)s(ol)p Fe(i)283 1519 y(h)p
+Fu(Struct)g(Desc)p Fe(i)h Fu(::=)g Fe(h)p Fu(Sym)m(b)s(ol)p
+Fe(i)e(j)1053 1640 y Fu(\()h Fe(h)p Fu(Sym)m(b)s(ol)p
+Fe(i)f Ff(:slots)k Fu(\()p Fe(h)p Fu(Slot)p Fe(i)n Fu(*\))d(\))h
+Fe(j)1053 1760 y Fu(\()f Fe(h)p Fu(Sym)m(b)s(ol)p Fe(i)f
+Ff(:slots)k Fu(\()p Fe(h)p Fu(Slot)p Fe(i)n Fu(*\))1550
+1881 y Ff(:subtype)g Fe(h)p Fu(Struct)e(Desc)p Fe(i)1550
+2001 y Ff(:subtype)i Fe(h)p Fu(Struct)e(Desc)p Fe(i)1053
+2121 y Fu(...)44 b(\))283 2362 y Fe(h)p Fu(Slot)p Fe(i)31
+b Fu(::=)h Fe(h)p Fu(Sym)m(b)s(ol)p Fe(i)f(j)h Fu(\()h
+Fe(h)p Fu(Slot)e(Name)p Fe(i)h(h)p Fu(Filler)d(T)m(yp)s(e)p
+Fe(i)34 b Fu(\))283 2482 y Fe(h)p Fu(Filler)29 b(T)m(yp)s(e)p
+Fe(i)34 b Fu(::=)e Fe(h)p Fu(Sym)m(b)s(ol)g(naming)f(t)m(yp)s(e)p
+Fe(i)266 2752 y Fu(This)22 b(describ)s(es)h(the)f(syn)m(tax)i(for)d
+(declaring)f(a)i(t)m(yp)s(e)g(hierarc)m(h)m(y)h(with)e(ro)s(ot)g(no)s
+(de)h Fe(h)p Fu(Ro)s(ot)31 b(Struct)p Fe(i)p Fu(.)120
+2873 y(A)f(no)s(de)g(of)f(the)i(hierarc)m(h)m(y)f(tree)h(can)f(ha)m(v)m
+(e)h(c)m(hildren,)f(denoted)h(b)m(y)g Ff(:subtype)h Fu(follo)m(w)m(ed)d
+(b)m(y)i(the)120 2993 y(structure)j(description)e(of)g(the)h(c)m(hild)e
+(no)s(de.)44 b(Eac)m(h)34 b(no)s(de)e(can)h(ha)m(v)m(e)h(slots,)e
+(describ)s(ed)h(as)g(a)f(list)120 3113 y(follo)m(wing)g
+Ff(:slots)p Fu(.)53 b(A)36 b(c)m(hild)e(no)s(de)h(inherits)g(the)g
+(slots)g(of)g(its)g(paren)m(t)g(no)s(de.)52 b(The)36
+b(v)-5 b(alue)35 b(of)f(a)120 3234 y(slot)e(can)h(b)s(e)f(t)m(yp)s
+(e-restricted)i(to)e Fe(h)p Fu(Filler)e(T)m(yp)s(e)p
+Fe(i)q Fu(.)266 3401 y Fe(h)p Fu(Ro)s(ot)i(Struct)p Fe(i)k
+Fu(will)e(b)s(e)i(implemen)m(ted)e(as)j(a)e(structure)j(t)m(yp)s(e)f
+(directly)e(b)s(elo)m(w)h(the)g(prede-)120 3522 y(\014ned)42
+b(structure)h(t)m(yp)s(e)f Ff(kb-domain)p Fu(,)k(i.e.)41
+b(\()p Ff(kb-domain-p)j Fu(x\))d(is)g Fd(true)h Fu(for)f(an)m(y)h
+(instance)f(of)g(a)120 3642 y(subt)m(yp)s(e)34 b(of)e
+Fe(h)p Fu(Ro)s(ot)g(Struct)p Fe(i)p Fu(.)43 b(kb-domain)31
+b(is)i(the)g(top)f(of)g(the)h(domain)e(hierarc)m(h)m(y)-8
+b(.)266 3810 y(The)39 b(t)m(yp)s(e)g Ff(kb-sequence)i
+Fu(is)c(already)h(prede\014ned)i(as)e(a)f(subt)m(yp)s(e)j(of)e
+(kb-domain.)58 b(It)38 b(has)120 3930 y(the)33 b(slots)f
+Ff(first)i Fu(and)f Ff(rest)p Fu(.)266 4098 y(Similarly)-8
+b(,)35 b(t)m(yp)s(es)k Ff(number)p Fu(,)i Ff(string)p
+Fu(,)g(and)d Ff(identifier)i Fu(are)e(prede\014ned)h(as)f(subt)m(yp)s
+(es)i(of)120 4218 y(kb-domain.)266 4386 y(Tw)m(o)c(ob)5
+b(jects)37 b(of)d(t)m(yp)s(e)i(kb-domain)e(can)h(b)s(e)h(compared)e
+(for)h(equalit)m(y)g(with)f(the)i(functions)120 4506
+y Ff(kb-equal)f Fu(and)d Ff(kb-compare)p Fu(.)120 4776
+y Ff(kb-equal)j Fd(a)d(b)2682 b(function)266 5046 y(a)40
+b Fu(and)g Fd(b)g Fu(are)f(assumed)i(to)f(b)s(e)g(of)f(t)m(yp)s(e)i
+(kb-domain.)64 b(If)39 b(they)i(are)f Ff(equal)h Fu(they)g(are)f(also)
+120 5166 y Ff(kb-equal)p Fu(.)77 b(But)43 b(in)g(con)m(trast)g(to)g
+Ff(equal)h Fu(it)e(is)h(p)s(ossible)f(to)h(de\014ne)i(whic)m(h)e(slots)
+g(are)g(to)g(b)s(e)120 5287 y(examined)35 b(b)m(y)g Ff(kb-equal)i
+Fu(when)f(comparing)e(the)h(comp)s(onen)m(ts)g(of)g Fd(a)f
+Fu(and)h Fd(b)p Fu(.)50 b(These)37 b(relev)-5 b(an)m(t)120
+5407 y(slots)28 b(are)f(called)g Fd(tr)-5 b(e)g(e)31
+b(attributes)p Fu(,)e(and)f(the)g(macro)f Ff(def-tree-attributes)33
+b Fu(is)27 b(used)i(to)f(de\014ne)1871 5656 y(11)p eop
+%%Page: 12 12
+12 11 bop 120 407 a Fu(these)37 b(for)e(a)g(particular)f(t)m(yp)s(e.)54
+b(The)36 b(rationale)e(for)h(ha)m(ving)g(this)g(equalit)m(y)h(relation)
+d(is)j(that)f(it)120 527 y(is)29 b(often)h(useful)f(to)g(store)h
+(commen)m(ts)g(or)f(auxiliary)e(information)f(with)j(the)h(feature)g
+(structures)120 648 y(pro)s(duced)j(b)m(y)h(parsing.)266
+815 y(In)i(feature)g(structures)i(the)e(v)-5 b(alue)35
+b(of)g(a)g(relev)-5 b(an)m(t)36 b(feature)g(\(or)f(slot\))g(ma)m(y)h(b)
+s(e)f(declared)h(to)120 936 y(b)s(e)j(a)f(set)h(\(using)f
+Ff(def-tree-attributes)p Fu(\).)66 b(If)39 b(a)f(slot)g(has)h(b)s(een)g
+(declared)g(set-v)-5 b(alued,)40 b(the)120 1056 y Ff(kb-equal)28
+b Fu(comparison)c(will)f(use)k(set)f(equalit)m(y)f(for)g(v)-5
+b(alues)26 b(of)f(that)g(slot)g(\(represen)m(ted)j(as)e(lists\).)120
+1324 y Ff(def-tree-attributes)38 b Fd(typ)-5 b(e)32 b(slot1)h(slot2)f
+Fu(..)1612 b Fd(macr)-5 b(o)266 1591 y Ff(def-tree-attributes)29
+b Fu(de\014nes)c Fd(slot1)e(slot2)g Fu(.)16 b(.)g(.)g(as)24
+b(tree)g(attributes)f(for)g(instances)h(of)f(t)m(yp)s(e)120
+1712 y Fd(typ)-5 b(e)p Fu(.)266 1879 y(If)32 b Fd(slot)f
+Fu(is)g(a)g(sym)m(b)s(ol,)g(this)g(sym)m(b)s(ol)f(is)h(de\014ned)i(as)e
+(a)g(tree)h(attribute.)43 b(Otherwise)32 b Fd(slot)f
+Fu(m)m(ust)120 2000 y(b)s(e)42 b(of)f(the)i(form)d(\()p
+Fd(symb)-5 b(ol)42 b Fu(:set\).)72 b(As)42 b(b)s(efore,)j(the)d
+Fd(symb)-5 b(ol)41 b Fu(b)s(ecomes)i(a)e(tree-attribute,)j(and)120
+2120 y(furthermore)32 b(it)g(is)g(declared)h(set-v)-5
+b(alued.)120 2426 y Fs(Example)38 b(domain)h(de\014nition)97
+b Fu(The)35 b(grammar)d(de\014ned)j(in)f(\\p)s(c1.zb")g(accepts)i(a)d
+(simple)120 2547 y(prop)s(ositional)d(calculus)i(language)f(with)h(sen)
+m(tences)k(suc)m(h)e(as)364 2791 y Ff(walks\(agent:)106
+b(John\))p Fu(,)120 3036 y(whic)m(h)30 b(yields)f(the)h(follo)m(wing)d
+(abstract)j(syn)m(tax)i(\(prin)m(ted)d(out)h(using)f(the)h
+Fq(Common)g(Lisp)g Fu(struc-)120 3157 y(ture)j(prin)m(ter\):)223
+3424 y Ff(#S\(ATOMIC-WFF)54 b(-PREDICATE)g(WALKS)940
+3545 y(-ROLE-ARGUMENT-PAIRS)j(#S\(ROLE-ARGUMENT-PAIR)2171
+3665 y(-ROLE)52 b(AGENT)2171 3785 y(-ARGUMENT)h(JOHN\))g(\))266
+4053 y Fu(The)28 b(t)m(yp)s(es)h(|)e(suc)m(h)h(as)g Ff(ATOMIC-WFF)i
+Fu(and)d Ff(ROLE-ARGUMENT-PAIR)32 b Fu(|)27 b(are)g(de\014ned)h(b)m(y)h
+(the)120 4173 y(follo)m(wing)h(domain)h(declaration:)120
+4441 y Ff(:domain)53 b(\(PC)f(;;)g(PC)g(is)g(the)g(root)g(type)g(of)g
+(the)g(hierarchy)581 4562 y(:subtype)i(\(Formula)1094
+4682 y(:subtype)f(\(Propositional-variable)58 b(:slots)53
+b(\(-name\)\))1094 4802 y(:subtype)g(\(Boolean-Expr)1555
+4923 y(:slots)g(\(\(-rand1)h(Formula\))1966 5043 y(\(-rand2)f
+(Formula\)\))1555 5164 y(:subtype)h(Boolean-Or)1555 5284
+y(:subtype)g(Boolean-And\)\))581 5404 y(:subtype)g(\(Boolean-Op)g
+(:slots)f(\(-name\)\))1871 5656 y Fu(12)p eop
+%%Page: 13 13
+13 12 bop 581 407 a Ff(:subtype)54 b(\(Atomic-Wff)1094
+527 y(:slots)f(\(-predicate)1504 648 y(\(-Role-Argument-Pairs)k
+(KB-Sequence\)\)\))581 768 y(:subtype)d(\(Role-Argument-Pair)i(:slots)d
+(\(-Role)g(-Argument\)\))581 888 y(\))266 1220 y Fu(Note)33
+b(the)g(use)h(of)e(the)i(prede\014ned)g(t)m(yp)s(e)g(KB-Sequence.)46
+b(It)33 b(is)f(used)i(to)e(construct)i(the)f(list)120
+1340 y(of)f(Role-Argumen)m(t-P)m(airs)f(in)h(the)h(follo)m(wing)c
+(rule:)120 1672 y Ff(\(defrule)53 b(Role-Argument-Pairs)223
+1792 y(:=)e(\(\))223 2033 y(:=)g(\(Role-Argument-Pair)57
+b(Role-Argument-Pairs\))223 2154 y(:build)52 b(\(:type)h(KB-Sequence)
+633 2274 y(:map)103 b(\(\(Role-Argument-Pair)108 b(.)52
+b(:first\))992 2394 y(\(Role-Argument-Pairs)k(.)c(:rest\)\)\))223
+2515 y(\))120 3063 y Ft(4)161 b(The)53 b Fb(Zebu)i Ft(Meta)f(Grammar)
+120 3339 y Fu(Using)36 b("zebu-mg")g(as)h(the)g Ff(:grammar)i
+Fu(argumen)m(t)d(in)g(the)h(grammar)d(options)i(indicates)g(that)120
+3460 y(the)44 b(follo)m(wing)e(grammar)f(is)j(to)f(b)s(e)h(prepro)s
+(cessed)i(with)e(the)g(grammar)e(\\zebu-mg")h(b)s(efore)120
+3580 y(compilation.)266 3748 y(The)23 b(adv)-5 b(an)m(tages)23
+b(of)e(the)i(meta-grammar)18 b(\(v)m(ersus)24 b(the)f(default)e(n)m
+(ull-grammar\))d(are)k(a)g(more)120 3868 y(concise)29
+b(represen)m(tation)h(of)f(rules,)g(automatic)e(generation)i(of)f(the)h
+(functions)g(that)g(implemen)m(t)120 3988 y(the)23 b(seman)m(tic)g
+(actions)f(and)h(rev)m(ersibilit)m(y)f(of)h(the)g(grammar)e
+(\(generation)h(of)g(prin)m(ting)g(functions)120 4109
+y({)32 b(the)h(unparser\).)266 4277 y(The)27 b(disadv)-5
+b(an)m(tage)26 b(of)g(using)g("zebu-mg")f(is)g(that)h(the)h(seman)m
+(tics)f(is)g(limited)d(to)i(construct-)120 4397 y(ing)i(t)m(yp)s(ed)j
+(feature)e(structures.)44 b(But)29 b(these)g(ha)m(v)m(e)h(great)e
+(expressiv)m(e)j(p)s(o)m(w)m(er,)f(and)e(furthermore)120
+4517 y(could)21 b(subsequen)m(tly)k(b)s(e)d(transformed)g(in)m(to)f
+(some)h(other)g(program.)38 b(T)m(yp)s(ed)24 b(feature)e(structures)120
+4638 y(are)40 b(ideally)e(suited)i(to)g(presen)m(t)i(abstract)e(syn)m
+(tax.)68 b(The)41 b(fact)f(that)f(uni\014cation,)i(sp)s(ecializa-)120
+4758 y(tion)28 b(and)h(generalization)d(are)j(w)m(ell)f(de\014ned)i(op)
+s(erations)e(on)g(feature)i(structures,)h(mak)m(es)e(them)120
+4878 y(appropriate)37 b(for)g(further)h(transformations)d(\(b)m(y)k
+(e.g.)f Fq(Zebu-RR)p Fu(\).)e(F)-8 b(or)37 b(an)h(in)m(tro)s(duction)e
+(in)m(to)120 4999 y(feature)d(structures)h(see)g([5].)266
+5166 y(Since)d(there)h(is)e(a)g(restricted)i(w)m(a)m(y)g(of)e
+(expressing)i(the)f(seman)m(tics)g(of)f(a)h(rule)f({)g(namely)g(as)h(a)
+120 5287 y(t)m(yp)s(ed)h(feature)f(structure)h({)f(the)g(grammar)e
+(compiler)g(will)f(b)s(e)k(able)e(to)g(generate)i(co)s(de)f(for)g(the)
+120 5407 y(domain)g(hierarc)m(h)m(y)i(and)g(prin)m(t-functions)f(asso)s
+(ciated)g(with)g(eac)m(h)i(t)m(yp)s(e)f(of)f(that)h(domain.)1871
+5656 y(13)p eop
+%%Page: 14 14
+14 13 bop 266 407 a Fu("zebu-mg")32 b(is)g(de\014ned)i(in)e(terms)g(of)
+h(the)g(n)m(ull-grammar)28 b(describ)s(ed)34 b(ab)s(o)m(v)m(e)3137
+371 y Fn(11)3212 407 y Fu(.)120 712 y Fs(BNF)j(description)f(of)i
+(\\zebu-mg":)364 952 y Fe(h)p Fu(Zebu-Grammar)p Fe(i)238
+b Fu(::=)33 b Fe(h)p Fu(Options)p Fe(i)f(h)p Fu(Domain-Defn)p
+Fe(i)l Fu(*)g Fe(h)p Fu(zb-rule)p Fe(i)364 1072 y(h)p
+Fu(Domain-Defn)p Fe(i)325 b Fu(::=)33 b Fe(h)p Fu(T)m(yp)s(e-name)p
+Fe(i)g Ff(":=")g Fe(h)p Fu(F)-8 b(eat-T)g(erm)p Fe(i)1502
+1193 y Fu([)33 b Ff("<<")g Fu("prin)m(t-function:")e(Iden)m(ti\014er)i
+Ff(">>")h Fu(])e Ff(";")364 1313 y Fe(h)p Fu(zb-rule)p
+Fe(i)604 b Fu(::=)33 b Fe(h)p Fu(Non-terminal)p Fe(i)c
+Ff("-->")34 b Fe(h)p Fu(Rhs)p Fe(i)f Ff(";")364 1433
+y Fe(h)p Fu(Rhs)p Fe(i)733 b Fu(::=)33 b Fe(h)p Fu(Rhs1)p
+Fe(i)f(h)p Fu(More-Rhs)p Fe(i)h(j)f(h)p Fu(Kleene-Rhs)p
+Fe(i)364 1554 y(h)p Fu(Rhs1)p Fe(i)684 b Fu(::=)33 b
+Fe(h)p Fu(Constituen)m(t)p Fe(i)p Fu(*)g([)f Ff(")p Fe(f)p
+Ff(")h Fe(h)p Fu(Seman)m(tics)p Fe(i)f Ff(")p Fe(g)p
+Ff(")h Fu(])364 1674 y Fe(h)p Fu(Constituen)m(t)p Fe(i)396
+b Fu(::=)33 b Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)g(j)f(h)p
+Fu(String)p Fe(i)364 1795 y(h)p Fu(More-Rhs)p Fe(i)481
+b Fu(::=)33 b Fe(j)f(h)p Fu(Rhs1)p Fe(i)g(h)p Fu(More-Rhs)p
+Fe(i)364 1915 y(h)p Fu(Seman)m(tics)p Fe(i)471 b Fu(::=)33
+b Fe(h)p Fu(F)-8 b(eat-T)g(erm)p Fe(i)266 2275 y Fu(A)33
+b Fe(h)p Fu(F)-8 b(eat-T)g(erm)p Fe(i)31 b Fu(is)h(a)g(t)m(yp)s(ed)i
+(attribute)e(v)-5 b(alue)32 b(matrix.)364 2515 y Fe(h)p
+Fu(F)-8 b(eat-T)g(erm)p Fe(i)453 b Fu(::=)33 b([)p Fe(h)p
+Fu(T)m(yp)s(e-name)p Fe(i)g Fu(":"])f Fe(h)p Fu(Conj)p
+Fe(i)364 2635 y(h)p Fu(Conj)p Fe(i)694 b Fu(::=)33 b
+Ff("[")g Fe(h)p Fu(Lab)s(el-v)-5 b(alue-pair)p Fe(i)29
+b Fu(*)j Ff("]")364 2756 y Fe(h)p Fu(Lab)s(el-v)-5 b(alue-pair)p
+Fe(i)204 b Fu(::=)33 b Ff("\(")g Fe(h)p Fu(Iden)m(ti\014er)p
+Fe(i)g(h)p Fu(F)-8 b(eat-T)g(erm)p Fe(i)31 b Ff("\)")364
+2876 y Fe(h)p Fu(T)m(yp)s(e-name)p Fe(i)418 b Fu(::=)33
+b Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)266 3116 y(h)p Fu(Options)p
+Fe(i)f Fu(is)g(describ)s(ed)h(in)f(section)h(3.)266 3284
+y(This)g(BNF-notation)e(mak)m(es)i(use)g(of)239 3524
+y(1.)49 b(star)33 b(\(*\))f(for)g(0)g(or)g(more)g(rep)s(etitions)g(of)g
+(the)h(preceding)g(constituen)m(t)239 3723 y(2.)49 b(bar)32
+b(\()p Fe(j)p Fu(\))g(for)g(alternation)239 3923 y(3.)49
+b(brac)m(k)m(ets)34 b(\([]\))f(for)f(marking)f(the)i(enclosed)g
+(constituen)m(ts)h(as)f(optional)239 4123 y(4.)49 b(a)32
+b(quotation)g(sym)m(b)s(ol)g(\("\))g(for)g(delimiting)d(k)m(eyw)m(ords)
+266 4363 y(The)38 b(ab)s(o)m(v)m(e)g(de\014nition)e(is)g(somewhat)h(o)m
+(v)m(ersimpli\014ed,)g(since)h(it)e(do)s(es)h(not)g(deal)f(with)h(the)
+120 4483 y(".n")45 b(notation)e(for)h Fe(h)p Fu(Constituen)m(t)p
+Fe(i)q Fu(:)68 b(if)44 b(on)g(the)i(righ)m(t-hand)e(side)h(of)f(a)h
+(pro)s(duction)f(a)g(non-)120 4604 y(terminal)28 b(o)s(ccurs)k(rep)s
+(eatedly)-8 b(,)31 b(w)m(e)h(can)f(distinguish)f(the)h(o)s(ccurrences)h
+(b)m(y)g(app)s(ending)e(".")h(and)120 4724 y(a)25 b(digit)e(to)i(the)g
+(iden)m(ti\014er.)41 b(The)26 b(seman)m(tics)f(can)h(then)f(unam)m
+(biguously)f(refer)i(to)e(an)h(o)s(ccurrence)120 4844
+y(of)32 b(a)g(constituen)m(t.)266 5012 y(The)38 b(seman)m(tics)f(is)g
+(describ)s(ed)h(as)f(a)g(t)m(yp)s(ed)h(feature)f(structure.)58
+b(Names)37 b(of)g(v)-5 b(ariables)36 b(o)s(c-)120 5132
+y(curring)i(in)g(feature)h(term)f(p)s(osition)f(corresp)s(ond)j(to)e
+(constituen)m(t)h(names)g(in)f(the)h(righ)m(t-hand)p
+120 5216 1440 4 v 199 5277 a Fl(11)269 5308 y Fk(Y)-7
+b(ou)36 b(ma)n(y)f(study)h(the)g(de\014nition)g(of)f(the)h(meta)g
+(grammar)d(in)j(terms)f(of)h(the)g(n)n(ull-grammar)d(in)j(the)g(\014le)
+120 5407 y("zebu-mg.zb".)1871 5656 y Fu(14)p eop
+%%Page: 15 15
+15 14 bop 120 407 a Fu(side)35 b(of)f(the)h(rule.)50
+b(The)36 b(e\013ect)f(of)g(applying)e(a)i(rule)f(is)g(to)h(instan)m
+(tiate)f(a)g(feature)h(structure)h(of)120 527 y(the)d(t)m(yp)s(e)g
+(describ)s(ed)h(in)e(the)h(rule)f(seman)m(tics,)h(substituting)f(v)-5
+b(ariables)31 b(with)h(their)g(v)-5 b(alues.)266 695
+y(If)28 b(the)g(relation)e(b)s(et)m(w)m(een)j(seman)m(tics)f(and)g(syn)
+m(tax)h(is)e(one-to-one,)h(the)g(in)m(v)m(erse)h(of)e(a)g(parser,)120
+815 y(a)32 b(prin)m(ter,)h(can)g(b)s(e)f(generated.)120
+1150 y Fg(4.1)135 b(Domain)46 b(De\014nition)120 1382
+y Fu(Although)37 b(it)h(is)f(p)s(ossible)h(to)g(sp)s(ecify)g(the)h
+(hierarc)m(h)m(y)g(of)f(domain)e(t)m(yp)s(es)k(using)e(the)g
+Ff(:domain)120 1502 y Fu(k)m(eyw)m(ord)45 b(as)e(in)f(section)h(3.2,)i
+(a)d(more)h(con)m(v)m(enien)m(t)h(syn)m(tax)h(is)d(o\013ered)h(b)m(y)h
+(the)f(meta)f(ab)s(o)m(v)m(e)120 1623 y(grammar)30 b(rule)i
+Fe(h)p Fu(Domain-Defn)p Fe(i)m Fu(.)266 1790 y(The)i(t)m(yp)s(e)f
+(de\014nition)364 2034 y Fd(atyp)-5 b(e)33 b Fu(:=)f
+Fd(sup)-5 b(er)p Fu(:)43 b([\()p Fr(s)1155 2049 y Fn(1)1195
+2034 y Fu(\))32 b(...)44 b(\()p Fr(s)1474 2049 y Fa(n)1521
+2034 y Fu(\)];)120 2277 y(will)30 b(de\014ne)k(the)f(t)m(yp)s(e)h
+Fd(atyp)-5 b(e)32 b Fu(inheriting)f(from)g Fd(sup)-5
+b(er)p Fu(,)33 b(and)f(ha)m(ving)h(slots)f Fr(s)2956
+2292 y Fn(1)3028 2277 y Fu(through)g Fr(s)3442 2292 y
+Fa(n)3489 2277 y Fu(.)364 2543 y Fd(atyp)-5 b(e)33 b
+Fu(:=)f([\()p Fr(s)862 2558 y Fn(1)901 2543 y Fu(\))h(...)44
+b(\()p Fr(s)1181 2558 y Fa(n)1227 2543 y Fu(\)];)120
+2809 y(is)27 b(as)i(ab)s(o)m(v)m(e)f(but)g(de\014nes)i(the)e(t)m(yp)s
+(e)h Fd(atyp)-5 b(e)28 b Fu(as)g(a)g(subt)m(yp)s(e)i(of)d(the)h(top)g
+(t)m(yp)s(e)h(named)f Ff(kb-domain)p Fu(.)266 2977 y(A)33
+b(slot)f(ma)m(y)g(b)s(e)h(t)m(yp)s(e)g(restricted)g(as)g(in:)364
+3220 y Fd(atyp)-5 b(e)33 b Fu(:=)f Fd(sup)-5 b(er)p Fu(:)43
+b([\()p Fr(s)1155 3235 y Fn(1)1227 3220 y Ff(KB-sequence)p
+Fu(\)];)120 3463 y(whic)m(h)g(restricts)g Fr(s)840 3478
+y Fn(1)921 3463 y Fu(to)f(b)s(e)h(of)e(t)m(yp)s(e)j Ff(KB-sequence)p
+Fu(.)75 b(An)43 b(optional)d Fd(print-function)i Fu(ma)m(y)g(b)s(e)120
+3584 y(sp)s(eci\014ed,)34 b(as)e(in)364 3850 y Fd(atyp)-5
+b(e)33 b Fu(:=)f Fd(sup)-5 b(er)p Fu(:)43 b([\()p Fr(s)1155
+3865 y Fn(1)1195 3850 y Fu(\)])32 b Ff(<<)h(print-function:)48
+b Fd(print-atyp)-5 b(e)32 b Ff(>>)p Fu(;)120 4115 y(Here)44
+b(w)m(e)g(supply)g(for)f Fd(atyp)-5 b(e)43 b Fu(its)f(o)m(wn)i(prin)m
+(ter)f(called)f Fd(print-atyp)-5 b(e)43 b Fu(and)h(no)f(prin)m(ter)g
+(will)e(b)s(e)120 4236 y(generated)30 b(for)g Fd(atyp)-5
+b(e)p Fu(.)42 b(Usually)29 b(it)g(is)g(not)g(necessary)j(to)e(pro)m
+(vide)g(a)f(prin)m(t-function,)g(but)h(if)f(the)120 4356
+y(grammar)h(is)i(am)m(biguous,)g(this)g(is)g(a)h(w)m(a)m(y)g(to)g
+(force)f(a)h(particular)e(canonical)g(unparser.)120 4691
+y Fg(4.2)135 b(Example)46 b(Grammars)120 4923 y Fs(Example)36
+b(Grammar)h(for)h(Arithmetic)c(Expressions)120 5166 y
+Ff(\(:name)53 b("arith-exp")h(:grammar)f("zebu-mg"\))120
+5407 y(;;)f(Domain)h(definition)1871 5656 y Fu(15)p eop
+%%Page: 16 16
+16 15 bop 120 527 a Ff(Arith-exp)54 b(:=)d(Kb-domain:)j([];)120
+648 y(Factor)207 b(:=)51 b(Arith-exp:)j([\(-value\)])g
+(<<print-function:)i(Print-factor>>;)120 768 y(Mult-op)156
+b(:=)51 b(Arith-exp:)j([\(-arg1\))g(\(-arg2\)];)120 888
+y(Plus-op)156 b(:=)51 b(Arith-exp:)j([\(-arg1\))g(\(-arg2\)];)120
+1129 y(;;)e(Productions)120 1370 y(EE)g(-->)103 b(EE)52
+b("+")g(TT)g({)f(Plus-op:)j([\(-arg1)f(EE\))f(\(-arg2)h(TT\)])f(})530
+1490 y(|)103 b(TT)52 b(;)120 1731 y(TT)g(-->)g(TT)g("*")g(F)154
+b({)51 b(Mult-op:)j([\(-arg1)f(TT\))f(\(-arg2)h(F\)])f(})479
+1851 y(|)f(F)h(;)120 2092 y(F)g(-->)103 b("\(")52 b(EE)g("\)")411
+b({)51 b(factor:)i([\(-value)h(EE\)])e(})479 2213 y(|)f(IDENTIFIER)311
+b({)51 b(factor:)i([\(-value)h(IDENTIFIER\)])g(})479
+2333 y(|)d(NUMBER)515 b({)51 b(factor:)i([\(-value)h(NUMBER\)])f(})f(;)
+266 2685 y Fu(The)32 b(seman)m(tics)e(of)g(the)h(\014rst)g(rule)f(sa)m
+(ys)h(that)f(an)h(ob)5 b(ject)31 b(of)f(t)m(yp)s(e)h
+Ff(+-op)g Fu(should)g(b)s(e)f(created)120 2806 y(with)i(slot)g
+Ff(-arg1)i Fu(\014lled)d(with)h(the)h(v)-5 b(alue)33
+b(of)f Ff(EE)h Fu(and)f Ff(-arg2)i Fu(\014lled)e(with)g(the)h(v)-5
+b(alue)32 b(of)g Ff(TT)p Fu(.)120 3110 y Fs(Example)59
+b(Grammar)h(for)g(Prop)s(ositional)e(Calculus)97 b Fu(This)52
+b(grammar)e(de\014nes)55 b(the)120 3230 y(same)32 b(domain)f(as)i(ab)s
+(o)m(v)m(e)g(\(3.2\).)43 b(Compiling)30 b(it)h(generates)j(a)e(parser)i
+(and)e(a)h(generator.)120 3601 y Ff(\(:name)53 b("pc2")171
+3722 y(:package)h("CL-USER")171 3842 y(:grammar)g("zebu-mg"\))120
+4083 y(;;)e(Domain)h(definition)120 4324 y(Formula)g(:=)f(kb-domain:)i
+([];)171 4565 y(Propositional-variable)j(:=)52 b(Formula:)i([\(-name\))
+f(];)171 4685 y(P-Formula)720 b(:=)52 b(Formula:)i([\(-content\))g(];)
+171 4805 y(Boolean-Expr)567 b(:=)52 b(Formula:)i([\(-rand1)f(Formula\))
+g(\(-rand2)g(Formula\)];)325 4926 y(Boolean-Or)515 b(:=)52
+b(Boolean-Expr:)j([];)325 5046 y(Boolean-And)464 b(:=)52
+b(Boolean-Expr:)j([];)171 5166 y(Atomic-Wff)669 b(:=)52
+b(Formula:)i([\(-predicate\))2017 5287 y(\(-Role-Argument-Pairs)j
+(kb-sequence\)];)1871 5656 y Fu(16)p eop
+%%Page: 17 17
+17 16 bop 120 407 a Ff(Role-Argument-Pair)56 b(:=)c(kb-domain:)i
+([\(-Role\))f(\(-Argument\)];)120 648 y(;;)f(Productions)120
+888 y(Formula)h(-->)f(Propositional-variable)735 1009
+y(|)g(Boolean-Expr)735 1129 y(|)g("\(")g(Formula)h("\)")f
+({P-Formula:[\(-content)57 b(Formula\)]})735 1249 y(|)52
+b(Atomic-Wff;)120 1490 y(Propositional-Variable)223 1611
+y(-->)g(Identifier)i({Propositional-variable:)j([\(-name)c
+(Identifier\)]};)120 1851 y(Boolean-Expr)h(-->)f(Formula.1)g("and")g
+(Formula.2)992 1972 y({Boolean-And:)h([\(-rand1)g(Formula.1\))1761
+2092 y(\(-rand2)f(Formula.2\)]})940 2333 y(|)f(Formula.1)h("or")g
+(Formula.2)1043 2453 y({Boolean-Or:)h([\(-rand1)g(Formula.1\))1761
+2574 y(\(-rand2)f(Formula.2\)]};)120 2814 y(Atomic-Wff)h(-->)e
+(Identifier)i("\(")e(Role-Argument-Pairs)k("\)")889 2935
+y({)c(Atomic-Wff:)992 3055 y([\(-predicate)i(Identifier\))1043
+3176 y(\(-Role-Argument-Pairs)j(Role-Argument-Pairs\)]};)120
+3416 y(Role-Argument-Pairs)f(-->)428 3537 y(|)51 b(Role-Argument-Pair)
+56 b(Role-Argument-Pairs)530 3657 y({)c(RAP-list:)h([\(-first)h
+(Role-Argument-Pair\))1197 3778 y(\(-rest)104 b
+(Role-Argument-Pairs\)]};)120 4018 y(Role-Argument-Pair)56
+b(-->)428 4139 y(Identifier)e(":")e(Term)428 4259 y
+({Role-Argument-Pair:)k([\(-Role)d(Identifier\))1555
+4379 y(\(-Argument)h(Term\)]};)120 4620 y(Term)e(-->)104
+b(Identifier)54 b(|)d(Number)i(;)1871 5656 y Fu(17)p
+eop
+%%Page: 18 18
+18 17 bop 120 407 a Fg(4.3)135 b(The)45 b(Kleene)h(*)f(Notation)120
+639 y Fu(The)33 b(meta-grammar)c(\\zebu-mg")i(pro)m(vides)i(an)f
+(abbreviated)g(notation)f(for)g(rep)s(eated)i(o)s(ccur-)120
+759 y(rences)h(of)e(a)h(non-terminal,)d(separated)j(b)m(y)h(a)e(k)m
+(eyw)m(ord.)46 b(The)33 b(syn)m(tax)h(for)e(this)h(is:)445
+1021 y Fe(h)p Fu(Kleene-Rhs)p Fe(i)170 b Fu(::=)32 b
+Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)h Ff(*)g Fe(h)p Fu(String)p
+Fe(i)1115 b Fu(\(1\))445 1141 y Fe(h)p Fu(Kleene-Rhs)p
+Fe(i)170 b Fu(::=)32 b Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)h
+Ff(+)g Fe(h)p Fu(String)p Fe(i)1115 b Fu(\(2\))266 1523
+y(The)42 b(meaning)d(of)h(\(1\))h(is)f(that)g(0)h(or)f(more)g(o)s
+(ccurrences)j(of)d(the)h(constituen)m(t)h(named)e(b)m(y)120
+1643 y Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)45 b Fu(and)h(separated)g(b)m
+(y)g Fe(h)p Fu(String)p Fe(i)e Fu(will)f(b)s(e)i(accepted)i(b)m(y)f
+(this)f(rule,)j(and)d(that)h(the)120 1764 y(sequence)j(of)d(the)h
+(results)f(of)g(these)i(constituen)m(ts)f(will)d(b)s(e)i(returned)i(as)
+e(the)h(seman)m(tics)f(of)120 1884 y Fe(h)p Fu(Kleene-Rhs)p
+Fe(i)p Fu(.)c(The)31 b(meaning)d(of)i(\(2\))f(is)h(the)g(same,)g
+(except)i(that)d(at)h(least)f(one)h(o)s(ccurrence)h(of)120
+2004 y(the)i(constituen)m(t)g(has)g(to)f(b)s(e)h(found.)266
+2172 y(The)h(seman)m(tics)f(of)g(a)f Fe(h)p Fu(Kleene-Rhs)p
+Fe(i)h Fu(pro)s(duction)f(is)h(an)f(implicit)d(kb-sequence)36
+b(construc-)120 2292 y(tion.)46 b(The)34 b(Kleene-constituen)m(t)h(\()p
+Fe(h)p Fu(Iden)m(ti\014er)p Fe(i)e Fu(concatenated)i(with)e
+Ff(*)h Fu(or)g Ff(+)p Fu(\))f(is)h(b)s(ound)g(in)f(the)120
+2413 y(seman)m(tics)g(of)f(the)h(pro)s(duction,)f(e.g.)120
+2674 y Ff(Disjunction)54 b(-->)e(Conjunction+)j("|")940
+2795 y({Disj:)e([\(-terms)h(Conjunction+\)]};)266 3177
+y Fu(builds)42 b(a)f(structure)j(of)d(t)m(yp)s(e)i Ff(Disj)h
+Fu(with)d(the)i Ff(-terms)g Fu(slot)f(\014lled)f(b)m(y)i(the)f(v)-5
+b(alue)42 b(of)g(the)120 3297 y(Kleene-constituen)m(t)33
+b Ff(Conjunction+)p Fu(.)120 3602 y Fs(Example)j(grammar)h(using)g
+(Kleene)g(*)h(Notation)120 3963 y Ff(\(:name)53 b("mini-la")h(:grammar)
+f("zebu-mg")h(\))120 4203 y(;;)e(Domain)h(definition)120
+4444 y(Program)g(:=)f([\(-stmts)h(kb-sequence\)];)120
+4565 y(Application)h(:=)e([\(-function\))i(\(-args)f(kb-sequence\)];)
+120 4805 y(;;)f(rules)120 5046 y(Program)h(-->)f("begin")h(Stmt+)g(";")
+f("end")786 5166 y({)g(Program:)h([\(-stmts)h(Stmt+\)])f(})e(;)120
+5407 y(Stmt)206 b(-->)52 b(Identifier)i(|)e(Appl)g(|)g(Program)h(;)1871
+5656 y Fu(18)p eop
+%%Page: 19 19
+19 18 bop 120 527 a Ff(Appl)206 b(-->)52 b(Identifier)i("\(")e(Arg*)h
+(")e(")h("\)")786 648 y({Application:)j([\(-function)f(Identifier\))h
+(\(-args)d(Arg*\)]};)120 888 y(Arg)257 b(-->)52 b(Identifier)i(|)e
+(Number)h(|)e(Appl)h(;)266 1261 y Fu(Compiling)38 b(this)j(grammar)e
+(generates)j(a)f(parser/unparser)i(\(i.e.)e(the)g(prin)m(ting)f
+(routines)120 1381 y(are)33 b(generated)g(automatically\).)120
+1660 y Ff(\(zb:read-parser)55 b("begin)e(A;)f(B)f(;)h(C)g(end")940
+1780 y(:grammar)i(\(zb:find-grammar)h("mini-la"\)\))266
+2178 y Fu(returns)34 b(a)e(structure)i(of)e(t)m(yp)s(e)i
+Ff(PROGRAM)g Fu(whic)m(h)f(is)f(prin)m(ted)h(in)f(the)h(syn)m(tax)h(of)
+e(\\mini-la":)120 2457 y Ff(begin)53 b(A;B;C)f(end)120
+2577 y(>)g(\(describe)h(*\))120 2697 y(begin)g(A;B;C)f(end)g(is)g(a)g
+(structure)h(of)f(type)g(PROGRAM.)120 2818 y(It)g(has)g(1)f(slot,)i
+(with)f(the)g(following)i(values:)171 2938 y(-STMTS:)1130
+b(A;B;C)120 3179 y(\(describe)54 b(\(PROGRAM--STMTS)h(*\)\))120
+3299 y(A;B;C)e(is)e(a)h(structure)i(of)d(type)i(KB-SEQUENCE.)120
+3420 y(It)f(has)g(2)f(slots,)i(with)g(the)f(following)h(values:)171
+3540 y(FIRST:)1181 b(A)171 3660 y(REST:)1232 b(B)52 b(C)120
+4163 y Ft(5)161 b(Using)54 b(the)f(Compiler)120 4459
+y Fg(5.1)135 b(Compiling)46 b(a)g(grammar)120 4691 y
+Fu(The)36 b Fq(Zebu)p Fu(-compiler)924 4655 y Fn(12)1032
+4691 y Fu(can)f(b)s(e)h(called)e(using)h(an)m(y)h(of)f(the)g
+(functions:)49 b Ff(zebu-compile-file)p Fu(,)120 4811
+y Ff(compile-slr-grammar)p Fu(,)38 b Ff(compile-lalr1-grammar)p
+Fu(.)120 5090 y Ff(zebu-compile-file)2466 b Fd(function)770
+5210 y(gr)-5 b(ammar-\014le)31 b Ff(&key)j Fd(output-\014le)f(gr)-5
+b(ammar)31 b(verb)-5 b(ose)p 120 5316 1440 4 v 199 5377
+a Fl(12)269 5407 y Fk(F)e(or)27 b(installation)g(see)h(app)r(endix)f
+(A.)1871 5656 y Fu(19)p eop
+%%Page: 20 20
+20 19 bop 266 407 a Fu(This)25 b(compiles)f(the)h(LALR\(1\))f(grammar)e
+(in)i(a)h(\014le)f(named)h Fd(gr)-5 b(ammar-\014le)p
+Fu(.)39 b(The)26 b Fd(output-\014le)120 527 y Fu(defaults)31
+b(to)g(a)g(\014le)g(with)g(the)h(same)f(name)g(as)g Fd(gr)-5
+b(ammar-\014le)30 b Fu(but)h(t)m(yp)s(e)i(")p Ff(tab)p
+Fu(".)43 b(The)32 b(grammar)120 648 y(used)26 b(for)e(compilation)e
+(defaults)i(to)h(the)g(n)m(ull-grammar.)37 b(If)25 b
+Fd(verb)-5 b(ose)24 b Fu(is)g Fd(true)p Fu(,)j(con\015ict)e(w)m
+(arnings)120 768 y(will)30 b(b)s(e)j(prin)m(ted.)44 b
+Ff(zebu-compile-file)37 b Fu(returns)c(the)g(pathname)g(of)f
+Fd(output-\014le)p Fu(.)120 1074 y Fs(Example:)171 1320
+y Ff(\(let)53 b(\(\(*warn-conflicts*)j(t\))479 1441 y
+(\(*allow-conflicts*)g(t\)\))274 1561 y(\(zebu-compile-file)g
+("dangelse.zb")1248 1681 y(:output-file)e("/tmp/dangelse.tab"\)\))171
+1922 y(;)e(Zebu)g(Compiling)i(\(Version)f(2.0\))171 2042
+y(;)f("~/zebu/test/dangelse.zb")58 b(to)52 b("/tmp/dangelse.tab")171
+2283 y(Reading)h(grammar)h(from)e(dangelse.zb)171 2524
+y(Start)h(symbols)g(is:)f(S)171 2765 y(4)g(productions,)i(8)e(symbols)
+171 2885 y(.........9)i(item)f(sets)171 3006 y(.........)171
+3126 y(.........)171 3246 y(;;;)f(Warning:)i(ACTION)f(CONFLICT!!!--)h
+(state:)f(8)171 3367 y(;;;)514 b(old)52 b(entry:)h(\(6)e(:S)h(2\))103
+b(new)52 b(entry:)h(\(6)f(:R)g(2\))171 3487 y(;;;)171
+3607 y(;;;)g(Warning:)i(Continuing)g(to)d(build)i(tables)g(despite)g
+(conflicts...)171 3728 y(;;;)514 b(Will)52 b(prefer)h(old)f(entry:)h
+(\(6)f(:S)f(2\))171 3969 y(Dumping)i(parse)g(tables)g(to)f
+(/tmp/dangelse.tab)171 4089 y(#P"/tmp/dangelse.tab")120
+4358 y(*warn-conflicts*)2517 b Fd(variable)266 4628 y
+Fu(If)26 b Fd(true)g Fu(during)f(LALR-table)g(construction,)i
+(shift-reduce)f(con\015icts)g(will)e(b)s(e)i(rep)s(orted.)41
+b(By)120 4748 y(default,)32 b Ff(*warn-conflicts*)37
+b Fu(is)32 b Fd(false)p Fu(.)120 5017 y Ff(*allow-conflicts*)2466
+b Fd(variable)266 5287 y Fu(If)36 b Fd(true)g Fu(during)g(LALR-table)e
+(construction,)j(shift-reduce)f(con\015icts)g(will)e(b)s(e)i(resolv)m
+(ed)h(in)120 5407 y(fa)m(v)m(or)c(of)f(the)h(old)f(en)m(try)-8
+b(.)44 b(By)33 b(default,)f Ff(*allow-conflicts*)37 b
+Fu(is)32 b Fd(true)p Fu(.)1871 5656 y(20)p eop
+%%Page: 21 21
+21 20 bop 120 407 a Ff(*check-actions*)2568 b Fd(variable)266
+624 y Fu(If)27 b Fd(true)h Fu(the)f(seman)m(tic)g(action)f(asso)s
+(ciated)h(with)f(a)h(pro)s(duction)f(will)f(b)s(e)i(compiled)e(at)i
+(gram-)120 745 y(mar)44 b(compilation)e(time)h(in)i(order)g(to)f
+(displa)m(y)h(p)s(ossible)f(w)m(arning)h(messages.)82
+b(By)46 b(default,)120 865 y Ff(*check-actions*)37 b
+Fu(is)32 b Fd(false)p Fu(.)120 1083 y Ff(compile-slr-grammar)38
+b Fd(gr)-5 b(ammar-\014le)31 b Ff(&key)i Fd(output-\014le)g(gr)-5
+b(ammar)673 b(function)266 1300 y Fu(This)33 b(is)f(lik)m(e)g
+Ff(zebu-compile-file)p Fu(,)37 b(but)c(an)f(SLR-table)g(will)e(b)s(e)j
+(made.)266 1468 y(Example:)171 1675 y Ff(\(compile-slr-grammar)57
+b("dangelse.zb")376 1796 y(:output-file)e("/tmp/dangelse.tab"\))171
+2036 y(Reading)e(grammar)h(from)e(dangelse.zb)171 2277
+y(Start)h(symbols)g(is:)f(S)171 2518 y(4)g(productions,)i(8)e(symbols)
+171 2638 y(.........9)i(item)f(sets)171 2879 y(Dumping)g(parse)g
+(tables)g(to)f(/tmp/dangelse.tab)171 3000 y(#P"/tmp/dangelse.tab")120
+3338 y(compile-lalr1-grammar)38 b Fd(gr)-5 b(ammar-\014le)31
+b Ff(&key)j Fd(output-\014le)f(gr)-5 b(ammar)570 b(function)266
+3555 y Fu(This)33 b(is)f(lik)m(e)g Ff(zebu-compile-file)p
+Fu(,)37 b(but)c(do)s(es)g(not)f(expand)i(logical)c(pathnames.)266
+3723 y(Example:)171 3940 y Ff(\(compile-lalr1-grammar)57
+b("dangelse.zb")1350 4061 y(:output-file)e("/tmp/dangelse.tab"\))171
+4302 y(Reading)e(grammar)h(from)e(dangelse.zb)171 4542
+y(Start)h(symbols)g(is:)f(S)171 4783 y(4)g(productions,)i(8)e(symbols)
+171 4904 y(.........9)i(item)f(sets)171 5024 y(.........)171
+5144 y(.........)171 5265 y(Dumping)g(parse)g(tables)g(to)f
+(/tmp/dangelse.tab)171 5385 y(#P"/tmp/dangelse.tab")1871
+5656 y Fu(21)p eop
+%%Page: 22 22
+22 21 bop 120 407 a Fg(5.2)135 b(Loading)46 b(a)f(grammar)120
+639 y Ff(zebu-load-file)36 b Fd(\014lename)31 b Ff(&key)j
+Fd(verb)-5 b(ose)1653 b(function)266 916 y(\014lename)31
+b Fu(should)g(b)s(e)h(the)g(name)f(of)h(a)f(compiled)f(grammar)f
+(\014le,)j(i.e.)f(a)h(\014le)f(of)g(t)m(yp)s(e)i(")p
+Ff(tab)p Fu(".)120 1036 y(If)38 b(suc)m(h)h(a)e(\014le)h(can)g(b)s(e)f
+(found,)j(it)c(will)g(b)s(e)i(loaded,)g(returning)f(the)h(grammar)e(ob)
+5 b(ject)38 b(needed)120 1157 y(for)g(parsing.)59 b(In)38
+b(case)h(a)f(domain-\014le)e(w)m(as)j(generated)g(b)m(y)g(compiling)34
+b(the)39 b(grammar,)e(it)g(will)120 1277 y(also)50 b(b)s(e)g(loaded.)97
+b(The)52 b(t)m(yp)s(e)f(of)f(the)h(domain-\014le)d(is)j(the)g(\014rst)g
+(for)f(whic)m(h)h(a)f(\014le)g(named)120 1397 y Fd(\014lename)p
+Ff(-domain)p Fu(.)p Fe(h)p Fu(t)m(yp)s(e)p Fe(i)34 b
+Fu(exists,)f(b)m(y)h(examining)c(the)j(lists)364 1649
+y Ff(*load-binary-pathname-typ)q(es*)39 b Fu(and)364
+1769 y Ff(*load-source-pathname-typ)q(es*)120 2021 y
+Fu(for)32 b(.)p Fe(h)p Fu(t)m(yp)s(e)p Fe(i)h Fu(in)f(turn.)266
+2188 y(The)i(k)m(eyw)m(ord)h(argumen)m(t)d Fd(verb)-5
+b(ose)32 b Fu(defaults)g(to)g Fd(true)p Fu(.)120 2496
+y Fs(Example:)171 2748 y Ff(\(zebu-load-file)56 b
+("/tmp/dangelse.tab"\))171 2868 y(<Zebu)d(Grammar:)g(dangelse>)266
+3120 y Fu(It)36 b(is)f(p)s(ossible)g(to)g(ha)m(v)m(e)i(man)m(y)f
+(grammars)d(loaded)i(concurren)m(tly)-8 b(.)54 b(Giv)m(en)35
+b(the)h(name)f(of)g(a)120 3240 y(grammar,)30 b(one)j(can)g(\014nd)g(a)f
+(grammar)f(that)h(has)h(b)s(een)g(loaded)f(b)m(y:)120
+3517 y Ff(find-grammar)k Fd(name)2455 b(function)266
+3794 y(name)32 b Fu(m)m(ust)i(b)s(e)f(a)g(string.)44
+b(If)33 b(a)g(grammar)e(of)h(the)i(same)e(name)h(\(ignoring)e(case\))j
+(has)f(b)s(een)120 3914 y(loaded,)f(the)h(grammar)d(ob)5
+b(ject)34 b(is)e(returned,)h(else)g Fd(false)f Fu(is)g(returned.)120
+4222 y Fs(Example:)171 4474 y Ff(\(find-grammar)55 b("dangelse"\))171
+4594 y(<Zebu)e(Grammar:)g(dangelse>)120 5052 y Fg(5.3)135
+b(P)l(arsing)46 b(a)f(string)h(with)f(a)g(grammar)120
+5284 y Ff(read-parser)2772 b Fd(function)770 5404 y(string)33
+b Ff(&key)g Fd(gr)-5 b(ammar)32 b(junk-al)5 b(lowe)-5
+b(d)31 b(print-p)-5 b(arse-err)g(ors)31 b(err)-5 b(or-fn)32
+b(start)1871 5656 y Fu(22)p eop
+%%Page: 23 23
+23 22 bop 266 407 a Fu(The)29 b(argumen)m(t)e(of)g(the)h
+Ff(:grammar)i Fu(k)m(eyw)m(ord)g(defaults)d(to)g Ff(*current-grammar*)
+32 b Fu(\(initially)120 527 y(b)s(ound)h(to)f(the)h(n)m(ull-grammar\),)
+c(e.g.)283 795 y Ff(\(read-parser)54 b Fe(h)p Fd(string)p
+Fe(i)d Ff(:grammar)i(\(find-grammar)i Fe(h)p Fd(name)p
+Fe(i)n Ff(\)\))283 1036 y Fu(is)32 b(equiv)-5 b(alen)m(t)32
+b(to)283 1277 y Ff(\(setq)52 b(zebu:*current-grammar*)57
+b(\(find-grammar)e Fe(h)p Fd(name)p Fe(i)o Ff(\)\))283
+1397 y(\(read-parser)f Fe(h)p Fd(string)p Fe(i)o Ff(\))266
+1665 y(read-parser)38 b Fu(parses)f(the)f(string)e(starting)h(at)f(the)
+i(p)s(osition)e(indicated)g(b)m(y)i Ff(:start)h Fu(\(de-)120
+1786 y(fault)31 b(0\).)266 1953 y Ff(read-parser)38 b
+Fu(tak)m(es)e(the)f(k)m(eyw)m(ord)i(argumen)m(t)e Ff(:junk-allowed)p
+Fu(,)j(whic)m(h)e(if)d Fd(true)j Fu(will)c(re-)120 2074
+y(turn)d(as)h(second)h(v)-5 b(alue)28 b(an)h(index)h(to)f(the)h
+(unparsed)g(remainder)f(of)f(the)i(string)f(in)f(case)i(not)g(the)120
+2194 y(en)m(tire)j(string)f(w)m(as)h(consumed)g(b)m(y)h(the)f(parse.)
+266 2362 y(The)g(k)m(eyw)m(ord)g Ff(:junk-allowed)i Fu(has)d(the)f
+(same)g(meaning)f(as)i(in)e(the)i Fq(Common)g(Lisp)f
+Fu(func-)120 2482 y(tion)h Ff(read-from-string)p Fu(.)266
+2650 y Ff(:print-parse-errors)k Fu(con)m(trols)30 b(the)g(prin)m(ting)f
+(of)h(errors)h(during)e(parsing)h(and)g(defaults)120
+2770 y(to)i Fd(true)p Fu(.)266 2938 y Ff(:error-fn)46
+b Fu(is)d(a)h(function)f(used)i(to)e(rep)s(ort)g(errors,)k(it)c
+(defaults)g(to)g(the)h Fq(Common)g(Lisp)120 3058 y Ff(error)34
+b Fu(function.)120 3364 y Fs(Example:)171 3609 y Ff(\(read-parser)55
+b("if)d(f)f(then)i(if)e(g)h(then)g(h)g(else)g(i")838
+3729 y(:grammar)h(\(find-grammar)i("dangelse"\)\))171
+3850 y(\("if")e(F)e("then")i(\("if")g(G)e("then")i(H)f("else")h(I\)\))
+171 4091 y(\(read-parser)i("1)d(+)f(a")h(:grammar)h(\(find-grammar)i
+("ex1"\)\))171 4211 y(\(+OP)e(\(EXPRESSION)h(\(TERM)e(\(FACTOR)i
+(1\)\)\))428 4331 y(\(TERM)e(\(FACTOR)h(A\)\)\))120 4666
+y Fg(5.4)135 b(P)l(arsing)46 b(from)f(a)g(\014le)h(with)f(a)g(grammar)
+120 4898 y Ff(file-parser)35 b Fd(\014le)d Ff(&key)i
+Fd(gr)-5 b(ammar)32 b(print-p)-5 b(arse-err)g(ors)31
+b(verb)-5 b(ose)839 b(function)266 5166 y Ff(file-parser)36
+b Fu(parses)d(expressions)i(using)d(the)h(grammar)d(sp)s(eci\014ed)j(b)
+m(y)h Ff(:grammar)p Fu(,)g(read-)120 5287 y(ing)d(from)g
+Fd(\014le)p Fu(.)42 b(It)33 b(returns)f(a)g(list)f(of)g(the)i
+(parse-results,)f(i.e.)g(a)g(list)e(of)i(what)g(w)m(ould)g(ha)m(v)m(e)h
+(b)s(een)120 5407 y(returned)h(b)m(y)f Ff(read-parser)p
+Fu(.)1871 5656 y(23)p eop
+%%Page: 24 24
+24 23 bop 266 407 a Fu(The)24 b Ff(:grammar)g Fu(argumen)m(t)e
+(defaults)g(to)g Ff(*current-grammar*)27 b Fu({)22 b(whic)m(h)h
+(initially)18 b(is)k(b)s(ound)120 527 y(to)32 b(the)h(\\n)m
+(ull-grammar".)266 695 y Ff(:print-parse-errors)j Fu(con)m(trols)30
+b(the)g(prin)m(ting)f(of)h(errors)h(during)e(parsing)h(and)g(defaults)
+120 815 y(to)i Fd(true)p Fu(.)266 983 y Ff(:verbose)j
+Fu(con)m(trols)d(whether)i(prin)m(ting)d(of)i(parse-results)g(o)s
+(ccurs,)g(and)g(defaults)f(to)h Fd(true)p Fu(.)266 1150
+y(The)j(pro)s(cessing)g(of)e(commen)m(ts)h(b)m(y)h Ff(file-parser)i
+Fu(can)d(b)s(e)g(in\015uenced)h(b)m(y)g(the)g(follo)m(wing)120
+1271 y(v)-5 b(ariables:)265 1608 y Fe(\017)49 b Ff(*comment-brackets*)k
+Fu(is)47 b(a)h(list)e(of)h(brac)m(k)m(et)j(pairs.)89
+b(Ev)m(erything)49 b(b)s(et)m(w)m(een)h(an)m(y)e(of)364
+1729 y(brac)m(k)m(et)34 b(pairs)e(is)g(ignored.)43 b(Initially)29
+b Ff(*comment-brackets*)38 b Fu(is)32 b(set)h(to:)364
+1916 y Ff(\(\("#\\|")53 b(.)f("|#"\)\))p Fu(.)265 2171
+y Fe(\017)d Ff(*comment-start*)i Fu(A)c(line)f(b)s(eginning)g(with)h
+(this)g(c)m(haracter)h(is)e(ignored.)87 b(Initially)364
+2291 y Ff(*comment-start*)36 b Fu(is)c(set)i(to)e(the)h(semicolon)e(c)m
+(haracter:)44 b Ff(#\\;)120 2652 y Fs(Example:)171 2943
+y Ff(\(file-parser)55 b("sample-ex1")f(:grammar)g(\(find-grammar)g
+("ex1"\)\))171 3064 y(...)120 3453 y Fg(5.5)135 b(P)l(arsing)46
+b(from)f(a)g(list)h(of)f(tok)l(ens)120 3696 y Ff(list-parser)35
+b Fd(token-list)e Ff(&key)g Fd(gr)-5 b(ammar)32 b(junk-al)5
+b(lowe)-5 b(d)1137 b(function)266 4033 y Ff(list-parser)39
+b Fu(is)c(lik)m(e)h Ff(read-parser)i Fu(except)g(that)d(the)i(tok)m
+(ens)g(that)f(are)f(passed)j(b)m(y)f(the)120 4153 y(scanner)c(to)e(the)
+i(driv)m(er)f(are)g(already)f(giv)m(en)h(as)g(the)g(elemen)m(ts)g(of)f
+Fd(token-list)p Fu(.)43 b(This)32 b(function)f(is)120
+4274 y(useful)26 b(if)g(the)h(options)e(for)h(con)m(trolling)e(lexical)
+h(analysis)g(giv)m(en)i(in)f(section)g(3.1)g(are)g(insu\016cien)m(t.)
+120 4634 y Fs(Example:)171 4926 y Ff(\(let)53 b(\(\(*current-grammar*)j
+(\(find-grammar)f("ex1"\)\)\))325 5046 y(\(list-parser)g('\(1)d("+")g
+(x)f("*")h(y\)\)\))171 5166 y(\(+OP)h(\(EXPRESSION)h(\(TERM)e(\(FACTOR)
+i(1\)\)\))428 5287 y(\(*-OP)e(\(TERM)h(\(FACTOR)g(X\)\))f(\(FACTOR)h
+(Y\)\)\))1871 5656 y Fu(24)p eop
+%%Page: 25 25
+25 24 bop 120 407 a Fg(5.6)135 b(Debugging)46 b(a)f(grammar)120
+640 y Ff(debug-parser)36 b(&key)d Fd(gr)-5 b(ammar)32
+b(lexer)1833 b(function)120 923 y Ff(debug-parser)30
+b Fu(will)24 b(cause)k(a)e(trace)h(of)g(the)g(parser)g(to)g(b)s(e)f
+(displa)m(y)m(ed.)42 b(The)28 b Fd(gr)-5 b(ammar)26 b
+Fu(k)m(eyw)m(ord)120 1044 y(defaults)36 b(to)h Fd(true)g
+Fu(and)g Fd(lexer)f Fu(defaults)g(to)g Fd(false)p Fu(.)55
+b(If)37 b Fd(lexer)f Fu(is)g Fd(true)p Fu(,)i(more)e(information)d(ab)s
+(out)120 1164 y(lexical)e(analysis)h(\(see)h(section)g(6)f(b)s(elo)m
+(w\))h(will)d(b)s(e)j(displa)m(y)m(ed.)120 1550 y Ft(6)161
+b(Lexical)56 b(Analysis)120 1847 y Fg(6.1)135 b(Customization)47
+b(and)e(Regular)h(Expressions)120 2080 y Fu(It)32 b(should)g(only)g
+(seldomly)f(b)s(e)h(necessary)j(to)d(write)g(a)g(lexical)e(analyzer.)43
+b(Before)33 b(y)m(ou)g(attempt)120 2201 y(to)38 b(in)m(tro)s(duce)g(y)m
+(our)h(o)m(wn)g(lexical)e(categories,)j(c)m(hec)m(k)g(whether)g(the)f
+(follo)m(wing)d(v)-5 b(ariables)37 b(and)120 2321 y(k)m(eyw)m(ords)e(w)
+m(ould)e(su\016ce)h(to)e(parameterize)g(lexical)f(analysis:)325
+2604 y Ff(*comment-start*)325 2725 y(*comment-brackets*)325
+2845 y(*disallow-packages*)325 2965 y(*preserve-case*)325
+3086 y(*case-sensitive*)325 3206 y(:case-sensitive)325
+3327 y(:identifier-start-chars)325 3447 y(:identifier-continue-char)q
+(s)325 3567 y(:string-delimiter)325 3688 y(:symbol-delimiter)325
+3808 y(:white-space)325 3928 y(:lex-cats)266 4332 y Fu(The)i(lexical)d
+(analyzer)i(w)m(orks)i(in)d(a)g(top-do)m(wn)i(one)f(tok)m(en)h(lo)s
+(ok-ahead)d(w)m(a)m(y)-8 b(.)45 b(It)32 b(tries)f(only)120
+4452 y(to)j(recognize)h(tok)m(ens)h(that)f(w)m(ould)f(b)s(e)h(legal)e
+(con)m(tin)m(uations)h(of)h(the)g(string)f(parsed)h(so)g(far.)50
+b(In)120 4573 y(case)33 b(lexical)e(categories)i(o)m(v)m(erlap)f(this)h
+(will)d(serv)m(e)k(to)e(disam)m(biguate)f(tok)m(enization.)120
+4915 y Fg(6.2)135 b(In)l(tro)t(ducing)45 b(new)g(Categories)i(b)l(y)e
+(Regular)h(Expressions)120 5149 y Fu(The)34 b(k)m(eyw)m(ord)g
+Ff(:lex-cats)h Fu(tak)m(es)f(as)f(argumen)m(t)f(an)h(asso)s(ciation)e
+(list)g(of)h(the)h(form:)325 5404 y Ff(\(\()p Fe(h)p
+Ff(Category)p Fe(i)53 b(h)p Ff(Regular)g(Expression)p
+Fe(i)s Ff(\))e(*\))1871 5656 y Fu(25)p eop
+%%Page: 26 26
+26 25 bop 266 407 a Fe(h)p Fu(Category)p Fe(i)37 b Fu(is)g(a)g(sym)m(b)
+s(ol)f(naming)g(a)g(lexical)g(category)h(and)g Fe(h)p
+Fu(Regular)31 b(Expression)p Fe(i)39 b Fu(is)d(a)120
+527 y(string)24 b(represen)m(ting)h(a)f(regular)f(expression)j(as)e
+(de\014ned)i(in)d(the)i(GNU)f(Emacs)g(Lisp)g(Man)m(ual)g([7].)120
+648 y(The)k(regular)e(expression)j(will)c(b)s(e)i(compiled)f(in)m(to)g
+(a)h(Common)f(Lisp)h(function)g(and)g(in)m(v)m(ok)m(ed)i(b)m(y)120
+768 y Ff(read-parser)f Fu(b)s(efore)d(the)h(built-in)c(categories)j
+(\(Iden)m(ti\014er,)i(String,)f(Num)m(b)s(er\))f(are)g(examined.)120
+888 y(The)34 b(categories)e(can)h(b)s(e)f(used)i(in)e(grammar)e(rules)j
+(lik)m(e)f(an)m(y)h(of)f(the)h(built-in)d(categories.)266
+1056 y(The)k(regular)d(expression)j(compiler)1632 1020
+y Fn(13)1738 1056 y Fu(handles)e(the)h(follo)m(wing)d(constructs:)120
+1324 y Fs(.)49 b Fu(P)m(erio)s(d)32 b(matc)m(hes)h(an)m(y)h(single)d(c)
+m(haracter)j(except)g(a)e(newline.)120 1525 y Fs(*)49
+b Fu(rep)s(eats)33 b(preceding)g(regular)f(expression)h(as)g(man)m(y)g
+(times)e(as)i(p)s(ossible.)120 1727 y Fs(+)49 b Fu(lik)m(e)32
+b(*)g(but)h(m)m(ust)g(matc)m(h)f(at)g(least)g(once.)120
+1928 y Fs(?)49 b Fu(lik)m(e)32 b(*)g(but)h(m)m(ust)f(matc)m(h)h(once)g
+(or)f(not)h(at)f(all.)120 2130 y Fs([.)19 b(.)g(.)g(])48
+b Fu('[')33 b(b)s(egins)g(a)f(c)m(haracter)h(set,)h(whic)m(h)f(is)f
+(terminated)f(b)m(y)j(']'.)364 2250 y(Character)f(ranges)g(can)g(b)s(e)
+g(indicated,)f(e.g.)g(a-z,)h(0-9.)120 2452 y Fs([)13
+b Fu(^)g Fs(.)19 b(.)f(.)h(])49 b Fu(forms)32 b(the)h(complemen)m(t)f
+(c)m(haracter)h(set.)120 2653 y Fs($)49 b Fu(matc)m(hes)33
+b(only)f(at)g(the)h(end)h(of)e(a)g(line.)120 2855 y Fe(n)p
+Fs(\(.)18 b(.)h(.)g Fe(n)p Fs(\))48 b Fu(is)32 b(a)g(grouping)g
+(construct.)120 3056 y Fe(n)37 b(h)p Fs(digit)p Fe(i)47
+b Fu(means:)59 b(accept)41 b(the)f(same)g(string)g(as)h(w)m(as)g(matc)m
+(hed)f(b)m(y)h(the)g(group)f(in)g(p)s(osition)364 3176
+y Fe(h)p Fu(digit)p Fe(i)m Fu(.)120 3483 y Fs(Example:)171
+3727 y Ff(:lex-cats)54 b(\(\(BibTeX-in-braces)i("{[^\\\\n}]*}"\)\))266
+4093 y Fu(de\014nes)33 b(a)f(new)g(category)g Ff(BibTeX-in-braces)j
+Fu(whic)m(h)d(matc)m(hes)g(an)m(ything)g(starting)e(with)120
+4213 y(\\)p Fe(f)p Fu(",)i(ending)g(in)g(\\)p Fe(g)p
+Fu(",)g(and)h(not)f(con)m(taining)f(either)i(a)f(newline)g(or)h(\\)p
+Fe(g)p Fu(".)171 4481 y Ff(:lex-cats)223 4601 y(\(\(Ratio_Number)55
+b("-?[0-9]+/[0-9]+"\))274 4722 y(\(Simple_Float)g
+("-?[0-9]*\\\\.[0-9]+"\)\))266 5110 y Fu(de\014nes)34
+b(the)e(syn)m(tax)h(for)e(rationals)e(and)j(\015oating)e(p)s(oin)m(t)h
+(n)m(um)m(b)s(ers.)44 b(Note)32 b(that)f(the)h(p)s(erio)s(d)120
+5230 y(needs)f(to)e(b)s(e)g(escap)s(ed,)j(since)d(it)f(is)h(a)g(sp)s
+(ecial)g(c)m(haracter)h(of)e(the)i(regular)e(expression)j(language.)p
+120 5316 1440 4 v 199 5377 a Fl(13)269 5407 y Fk(Thanks)c(to)h(La)n
+(wrence)e(E.)h(F)-7 b(reil)28 b(who)f(wrote)g(the)h(main)f(part)g(of)h
+(the)g(Regular)e(Expression)g(Compiler.)1871 5656 y Fu(26)p
+eop
+%%Page: 27 27
+27 26 bop 120 407 a Fg(6.3)135 b(The)45 b(functional)g(in)l(terface)i
+(to)e(the)g(parsing)h(engine)120 842 y Fu(In)f(case)h(the)f(ab)s(o)m(v)
+m(e)h(parameterization)c(facilities)g(for)i(lexical)f(analysis)h(are)h
+(insu\016cien)m(t)g(or)120 962 y(y)m(ou)37 b(w)m(an)m(t)f(to)g(use)h
+(an)e(existing)g(lexical)g(analyzer,)h(y)m(ou)h(need)g(to)e(understand)
+i(the)g(functional)120 1082 y(in)m(terface)c(to)f(the)h(parsing)f
+(engine)g(as)h(implemen)m(ted)e(b)m(y)j(the)f Ff(lr-parse)p
+Fu(.)120 2535 y Ff(lr-parse)2925 b Fd(function)283 2656
+y(next-sym-fn)31 b(err)-5 b(or-fn)32 b(gr)-5 b(ammar)32
+b Ff(&optional)j Fd(junk-al)5 b(lowe)-5 b(d)31 b(last-p)-5
+b(os-fn)266 4109 y Ff(lr-parse)32 b Fu(returns)f(the)f(result)g(of)f
+(parsing)g(the)h(tok)m(en)h(stream)f(pro)s(duced)g(b)m(y)h
+Fd(next-sym-fn)120 4229 y Fu(with)k Fd(gr)-5 b(ammar)35
+b Fu(b)m(y)h(the)g(LALR\(1\))f(metho)s(d.)52 b(In)35
+b(case)i Fd(junk-al)5 b(lowe)-5 b(d)44 b Fu(is)35 b Fd(true)44
+b Fu(it)34 b(pro)s(duces)j(as)120 4350 y(second)j(v)-5
+b(alue)38 b(a)h(handle)f(to)h(the)g(y)m(et)h(unconsumed)g(tok)m(en)g
+(stream)e(b)m(y)i(calling)c(the)j(function)120 4470 y
+Fd(last-p)-5 b(os-fn)p Fu(.)266 4638 y Fd(next-sym-fn)23
+b Fu(should)g(b)s(e)h(b)s(ound)g(to)f(a)g(generator)g(function)g(|)g(a)
+g(function)g(of)g(no)h(argumen)m(ts)120 4758 y(|)30 b(that)g(will)e(b)s
+(e)i(called)f(to)h(pro)s(duce)h(the)g(next)g(tok)m(en.)43
+b(It)31 b(should)f(return)h(t)m(w)m(o)f(v)-5 b(alues:)43
+b(\(1\))30 b(the)120 4878 y(tok)m(en)c(found)g(and)f(\(2\))g(the)h
+(category)g(of)f(the)g(tok)m(en)i(\(obtained)d(b)m(y)j(the)e(function)g
+Ff(categorize)p Fu(\).)266 5166 y Fd(err)-5 b(or-fn)33
+b Fu(is)f(the)h(function)g(to)f(b)s(e)h(called)f(in)g(case)i(of)e(an)h
+(error.)44 b Fd(gr)-5 b(ammar)32 b Fu(is)g(the)h(grammar)120
+5287 y(ob)5 b(ject)49 b(that)e(con)m(tains)h(imp)s(ortan)m(t)e
+(information)e(for)j(lexical)f(analysis,)51 b(\(e.g.)d(the)g(table)f
+(of)120 5407 y(k)m(eyw)m(ords\).)1871 5656 y(27)p eop
+%%Page: 28 28
+28 27 bop 266 407 a Fu(T)-8 b(o)36 b(understand)i(the)e(in)m(terface)g
+(to)g Ff(lr-parse)p Fu(,)j(consider)d(ho)m(w)g Ff(list-parser)j
+Fu(\(describ)s(ed)120 527 y(ab)s(o)m(v)m(e\))33 b(migh)m(t)e(ha)m(v)m
+(e)j(b)s(een)g(de\014ned:)120 796 y Ff(\(defun)53 b(list-parser)h
+(\(token-list)g(&key)f(\(grammar)g(*current-grammar*\))1966
+917 y(junk-allowed\))223 1037 y(\(let)f(\(\(last-position)j
+(token-list\))530 1157 y(token1\))325 1278 y(\(check-type)f(token-list)
+g(list\))325 1398 y(\(lr-parse)376 1519 y(;;)e(The)g(LEXER)h(supplied)g
+(to)f(the)g(parsing)h(engine:)376 1639 y(#'\(lambda)h(\(\))581
+1759 y(\(if)e(\(null)h(token-list\))786 1880 y
+(\(end-of-tokens-category)58 b(grammar\))684 2000 y(\(progn)786
+2120 y(\(setq)53 b(last-position)i(token-list)1094 2241
+y(token1)e(\(pop)f(token-list\)\))786 2361 y(\(categorize)j(token1)e
+(grammar\)\)\)\))376 2482 y(;;)f(The)g(error)h(function)g(supplied)h
+(to)d(the)h(parsing)i(engine:)376 2602 y(#'\(lambda)g(\(string\))581
+2722 y(\(error)f("~S~\045)g(Remaining)h(tokens:)f(~S~{)f(~S~}")940
+2843 y(string)h(token1)g(token-list\)\))376 2963 y(grammar)376
+3084 y(junk-allowed)376 3204 y(;;)f(Function)i(that)e(returns)h(the)f
+(remaining)i(unparsed)f(token-list)376 3324 y(#'\(lambda)h(\(\))e
+(last-position\)\)\)\))120 3714 y(end-of-tokens-category)38
+b Fd(gr)-5 b(ammar)1791 b(function)266 3983 y Ff
+(end-of-tokens-category)44 b Fu(returns)39 b(t)m(w)m(o)g(v)-5
+b(alues:)54 b(a)37 b(tok)m(en)i(signifying)d(the)i(end)h(of)f(the)120
+4103 y(tok)m(en)c(stream)e(and)h(the)g(appropriate)e(lexical)g
+(category)-8 b(.)120 4372 y Ff(categorize)35 b Fd(token)d(gr)-5
+b(ammar)2147 b(function)266 4641 y Ff(categorize)41 b
+Fu(returns)e(the)f Fd(token)75 b Fu(itself)36 b(and)i(its)g(category)-8
+b(,)39 b(a)f(n)m(um)m(b)s(er)g(that)f(represen)m(ts)120
+4762 y(one)c(of)f Ff(number)p Fu(,)i Ff(identifier)p
+Fu(,)h Ff(string)g Fu(or)d(a)g(terminal)e(tok)m(en)k(de\014ned)g(b)m(y)
+f Ff(:lex-cats)p Fu(.)120 5141 y Ft(7)161 b(F)-13 b(uture)53
+b(W)-13 b(ork)120 5407 y Fu(T)-8 b(ranslation)31 b(in)m(v)m(olv)m(es)i
+(three)h(pro)s(cesses:)1871 5656 y(28)p eop
+%%Page: 29 29
+29 28 bop 265 407 a Fe(\017)49 b Fu(parsing)265 609 y
+Fe(\017)g Fu(transformation)265 812 y Fe(\017)g Fu(generation)266
+1060 y Fq(Zebu)c Fu(is)e(a)h(to)s(ol)f(that)h(helps)g(in)g(1)f(and)i
+(3.)78 b(There)45 b(are)g(cases)g(where)h(2)e(reduces)i(to)e(the)120
+1180 y(iden)m(tit)m(y)32 b(function,)g(since)g(the)h(abstract)f(syn)m
+(tax)i(is)d(the)i(same)f(for)f(the)i(source)g(and)f(the)g(target)120
+1301 y(language)h(of)g(translation.)46 b(Examples)33
+b(for)h(these)h(\\syn)m(tactic)f(v)-5 b(arian)m(ts")33
+b(are)h(in\014x)g(and)g(pre\014x)120 1421 y(notation)d(for)h
+(arithmetic)f(or)h(b)s(o)s(olean)f(expressions.)266 1589
+y(In)40 b(general,)g(the)f(situation)e(is)i(more)f(complicated.)61
+b(F)-8 b(or)38 b(languages)g(with)h(the)g(same)g(ex-)120
+1709 y(pressiv)m(e)31 b(p)s(o)m(w)m(er,)f(some)f(transformation)e(pro)s
+(cess)j(can)f(b)s(e)g(de\014ned.)44 b(Bet)m(w)m(een)31
+b(languages)d(with)120 1829 y(di\013eren)m(t)40 b(expressiv)m(e)i(p)s
+(o)m(w)m(er)e(suc)m(h)i(a)d(transformation)e(is)j(not)f(alw)m(a)m(ys)h
+(p)s(ossible.)64 b(F)-8 b(or)39 b(a)g(lan-)120 1950 y(guage)24
+b(that)h(is)f(not)g(T)-8 b(uring)24 b(complete,)h(it)f(is)g(not)g(p)s
+(ossible)g(to)g(express)j(ev)m(ery)f(computation,)f(e.g.)120
+2070 y(SQL)32 b(cannot)h(express)i(recursion,)d(and)h(hence)h(it)d(is)h
+(not)g(p)s(ossible)g(to)g(express)j(the)e(\\ancestor")120
+2190 y(relation)i(\(whic)m(h)i(is)g(recursiv)m(ely)g(de\014ned\).)58
+b(A)37 b(tec)m(hnique)h(to)e(represen)m(t)j(transformation)c(are)120
+2311 y(\\rewrite)30 b(rule)g(systems".)44 b(The)31 b
+Fq(Re\014ne)g Fu(language)f([8])g(con)m(tains)g(a)h(rewrite-rule)e(mec)
+m(hanism)h(in)120 2431 y(whic)m(h)d(the)h(rules)e(are)h(in)f(terms)h
+(of)g(patterns)g(of)f(the)i(concrete)g(syn)m(tax.)43
+b(W)-8 b(e)27 b(ha)m(v)m(e)h(implemen)m(ted)120 2552
+y(a)37 b(rewrite-rule)f(system)i(based)g(on)f(t)m(yp)s(ed)h(feature)f
+(structures,)j(called)c Fq(Zebu-RR)p Fu(,)g(whic)m(h)h(will)120
+2672 y(b)s(e)c(describ)s(ed)g(in)f(a)g(future)h(rep)s(ort.)120
+3052 y Ft(A)161 b(Installation)120 3318 y Fu(There)34
+b(are)e(t)m(w)m(o)i(w)m(a)m(ys)g(to)e(install)e Fq(Zebu)p
+Fu(:)265 3590 y Fe(\017)49 b Fu(Installation)30 b(using)i
+Ff(defsystem)364 3751 y Fu(This)40 b(mak)m(es)h(it)f(easier)g(to)g
+(load)g(and)g(compile)f(grammars,)h(since)h(one)g(do)s(es)g(not)f(need)
+364 3872 y(to)j(remem)m(b)s(er)h(the)g(lo)s(cation)e(of)h(a)h(mo)s
+(dule)e(in)i(a)f(directory)h(structure)h(and)f(the)h(par-)364
+3992 y(ticular)38 b(compilation)e(and)k(loading)d(functions.)65
+b(T)-8 b(o)40 b(install,)f(follo)m(w)f(the)i(directions)f(in)364
+4112 y Ff(ZEBU-sys.lisp)p Fu(.)64 b(Y)-8 b(ou)39 b(need)g(the)g(p)s
+(ortable)e Ff(defsys)j Fu(for)e(that.)61 b(This)39 b(is)f(a)m(v)-5
+b(ailable)36 b(as)364 4233 y Ff(Defsys.tar.gz)g Fu(at)c(the)h(same)f
+(place)h(as)g Ff(zebu-???.tar.gz)p Fu(.)364 4394 y(The)28
+b(\014le)e Ff(ZEBU-sys.lisp)k Fu(is)c(used)i(to)f(load)e(or)i(compile)d
+Fq(Zebu)p Fu(,)29 b(whic)m(h)e(actually)e(consists)364
+4515 y(of)32 b(t)m(w)m(o)h(systems)h(\(de\014ned)g(b)m(y)g
+Ff(defsystem)p Fu(\))770 4780 y Fq(Zebu)1017 b Fu(the)33
+b(run)m(time)f(system)770 4901 y Fq(Zebu-compiler)643
+b Fu(the)33 b(compiler)265 5287 y Fe(\017)49 b Fu(Installation)30
+b(without)i Ff(defsystem)364 5407 y Fu(If)37 b(y)m(ou)i(don't)f(w)m(an)
+m(t)g(to)f(use)i Ff(defsystem)p Fu(,)i(load)c(the)h(\014le)f
+Ff(COMPILE-ZEBU.lisp)p Fu(,)43 b(whic)m(h)1871 5656 y(29)p
+eop
+%%Page: 30 30
+30 29 bop 364 407 a Fu(compiles)20 b(the)i Fq(Zebu)g
+Fu(\014les)g(in)f(the)h(righ)m(t)f(order.)80 b(After)22
+b(loading)d(the)j(\014le)g Ff(ZEBU-init.lisp)364 527
+y Fu(y)m(ou)33 b(can)g(call:)364 689 y Ff(\(zb:zebu\))i
+Fu(to)d(load)f(the)i(run)m(time)f(system)364 809 y(or)364
+930 y Ff(\(zb:zebu-compiler\))37 b Fu(to)32 b(load)g(the)h(grammar)d
+(compiler.)120 1310 y Ft(References)169 1570 y Fu([1])49
+b(A.V.)41 b(Aho)g(and)h(J.D.)f(Ullman.)67 b Fd(Principles)42
+b(of)g(Compiler)g(Design)p Fu(.)68 b(Addison)41 b(W)-8
+b(esley)g(,)321 1691 y(New)33 b(Y)-8 b(ork,)33 b(1979.)169
+1894 y([2])49 b(Charles)59 b(N.)g(Fisc)m(her)h(and)f(Ric)m(hard)f(J.)i
+(LeBlanc.)122 b Fd(Cr)-5 b(afting)59 b(a)g(Compiler)p
+Fu(.)121 b(Ben-)321 2015 y(jamin/Cummings,)29 b(Menlo)j(P)m(ark,)i(CA,)
+f(1988.)169 2218 y([3])49 b(Mic)m(hael)40 b(R.)g(Genesereth.)70
+b(An)41 b(agen)m(t-based)h(framew)m(ork)e(for)h(soft)m(w)m(are)h(in)m
+(terop)s(erabil-)321 2338 y(it)m(y)-8 b(.)53 b(T)-8 b(ec)m(hnical)36
+b(Rep)s(ort)f(Logic-92-02,)f(Departmen)m(t)i(Of)f(Computer)h(Science,)i
+(Stanford)321 2459 y(Univ)m(ersit)m(y)-8 b(,)33 b(Stanford,)f(1992.)169
+2662 y([4])49 b(Mic)m(hael)44 b(R.)g(Genesereth,)49 b(Ric)m(hard)44
+b(Fik)m(es,)k(et)d(al.)77 b(Kno)m(wledge)45 b(in)m(terc)m(hange)g
+(format,)321 2783 y(v)m(ersion)23 b(3.0.)g(reference)i(man)m(ual.)i
+(Rep)s(ort)c(Logic-92-1,)f(Logic)g(Group)h(Rep)s(ort,)i(Computer)321
+2903 y(Science)33 b(Departmen)m(t,)f(Stanford)h(Univ)m(ersit)m(y)-8
+b(,)33 b(Stanford,)f(June)i(1992.)169 3106 y([5])49 b(Mark)37
+b(Johnson.)58 b Fd(A)n(ttribute)40 b(V)-7 b(alue)38 b(L)-5
+b(o)g(gic)39 b(and)f(the)h(The)-5 b(ory)39 b(of)g(Gr)-5
+b(ammar)p Fu(.)56 b(Cen)m(ter)38 b(for)321 3227 y(the)33
+b(Study)g(of)f(Language)g(and)h(Information,)e(Stanford,)h(1988.)169
+3430 y([6])49 b(Joac)m(him)41 b(Laubsc)m(h)i(and)g(Derek)g(Proudian.)72
+b(A)42 b(case)h(study)h(in)d(REFINE:)i(in)m(terfacing)321
+3550 y(mo)s(dules)31 b(via)h(languages.)43 b(Rep)s(ort)32
+b(HPL-STL-TM-88-11,)g(Hewlett)g(P)m(ac)m(k)-5 b(ard,)34
+b(1988.)169 3754 y([7])49 b(Bill)42 b(Lewis,)49 b(Dan)c(LaLib)s(erte,)j
+(and)e(the)g(GNU)f(Man)m(ual)g(Group.)81 b Fd(GNU)48
+b(Emacs)e(Lisp)321 3874 y(R)-5 b(efer)g(enc)g(e)38 b(Manual)p
+Fu(.)57 b(The)38 b(F)-8 b(ree)37 b(Soft)m(w)m(are)h(F)-8
+b(oundation,)37 b(Cam)m(bridge,)h(MA,)g(Decem)m(b)s(er)321
+3995 y(1990.)169 4198 y([8])49 b(Reasoning)43 b(Systems,)48
+b(P)m(alo)43 b(Alto,)i(3260)e(Hillview)f(Av)m(e.,)48
+b(CA)c(94304.)76 b Fd(R)-5 b(e\014ne)44 b(User's)321
+4318 y(Guide)p Fu(,)32 b(1989.)169 4522 y([9])49 b(Douglas)43
+b(R.)i(Smith,)i(Gordon)e(B.)g(Kotik,)i(and)e(Stephen)i(J.)e(W)-8
+b(estfold.)80 b(Researc)m(h)47 b(on)321 4642 y(kno)m(wledge-based)32
+b(soft)m(w)m(are)f(en)m(vironmen)m(ts)h(at)e(KESTREL)h(institute.)40
+b Fd(IEEE)33 b(T)-7 b(r)i(ansac-)321 4763 y(tions)34
+b(on)h(Softwar)-5 b(e)34 b(Engine)-5 b(ering)p Fu(,)31
+b(SE-11:1278{1295,)f(No)m(v)m(em)m(b)s(er)k(1985.)1871
+5656 y(30)p eop
+%%Page: 31 31
+31 30 bop 120 557 a Ft(Index)120 755 y Fu(*allo)m(w-con\015icts*,)31
+b(18)120 876 y(*case-sensitiv)m(e*,)i(5,)g(24)120 998
+y(*c)m(hec)m(k-actions*,)h(18)120 1119 y(*commen)m(t-brac)m(k)m(ets*,)f
+(23,)f(24)120 1240 y(*commen)m(t-start*,)f(23,)h(24)120
+1361 y(*disallo)m(w-pac)m(k)-5 b(ages*,)31 b(5,)h(24)120
+1482 y(*preserv)m(e-case*,)j(5,)d(24)120 1604 y(*w)m(arn-con\015icts*,)
+h(18)120 1725 y(:build)e(seman)m(tic)i(action,)e(6)120
+1846 y(:case-sensitiv)m(e,)j(9,)e(24)120 1967 y(:domain,)f(8)120
+2088 y(:domain-\014le,)f(8)120 2209 y(:grammar,)g(8)120
+2331 y(:iden)m(ti\014er-con)m(tin)m(ue-c)m(hars,)j(8,)f(24)120
+2452 y(:iden)m(ti\014er-start-c)m(hars,)g(8,)h(24)120
+2573 y(:in)m(tern-iden)m(ti\014er,)f(8)120 2694 y(:lex-cats,)h(8,)f(24)
+120 2815 y(:name,)g(8)120 2937 y(:pac)m(k)-5 b(age,)33
+b(8)120 3058 y(:prin)m(t-parse-errors,)g(22)120 3179
+y(:string-delimiter,)c(8,)j(24)120 3300 y(:sym)m(b)s(ol-delimiter,)d
+(8,)j(24)120 3421 y(:white-space,)h(9,)g(24)120 3639
+y(categorize,)f(27)120 3760 y(compile-lalr1-gramm)o(ar,)26
+b(20)120 3881 y(compile-slr-grammar,)h(20)120 4099 y(debug-parser,)34
+b(23)120 4220 y(def-tree-attributes,)e(11)120 4341 y(domain)286
+4462 y(de\014ning,)h(9,)f(13)286 4584 y(top)g(t)m(yp)s(e,)i(10)120
+4705 y(feature)f(structures,)h(12)120 4826 y(\014le-parser,)e(22)120
+4947 y(\014nd-grammar,)e(21)120 5165 y(grammar)286 5286
+y(name,)i(8)286 5407 y(options,)g(8)2065 755 y(kb-compare,)h(10)2065
+876 y(kb-domain,)e(10)2065 996 y(kb-domain-p,)g(10)2065
+1116 y(kb-equal,)i(10)2065 1237 y(kb-sequence,)j(10)2065
+1357 y(Kleene)d(*,)f(5,)h(16,)f(17)2065 1561 y(lexical)f(category)-8
+b(,)33 b(24)2065 1681 y(list-parser,)f(23,)g(26)2065
+1801 y(lr-parse,)g(25)2065 2005 y(meta)g(grammar,)f(4,)h(12)2065
+2208 y(non-terminal,)e(5)2231 2328 y(\\.n")j(notation,)e(8)2065
+2449 y(n)m(ull-grammar,)e(4)2065 2652 y(option)j(list,)f(8)2065
+2856 y(prin)m(t-actions,)h(8)2065 2976 y(prin)m(t-function,)g(12,)g(14)
+2065 3179 y(read-parser,)h(17,)g(21)2065 3300 y(regular)f(expression,)i
+(9,)e(23)2065 3503 y(seman)m(tic)h(actions,)f(6,)g(7)2065
+3624 y(start-sym)m(b)s(ol,)g(5)2065 3827 y(zebu,)i(28)2065
+3947 y(zebu-compile-\014le,)d(18)2065 4068 y(zebu-compiler,)h(28)2065
+4188 y(zebu-load-\014le,)g(20)2065 4309 y(zebu-mg,)h(12)1871
+5656 y(31)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
Added: vendor/zebu/doc/Zebu_intro.tex
==============================================================================
--- (empty file)
+++ vendor/zebu/doc/Zebu_intro.tex Wed Oct 17 09:04:46 2007
@@ -0,0 +1,1661 @@
+% -*- mode: LaTeX -*- ------------------------------------------------ %
+% File: Zebu_intro.tex
+% Description: Introduction to the reversible grammar formalism
+% Author: Joachim H. Laubsch
+% Created: 27-May-92
+% Modified: Fri Mar 8 11:24:31 1996 (Joachim H. Laubsch)
+% Language: LaTeX
+% RCS $Header: $
+%
+% (c) Copyright 1992, Hewlett-Packard Company
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Revisions:
+% RCS $Log: $
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentstyle[twoside,12pt]{article}
+
+\makeindex
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand{\alt}[0]{$\dot{|}\: $}
+\newcommand{\metavar}[1]{\mbox{$\langle\/$#1$\/\rangle$}}
+\newcommand{\metavm}[1]{\mbox{\em $\langle\/$#1$\/\rangle$}}
+
+\topmargin 0in
+\textheight 8.5in
+\oddsidemargin 0.2in
+\evensidemargin 0.2in
+\textwidth 6.0in
+\parskip 0.2cm
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{document}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{{\sf Zebu}: A Tool for Specifying Reversible LALR(1) Parsers \\
+%{\small Revised \today}
+ }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\author{Joachim Laubsch (laubsch at hplabs.hp.com)}
+\maketitle
+
+\vspace{3in}
+\begin{flushright}
+Application Engineering Department\\
+Software Technology Laboratory\\
+Hewlett-Packard Laboratories\\
+1501 Page Mill Road, Bldg. 1U-17\\
+P.O. Box 10490\\
+Palo Alto, Calif. 94304-1126
+\vspace{0.2in}
+laubsch at hpl.hp.com\\
+(415) 857-7695
+\end{flushright}
+\newpage
+\newpage
+\tableofcontents\contentsline {paragraph}{Keywords}{1}
+
+\vspace*{0.5 in}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\bibliographystyle{plain}
+
+\begin{abstract}
+{\sf Zebu}\footnote{``{\bf zebu}{\em n}., {\em pl}. {\bf -bus}, {\bf
+-bu}: 1. an oxlike domestic animal ({\em Bos indicus}) native to Asia
+and parts of Africa: it has a large hump over the shoulders, short,
+curving horns, pendulous ears, and a large dewlap and is resistant to
+heat and insect-born diseases.'' [Webster's New World Dictionary.]
+A zebu should not be confused with a yacc or a gnu although it bears
+similarity to each of them.} is part of a set of tools for the
+translation of formal languages. {\sf Zebu} contains a LALR(1) parser
+generator like Yacc does. Aside from generating a parser, {\sf Zebu}
+will also generate the inverse of a parser (unparser). In contrast to
+Yacc, the semantics is not given in terms of ``routines'' but
+declaratively in terms of typed feature structures.
+
+The ability to declaratively define a reversible grammar, together with
+a rewrite-rule mechanism ({\sf Zebu-RR}) for transforming abstract syntax
+trees constitute the basic tools for specifying translators for formal
+languages.
+
+\paragraph{Keywords} Formal language, LALR-grammar, parsing, translation,
+generation, interoperability, LEX, YACC.
+
+\end{abstract}
+
+\section{Introduction}
+Our goal is to develop an environment for the design, analysis and
+manipulation of formal languages, such as programming languages,
+markup languages, data interchange formats or knowledge representation
+languages (such as the translation to and from KIF) \cite{cs:kif92}.
+Being able to design, analyze, and manipulate formal languages is
+crucial for achieving software interoperability
+\cite{cs:Genesereth92}, automatic code analysis, indexing, and
+retrieval for potential reuse. Zebu has been applied to writing
+translators for formal languages \cite{ap:refine}. The main idea of
+this work is that a module $m$ communicates by sending or receiving
+messages in some language $L(m)$, and that for various reasons
+different modules use different languages. For communication to be
+successful, translators have to be used. {\sf Zebu} provides tools to
+define translators at a high level of abstraction\footnote{The
+rewrite-rule mechanism (Zebu-RR) is implemented, and will be
+described in a future report.}.
+
+
+McCarthy introduced the notion of ``abstract'' and ``concrete''
+syntax. The concrete syntax describes the surface form of a
+linguistic expression, while the abstract syntax describes a
+(composite) object. E.g. ``1+a'' is the surface string rendered by a
+particular concrete syntax for an object described by an abstract
+syntax: an addition operation with two operands, the first being the
+numeral ``1'', and the second being the variable named ``a''.
+
+Manipulation of linguistic expressions is much easier to express in
+the abstract syntax than in the concrete syntax.
+
+If we were to design an algorithm for simplifying expressions of some
+language --- say ``arithmetic'' --- we would use as the front end the
+``arithmetic-parser'' to translate into abstract syntax, then express
+the simplification rules in terms of tree transformation rules that
+operate on the abstract syntax, and finally add as the back-end the
+``arithmetic-unparser''.
+
+More generally, if we were to design an algorithm for translating
+from language A to language B, we would define reversible grammars for
+languages A and B, and sets of rewrite rules to transform the abstract
+syntax trees from the domain of language A to the domain of language
+B. The front end would be the ``A-parser'' and the back-end the
+``B-unparser''
+
+The work described in this report owes a lot to the pioneering research
+at Kestrel \cite{ap:smith85} that resulted in the {\sf
+Refine}\footnote{{\sf Refine} is a trademark of Reasoning Systems,
+Palo Alto.} program transformation system \cite{refine}. The basic
+ideas underlying {\sf Zebu} are already present in {\sf Refine}. {\sf
+Zebu} is much more compact than {\sf Refine}\footnote{{\sf Zebu} runs
+on a MacIntosh in MacIntosh Common Lisp.}, and the semantics is
+expressed in typed feature structures. {\sf Zebu} also offers the
+possibility of defining a meta-grammar\index{meta grammar}. {\sf
+Zebu} lacks {\sf Refine}'s ability to declaratively specify
+transformations using a pattern language.\footnote{{\sf Zebu} can be
+obtained via anonymous ftp from ftp.cs.cmu.edu as a compressed tar
+file: /user/ai/lang/lisp/code/zebu/zebu-???.tar.gz. It contains
+several example grammar definitions.}
+
+The LALR(1) parsing table generated by {\sf Zebu} follows algorithms
+described in \cite{aho:79} or \cite{compiler:88}. The current
+implementation was developed from the {\sf Scheme} program developed by
+William Wells and is written in {\sf Common Lisp}.
+
+The next section will explain how a grammar can be defined, and how
+semantics can be associated with a grammar rule. Section~\ref{Options}
+describes the definition of the semantic domain. With this capability
+it is possible to state declaratively what the abstract syntax should
+look like. Section~\ref{meta-grammar} describes a simpler grammar
+notation that is very close to ordinary BNF\@. Section~\ref{Compiler}
+summarizes the functional interface of Zebu and explains how a parser
+can be customized. Section~\ref{lex} describes how lexical analysis
+can be extended using regular expressions and parameterization.
+
+
+\section{The Representations of Grammars in Files}
+
+\subsection{Grammar notation}
+
+We first describe the null-grammar\index{null-grammar}, which is a
+powerful but verbose way to specify a grammar. Only a parser and
+optionally a domain will be generated but an unparser (printer) will
+not. If this is desired, you must use the notation of the
+meta-grammar "zebu-mg" which is described in section
+~\ref{meta-grammar}.
+
+Non-terminals\index{non-terminal} are represented by symbols,
+terminals (also referred to as keywords) by strings. There are the
+following open classes of non-terminals\footnote{The Kleene *
+indicates 0 or more occurrences of the preceding constituent}:
+\index{Kleene *}
+
+\begin{tabbing}
+mm\=mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \> {\tt identifier} \= ::= \metavar{lisp symbol} \\
+ \> {\tt number} \> ::= \metavar{integer} \\
+ \> {\tt keyword} \> ::= \metavar{string} \\
+where\\
+ \>\metavar{integer} \> ::= \metavar{digit}* \\
+ \>\metavar{string} \> ::= " \metavar{character}* "
+\end{tabbing}
+
+A \metavar{lisp symbol} may be qualified by a package name, e.g. {\tt
+zb:cons-1-3} is a valid identifier. In case packages should be
+disallowed during lexical analysis, the variable {\tt
+*disallow-packages*} \index{*disallow-packages*} should be bound to
+{\em true}. (It defaults to {\em false}). The alphabetic case of a
+keyword is not significant if the variable {\tt *case-sensitive*}
+is {\em false} (the default) when the grammar is
+loaded. \index{*case-sensitive*}
+
+If alphabetic case of identifiers is to be preserved, {\tt
+*preserve-case*} should be set to {\em true}. Other
+categories can be defined as regular expressions (see~\ref{lex-cats}).
+\index{*preserve-case*}
+
+\subsubsection{Grammar Rules}
+
+\paragraph{Grammar Rule Syntax}
+
+\index{start-symbol}
+A grammar file consists of a header (the ``options list'', see section
+~\ref{grammar-options}) followed by one or more domain definitions or
+grammar rules. The non-terminal defined by the first grammar rule is
+also the {\em start-symbol} \/ of the grammar. A parser will accept
+exactly the strings that rewrite to the {\em start-symbol}.
+
+This example shows how a BNF-like rule can be encoded as a {\sf Zebu}
+grammar rule (using the null-grammar):
+
+\begin{itemize}
+ \item BNF rule example
+ \begin{quote}
+ \metavar{A} ::= \metavar{B} $|$ \metavar{C} \metavar{number}
+ $|$ ``foo'' \metavar{A} $|$ ``c'' $|$ \metavar{the-empty-string}
+ \end{quote}
+
+ \item {\sf Zebu} null-grammar example:
+ {\tt \begin{tabbing}
+mmmmmmmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmmmmm\=\kill
+ (defrule \>A \\
+ \> := B \>; (1)\\
+ \> := (C NUMBER) \>; (2)\\
+ \> := ("foo" A) \>; (3)\\
+ \> := "c" \>; (4)\\
+ \> := () \>; (5)\\
+ \>)
+\end{tabbing}}
+\end{itemize}
+
+
+The rule describes 5 productions, all deriving the non-terminal {\tt
+A}. Each of the productions has the left-hand side {\tt A}. The
+right-hand side of (1) consists of just one constituent, the
+non-terminal {\tt B}. (2) has a right-hand of length 2, and its second
+constituent is the non-terminal {\tt NUMBER} (which rewrites to any
+integer, real or rational). (3) is a recursive production. (4)
+contains just the terminal (or keyword) {\tt "c"}. (5) derives the
+empty string.
+
+None of these productions has a semantic action attached. By default,
+the semantic action is the {\tt identity} function if the right-hand
+side of the rule consists of a single constituent and the {\tt
+identity*} function otherwise. ({\tt identity*} is defined as the
+function that returns all its arguments as a list.)
+
+\paragraph{Grammar Rule Semantic Actions}
+\index{semantic actions}
+
+If we want to attach other than these default semantic actions, we have to
+use a {\tt :build} clause after a production.
+\index{:build semantic action}
+
+The build clause has the syntax:
+
+\begin{tabbing}
+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \metavar{build clause} ::= \={\tt :build} (\metavar{lisp function} \metavar{argument list})\\
+ \metavar{build clause} ::= \>{\tt :build} \metavar{atomic lisp form}\\
+ \metavar{build clause} ::= \>{\tt :build} ({\tt :form} \metavar{lisp form})\\
+ \metavar{build clause} ::= \={\tt :build} (\={\tt :type} \= \metavar{struct-type}\\
+ \> \>{\tt :map} \> ((\metavar{non-terminal} . \metavar{Slot})*))
+\end{tabbing}
+
+The first case
+\begin{quote}
+ {\tt :build} (\metavar{lisp function} \metavar{argument list})
+\end{quote}
+
+is like a function call. It may contain free variable occurrences.
+These will be bound to the non-terminal constituents of the same name
+occurring in the right-hand side of the production at the time of
+applying the semantic action.
+
+In the second case
+\begin{quote}
+ {\tt :build} \metavar{atomic lisp form}
+\end{quote}
+
+the \metavar{atomic lisp form} must be a function. It will be applied to the
+constituents of the right-hand side. This function should have the same
+number of arguments as the right-hand side of the corresponding
+production has constituents.
+
+Since it happens often, that only some of the constituents of the
+right-hand side are selected, or combined, a few useful semantic
+actions have been predefined in {\sf Zebu}.\footnote{These semantic
+ actions ({\tt cons-1-3 cons-2-3 empty-seq empty-set k-2-1 k-2-2
+ k-3-2 k-4-3 identity* seq-cons set-cons}) are described in the
+ file "zebu-actions.lisp".}
+
+An example for such a predefined action is the function {\tt cons-2-3}
+which takes 3 arguments and returns a {\em cons} of its second and
+third argument.
+
+The third form of the {\tt :build} clause is just a long way to write
+the first form, i.e.
+\begin{quote}
+ {\tt :build} (\metavar{lisp function} \metavar{argument list})
+\end{quote}
+
+ is the same as
+\begin{quote}
+ {\tt :build} ({\tt :form} (\metavar{lisp function} \metavar{argument list}))
+\end{quote}
+
+Similarly,
+
+\begin{quote}
+ {\tt :build} (progn \metavar{atomic lisp form})
+\end{quote}
+
+ is the same as
+
+\begin{quote}
+ {\tt :build} ({\tt :form} \metavar{atomic lisp form})
+\end{quote}
+
+The last {\tt :build} clause is more interesting:
+\begin{tabbing}
+mmmmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \>{\tt :build} (\={\tt :type} \= \metavar{struct-type}\\
+ \> \>{\tt :map} \>((\metavar{Nonterminal} . \metavar{Slot})*))
+\end{tabbing}
+
+where \metavar{struct-type} is a symbol that must be the name of a
+structure type\footnote{a type defined by {\tt defstruct} or {\tt
+defclass}.}. Instead of having to write the semantic action as a
+constructing form, we just have to specify the type and the mapping of
+non-terminals to slots, as in the following example\footnote{(taken
+from the grammar named ``pc1''; see the file ``pc1.zb'' in the test
+directory)}:
+
+{\tt \begin{tabbing}
+mmmmmmmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmmmmm\=\kill
+(defrule Boolean-Expr\\
+ \> := (Formula.1 "and" Formula.2)\\
+ \> :build (\=:type Boolean-And \\
+ \> \>:map (\=(Formula.1 . :-rand1) \\
+ \> \> \>(Formula.2 . :-rand2))) \\
+\\
+ \> := (Formula.1 "or" Formula.2) \\
+ \> :build (:type Boolean-Or \\
+ \> \>:map ((Formula.1 . :-rand1) \\
+ \> \> \>(Formula.2 . :-rand2))) \\
+ \>)
+ \end{tabbing}}
+
+The map indicates that the slot {\tt -rand1} is to be filled by the
+value of the non-terminal {\tt Formula.1}, etc.
+
+This example also makes use of the {\tt ".n"} notation: If on the
+right-hand side of a production a nonterminal occurs repeatedly, we
+distinguish it by appending {\tt "."} and a digit, to the
+nonterminal (e.g.\ {\tt Formula.1}).
+\index{non-terminal ``.n'' notation}
+
+The function {\tt print-actions} \index{print-actions} applied to the
+name of a grammar may be used to find out what the generated code for
+the semantic actions looks like, e.g.\ after compiling the sample
+grammar {\tt ``pc1.zb''}:
+
+{\tt \begin{verbatim}
+(print-actions "pc1")
+
+...
+Rule: BOOLEAN-EXPR
+(LAMBDA (FORMULA.1 DUMMY FORMULA.2)
+ (DECLARE (IGNORE DUMMY))
+ (MAKE-BOOLEAN-AND :-RAND1 FORMULA.1 :-RAND2 FORMULA.2))
+(LAMBDA (FORMULA.1 DUMMY FORMULA.2)
+ (DECLARE (IGNORE DUMMY))
+ (MAKE-BOOLEAN-OR :-RAND1 FORMULA.1 :-RAND2 FORMULA.2))
+...
+\end{verbatim}}
+
+These semantic actions have been generated from the {\tt :build}
+clauses of the above rule for {\tt Boolean-Expr}.
+
+\section {Grammar Options} \label{Options}
+\index{grammar options} \index{option list}
+
+\subsection{Keyword Arguments to Grammar Construction}
+\label{grammar-options}
+
+Some global information to control grammar compilation, lexical
+analysis, and the generation of semantic actions is declared in the
+beginning of a grammar file\footnote{A grammar file has the default
+type ".zb".}. A grammar file must begin with a list of alternating
+keywords and arguments. The following keywords are valid:
+
+\index{grammar name} \index{:name} \index{:package}
+\index{:identifier-start-chars} \index{:identifier-continue-chars}
+\index{:string-delimiter} \index{:symbol-delimiter} \index{:domain}
+\index{:domain-file} \index{:grammar} \index{:lex-cats}
+
+{% table of option keywords
+\def\name {a string, the name of the grammar to be defined.}
+
+\def\package {a string, the name of the package where the
+ non-terminal symbols and the function symbols used in semantic
+ actions reside.}
+
+\def\identifierStartChars {a string. {During lexical analysis any
+character in this string can start an {\tt identifier} non-terminal.
+The default is {\tt *identifier-start-chars*}.} }
+
+\def\identifierContinueChars {a string. During lexical analysis
+ any character in this string can continue an {\tt identifier}
+ (i.e. characters not in this string terminate {\tt identifier}). The
+ default is {\tt *identifier-continue-chars*}. }
+
+\index{:intern-identifier}
+
+\def\intern-identifier {{\em true}, if the identifier is to be
+ returned as an interned Lisp symbol, or {\em false} if the
+ identifier is to be returned as a string (default {\em true}).}
+
+\def\stringDelimiter {a character, the character that delimits a
+ string to be represented as a {\sf Common Lisp} string. }
+
+\def\symbolDelimiter {a character, the character that delimits a
+ string to be represented as a {\sf Common Lisp} symbol.}
+
+\def\domain {a list, representing the type hierarchy of the domain.
+ See section~\ref{domain} below. }
+
+\def\domainFile {a string naming the file where the generated Common
+ Lisp program that implements the domain will be stored. Definitions
+ of functions for semantic actions and regular expression for lexical
+ categories are kept here as well. This string defaults to the
+ concatenation of the grammar's :name and ``-domain''. }
+
+\def\grammar {a string, by default: {\tt "null-grammar"}, naming the
+grammar to be used to parse the grammar defined in this file. If the
+grammar {\tt "zebu-mg"} is used, an unparser will also be generated. }
+
+\def\lexCats {an association list of terminal category names and
+ regular expressions (see section~\ref{lex-cats}). }
+
+\def\whiteSpace {a list of characters each of which will be ignored
+ before a token, }
+
+\def\caseSensitive {{\em true} if the case of keywords is significant,
+ {\em false} otherwise (default \em{false}). }
+
+\begin{tabular}{lp{10cm}} % \hline
+{\tt \small :name} & \name \\
+{\tt \small :package} & \package \\
+{\tt \small :identifier-start-chars} & \identifierStartChars \\
+{\tt \small :identifier-continue-chars} & \identifierContinueChars \\
+{\tt \small :intern-identifier} & \intern-identifier \\
+{\tt \small :string-delimiter} & \stringDelimiter (default \verb+#\"+) \\
+{\tt \small :symbol-delimiter} & \symbolDelimiter (default \verb+#\'+) \\
+{\tt \small :domain} & \domain \\
+{\tt \small :domain-file} & \domainFile \\
+{\tt \small :grammar} & \grammar \\
+{\tt \small :lex-cats} & \lexCats \\
+{\tt \small :white-space} & \whiteSpace (default \verb+(#\Space #\Newline
+ #\Tab)+) \\
+{\tt \small :case-sensitive} & \caseSensitive
+\end{tabular}}
+
+\index{regular expression} \index{:white-space} \index{:case-sensitive}
+
+\subsection{Defining a Domain} \label{domain} \index{domain, defining}
+
+The {\tt :domain} keyword is used to specify a type hierarchy. This
+specification will expand into {\tt defstruct} forms that implement
+this hierarchy. It is also possible to write such structure
+definitions directly into the grammar file. The argument to the {\tt
+:domain} keyword argument must be a list of the following form:
+
+\begin{tabbing}
+mm\=\=mmmmmmmmmmmmmmmmmmm\kill
+ \>(\metavar{Root Struct} \\
+ \>\>{\tt :subtype} \metavar{Struct Desc} \\
+ \>\>{\tt :subtype} \metavar{Struct Desc} \\
+ \>\> ...) \\
+\\
+ \>\metavar{Root Struct} ::= \metavar{Symbol} \\
+\\
+mm\=mmmmmmmmmmmmmmmmmmm\kill
+ \>\metavar{Struct Desc} ::= \= \metavar{Symbol} $|$ \\
+ \> \>( \metavar{Symbol} {\tt :slots} (\metavar{Slot}*) ) $|$ \\
+ \> \>( \metavar{Symbol} \= {\tt :slots} (\metavar{Slot}*) \\
+ \> \> \> {\tt :subtype} \metavar{Struct Desc} \\
+ \> \> \> {\tt :subtype} \metavar{Struct Desc} \\
+ \> \> ... )\\
+\\
+ \> \metavar{Slot} ::= \metavar{Symbol} $|$ ( \metavar{Slot Name}
+\metavar{Filler Type} ) \\
+ \> \metavar{Filler Type} ::= \metavar{Symbol naming type}
+\end{tabbing}
+
+This describes the syntax for declaring a type hierarchy with root
+node \metavar{Root Struct}. A node of the hierarchy tree can have
+children, denoted by {\tt :subtype} followed by the structure
+description of the child node. Each node can have slots, described as
+a list following {\tt :slots}. A child node inherits the slots of its
+parent node. The value of a slot can be type-restricted to
+\metavar{Filler Type}.
+
+\metavar{Root Struct} will be implemented as a structure type directly
+below the predefined structure type {\tt kb-domain}, i.e.\ ({\tt
+kb-domain-p} x) is {\em true} for any instance of a subtype of
+\metavar{Root Struct}. kb-domain is the top of the domain
+hierarchy. \index{kb-domain} \index{kb-domain-p} \index{domain, top type}
+
+The type {\tt kb-sequence} is already predefined as a subtype of
+kb-domain. It has the slots {\tt first} and {\tt rest}.
+\index{kb-sequence}
+
+Similarly, types {\tt number}, {\tt string}, and {\tt identifier} are
+predefined as subtypes of kb-domain.
+
+Two objects of type kb-domain can be compared for equality with the
+functions {\tt kb-equal} and {\tt kb-compare}. \index{kb-equal}
+\index{kb-compare}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmm\=\kill
+{\tt kb-equal} {\em a} {\em b} \>\>\>{\em function}
+\end{tabbing}
+
+{\em a} and {\em b} are assumed to be of type kb-domain. If they are
+{\tt equal} they are also {\tt kb-equal}. But in contrast to {\tt
+ equal} it is possible to define which slots are to be examined by
+{\tt kb-equal} when comparing the components of {\em a} and {\em b}.
+These relevant slots are called {\em tree attributes}, and the macro
+{\tt def-tree-attributes} is used to define these for a particular
+type. The rationale for having this equality relation is that it is
+often useful to store comments or auxiliary information with the
+feature structures produced by parsing.
+
+In feature structures the value of a relevant feature (or slot) may be
+declared to be a set (using {\tt def-tree-attributes}). If a slot has
+been declared set-valued, the {\tt kb-equal} comparison will use set
+equality for values of that slot (represented as lists).
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt def-tree-attributes} {\em type} {\em slot1} {\em slot2} .. \>\>\>{\em macro}
+\end{tabbing}
+\index{def-tree-attributes}
+
+{\tt def-tree-attributes} defines {\em slot1} {\em slot2} \ldots as
+tree attributes for instances of type {\em type}.
+
+If {\em slot} is a symbol, this symbol is defined as a tree attribute.
+Otherwise {\em slot} must be of the form ({\em symbol} :set). As
+before, the {\em symbol} becomes a tree-attribute, and furthermore it
+is declared set-valued.
+
+\paragraph{Example domain definition}
+\label{pc1}
+The grammar defined in ``pc1.zb'' accepts a simple propositional
+calculus language with sentences such as
+\begin{quote}
+ {\tt walks(agent: John)},
+\end{quote}
+which yields the following abstract syntax (printed out using the
+{\sf Common Lisp} structure printer):
+
+{\samepage \tt \begin{tabbing}
+mm\=mmmmm\kill
+ \>\#S(ATOMIC-WFF \=-PREDICATE WALKS \\
+ \> \>-ROLE-ARGUMENT-PAIRS \#S(\=ROLE-ARGUMENT-PAIR\\
+ \> \> \>-ROLE AGENT\\
+ \> \> \>-ARGUMENT JOHN) )
+ \end{tabbing}
+}
+
+The types --- such as {\tt ATOMIC-WFF} and {\tt ROLE-ARGUMENT-PAIR}
+--- are defined by the following domain declaration:
+
+{\tt \begin{tabbing}
+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ :domain (\=PC ;; PC is the root type of the hierarchy\\
+ \>:subtype (\=Formula \\
+ \> \>:subtype (Propositional-variable :slots (-name)) \\
+ \> \>:subtype \=(Boolean-Expr \\
+ \> \> \> :slots (\=(-rand1 Formula) \\
+ \> \> \> \>(-rand2 Formula)) \\
+ \> \> \>:subtype Boolean-Or \\
+ \> \> \>:subtype Boolean-And)) \\
+ \>:subtype (Boolean-Op :slots (-name)) \\
+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \>:subtype (\=Atomic-Wff \\
+ \> \>:slots (\=-predicate\\
+ \> \> \>(-Role-Argument-Pairs KB-Sequence))) \\
+ \>:subtype (Role-Argument-Pair :slots (-Role -Argument)) \\
+ \>)
+\end{tabbing}}
+
+Note the use of the predefined type KB-Sequence. It is used to
+construct the list of Role-Argument-Pairs in the following rule:
+
+{\tt \begin{verbatim}
+(defrule Role-Argument-Pairs
+ := ()
+
+ := (Role-Argument-Pair Role-Argument-Pairs)
+ :build (:type KB-Sequence
+ :map ((Role-Argument-Pair . :first)
+ (Role-Argument-Pairs . :rest)))
+ )
+ \end{verbatim}}
+
+\section{The {\sf Zebu} Meta Grammar\index{meta grammar}}
+\label{meta-grammar}
+
+Using "zebu-mg" as the {\tt :grammar} argument in the grammar
+options indicates that the following grammar is to be
+preprocessed with the grammar ``zebu-mg'' before compilation.
+\index{zebu-mg}
+
+The advantages of the meta-grammar (versus the default null-grammar)
+are a more concise representation of rules, automatic generation of
+the functions that implement the semantic actions and reversibility of
+the grammar (generation of printing functions -- the unparser).
+
+The disadvantage of using "zebu-mg" is that the semantics is limited
+to constructing typed feature structures. \index{feature structures}
+But these have great expressive power, and furthermore could
+subsequently be transformed into some other program. Typed feature
+structures are ideally suited to present abstract syntax. The fact
+that unification, specialization and generalization are well defined
+operations on feature structures, makes them appropriate for further
+transformations (by e.g.\ {\sf Zebu-RR}). For an introduction into feature
+structures see \cite{johnson:88}.
+
+Since there is a restricted way of expressing the semantics of a rule
+-- namely as a typed feature structure -- the grammar compiler will be
+able to generate code for the domain hierarchy and print-functions
+associated with each type of that domain.
+\index{print-function}
+
+"zebu-mg" is defined in terms of the null-grammar described
+above\footnote{You may study the definition of the meta grammar in
+terms of the null-grammar in the file "zebu-mg.zb".}.
+
+\paragraph {BNF description of ``zebu-mg'':}
+{\samepage \begin{tabbing}
+mmm\=mmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmmm\kill
+ \>\metavar{Zebu-Grammar}\> ::= \= \metavar{Options} \metavar{Domain-Defn}* \metavar{zb-rule} \\
+ \>\metavar{Domain-Defn} \> ::= \= \metavar{Type-name} \verb+":="+
+\metavar{Feat-Term} \\
+ \> \> \>[ \verb+"<<"+ "print-function:" Identifier \verb+">>"+ ] {\tt ";"}\\
+ \>\metavar{zb-rule} \> ::= \metavar{Non-terminal} \verb+"-->"+
+\metavar{Rhs} {\tt ";"}\\
+ \>\metavar{Rhs} \> ::= \metavar{Rhs1} \metavar{More-Rhs} $|$ \metavar{Kleene-Rhs}\\
+ \>\metavar{Rhs1} \> ::= \metavar{Constituent}* [ {\tt "\{"}
+\metavar{Semantics} {\tt "\}"} ]\\
+ \>\metavar{Constituent} \> ::= \metavar{Identifier} $|$ \metavar{String}\\
+ \>\metavar{More-Rhs} \> ::= $|$ \metavar{Rhs1} \metavar{More-Rhs}\\
+ \>\metavar{Semantics} \> ::= \metavar{Feat-Term}\\
+\end{tabbing}}
+
+
+A \metavar{Feat-Term} is a typed attribute value matrix.
+\begin{tabbing}
+mmm\=mmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmmm\kill
+ \>\metavar{Feat-Term} \> ::= [\metavar{Type-name} ":"] \metavar{Conj}\\
+ \>\metavar{Conj} \> ::= {\tt "["} \metavar{Label-value-pair} * {\tt "]"}\\
+ \>\metavar{Label-value-pair} \> ::= {\tt "("} \metavar{Identifier}
+\metavar{Feat-Term} {\tt ")"} \\
+ \>\metavar{Type-name} \> ::= \metavar{Identifier}
+\end{tabbing}
+
+\metavar{Options} is described in section~\ref{Options}.
+
+This BNF-notation makes use of
+\begin{enumerate}
+ \item star (*) for 0 or more repetitions of the preceding constituent
+ \item bar ($|$) for alternation
+ \item brackets ([]) for marking the enclosed constituents as optional
+ \item a quotation symbol (") for delimiting keywords
+\end{enumerate}
+
+The above definition is somewhat oversimplified, since it does not
+deal with the ".n" notation for \metavar{Constituent}: if on the
+right-hand side of a production a non-terminal occurs repeatedly, we
+can distinguish the occurrences by appending "." and a digit to the
+identifier. The semantics can then unambiguously refer to an
+occurrence of a constituent.
+
+The semantics is described as a typed feature structure. Names of
+variables occurring in feature term position correspond to constituent
+names in the right-hand side of the rule. The effect of applying a
+rule is to instantiate a feature structure of the type described in
+the rule semantics, substituting variables with their values.
+
+If the relation between semantics and syntax is one-to-one, the
+inverse of a parser, a printer, can be generated.
+
+\subsection {Domain Definition} \index{domain, defining}
+
+Although it is possible to specify the hierarchy of domain types using
+the {\tt :domain} keyword as in section~\ref{domain}, a more
+convenient syntax is offered by the meta above grammar rule
+\metavar{Domain-Defn}.
+
+The type definition
+\begin{quote}
+{\it atype} := {\it super}: [({\it $s_1$}) ... ({\it $s_n$})];
+\end{quote}
+will define the type {\it atype} inheriting from {\it super}, and
+having slots {\it $s_1$} through {\it $s_n$}.
+
+\begin{quote}
+{\it atype} := [({\it $s_1$}) ... ({\it $s_n$})];
+\end{quote}
+is as above but defines the type {\it atype} as a subtype of the
+top type named {\tt kb-domain}.
+
+A slot may be type restricted as in:
+\begin{quote}
+{\it atype} := {\it super}: [({\it $s_1$} {\tt KB-sequence})];
+\end{quote}
+which restricts {\it $s_1$} to be of type {\tt KB-sequence}. An
+optional {\it print-function} may be specified, as in
+\index{print-function}
+
+\begin{quote}
+{\it atype} := {\it super}: [({\it $s_1$})]
+ \verb+<<+ {\tt print-function:} {\it print-atype} \verb+>>+;
+\end{quote}
+Here we supply for {\it atype} its own printer called {\it
+print-atype} and no printer will be generated for {\it atype}.
+Usually it is not necessary to provide a print-function, but if the
+grammar is ambiguous, this is a way to force a particular canonical
+unparser.
+
+\subsection {Example Grammars}
+
+\paragraph {Example Grammar for Arithmetic Expressions}
+
+{\tt \begin{verbatim}
+(:name "arith-exp" :grammar "zebu-mg")
+
+;; Domain definition
+
+Arith-exp := Kb-domain: [];
+Factor := Arith-exp: [(-value)] <<print-function: Print-factor>>;
+Mult-op := Arith-exp: [(-arg1) (-arg2)];
+Plus-op := Arith-exp: [(-arg1) (-arg2)];
+
+;; Productions
+
+EE --> EE "+" TT { Plus-op: [(-arg1 EE) (-arg2 TT)] }
+ | TT ;
+
+TT --> TT "*" F { Mult-op: [(-arg1 TT) (-arg2 F)] }
+ | F ;
+
+F --> "(" EE ")" { factor: [(-value EE)] }
+ | IDENTIFIER { factor: [(-value IDENTIFIER)] }
+ | NUMBER { factor: [(-value NUMBER)] } ;
+
+\end{verbatim}}
+
+The semantics of the first rule says that an object of type {\tt +-op}
+should be created with slot {\tt -arg1} filled with the value of {\tt
+EE} and {\tt -arg2} filled with the value of {\tt TT}.
+
+\paragraph {Example Grammar for Propositional Calculus}
+
+This grammar defines the same domain as above (\ref{pc1}). Compiling
+it generates a parser and a generator.
+
+{\tt \begin{verbatim}
+
+(:name "pc2"
+ :package "CL-USER"
+ :grammar "zebu-mg")
+
+;; Domain definition
+
+Formula := kb-domain: [];
+
+ Propositional-variable := Formula: [(-name) ];
+ P-Formula := Formula: [(-content) ];
+ Boolean-Expr := Formula: [(-rand1 Formula) (-rand2 Formula)];
+ Boolean-Or := Boolean-Expr: [];
+ Boolean-And := Boolean-Expr: [];
+ Atomic-Wff := Formula: [(-predicate)
+ (-Role-Argument-Pairs kb-sequence)];
+
+Role-Argument-Pair := kb-domain: [(-Role) (-Argument)];
+
+;; Productions
+
+Formula --> Propositional-variable
+ | Boolean-Expr
+ | "(" Formula ")" {P-Formula:[(-content Formula)]}
+ | Atomic-Wff;
+
+Propositional-Variable
+ --> Identifier {Propositional-variable: [(-name Identifier)]};
+
+Boolean-Expr --> Formula.1 "and" Formula.2
+ {Boolean-And: [(-rand1 Formula.1)
+ (-rand2 Formula.2)]}
+
+ | Formula.1 "or" Formula.2
+ {Boolean-Or: [(-rand1 Formula.1)
+ (-rand2 Formula.2)]};
+
+Atomic-Wff --> Identifier "(" Role-Argument-Pairs ")"
+ { Atomic-Wff:
+ [(-predicate Identifier)
+ (-Role-Argument-Pairs Role-Argument-Pairs)]};
+
+Role-Argument-Pairs -->
+ | Role-Argument-Pair Role-Argument-Pairs
+ { RAP-list: [(-first Role-Argument-Pair)
+ (-rest Role-Argument-Pairs)]};
+
+Role-Argument-Pair -->
+ Identifier ":" Term
+ {Role-Argument-Pair: [(-Role Identifier)
+ (-Argument Term)]};
+
+Term --> Identifier | Number ;
+ \end{verbatim}
+}
+
+\subsection {The Kleene * Notation} \index{Kleene *}
+
+The meta-grammar ``zebu-mg'' provides an abbreviated notation for
+repeated occurrences of a non-terminal, separated by a keyword. The
+syntax for this is:
+
+\begin{tabbing}
+mmmm\=mmmmmmmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmmm\=\kill
+ \>\metavar{Kleene-Rhs} \> ::= \metavar{Identifier} {\tt *} \metavar{String} \>(1)\\
+ \>\metavar{Kleene-Rhs} \> ::= \metavar{Identifier} {\tt +} \metavar{String} \>(2)\\
+\end{tabbing}
+
+The meaning of (1) is that 0 or more occurrences of the constituent
+named by \metavar{Identifier} and separated by \metavar{String} will
+be accepted by this rule, and that the sequence of the results of
+these constituents will be returned as the semantics of
+\metavar{Kleene-Rhs}. The meaning of (2) is the same, except that at
+least one occurrence of the constituent has to be found.
+
+The semantics of a \metavar{Kleene-Rhs} production is an implicit
+kb-sequence construction. The Kleene-constituent (\metavar{Identifier}
+concatenated with {\tt *} or {\tt +}) is bound in the semantics of
+the production, e.g.
+
+{\tt \begin{verbatim}
+Disjunction --> Conjunction+ "|"
+ {Disj: [(-terms Conjunction+)]};
+ \end{verbatim}
+}
+
+builds a structure of type {\tt Disj} with the {\tt -terms} slot
+filled by the value of the Kleene-constituent {\tt Conjunction+}.
+
+\paragraph {Example grammar using Kleene * Notation} \index{Kleene *}
+
+{\tt \begin{verbatim}
+
+(:name "mini-la" :grammar "zebu-mg" )
+
+;; Domain definition
+
+Program := [(-stmts kb-sequence)];
+Application := [(-function) (-args kb-sequence)];
+
+;; rules
+
+Program --> "begin" Stmt+ ";" "end"
+ { Program: [(-stmts Stmt+)] } ;
+
+Stmt --> Identifier | Appl | Program ;
+
+Appl --> Identifier "(" Arg* " " ")"
+ {Application: [(-function Identifier) (-args Arg*)]};
+
+Arg --> Identifier | Number | Appl ;
+ \end{verbatim}
+}
+
+Compiling this grammar generates a parser/unparser (i.e.\ the printing
+routines are generated automatically).
+
+\index{read-parser}
+{\tt \begin{verbatim}
+(zb:read-parser "begin A; B ; C end"
+ :grammar (zb:find-grammar "mini-la"))
+ \end{verbatim}
+}
+
+returns a structure of type {\tt PROGRAM} which is printed in the
+syntax of ``mini-la'':
+
+{\tt \begin{verbatim}
+begin A;B;C end
+> (describe *)
+begin A;B;C end is a structure of type PROGRAM.
+It has 1 slot, with the following values:
+ -STMTS: A;B;C
+
+(describe (PROGRAM--STMTS *))
+A;B;C is a structure of type KB-SEQUENCE.
+It has 2 slots, with the following values:
+ FIRST: A
+ REST: B C
+ \end{verbatim}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Using the Compiler} \label{Compiler}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsection{Compiling a grammar}
+
+The {\sf Zebu}-compiler\footnote{For installation see appendix
+\ref{installation}.} can be called using any of the functions: {\tt
+zebu-compile-file}, {\tt compile-slr-grammar}, {\tt
+compile-lalr1-grammar}.
+
+\index{zebu-compile-file}
+\index{*warn-conflicts*} \index{*allow-conflicts*}
+\index{*check-actions*}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt zebu-compile-file} \>\>\>{\em function} \\
+ \>{\em grammar-file} {\tt \&key} {\em output-file} {\em grammar} {\em verbose}
+\end{tabbing}
+
+This compiles the LALR(1) grammar in a file named {\em grammar-file}.
+The {\em output-file} defaults to a file with the same name as {\em
+grammar-file} but type "{\tt tab}". The grammar used for compilation
+defaults to the null-grammar. If {\em verbose} is {\em true}, conflict
+warnings will be printed. {\tt zebu-compile-file} returns the
+pathname of {\em output-file}.
+
+\paragraph {Example:}
+{\tt \begin{verbatim}
+ (let ((*warn-conflicts* t)
+ (*allow-conflicts* t))
+ (zebu-compile-file "dangelse.zb"
+ :output-file "/tmp/dangelse.tab"))
+
+ ; Zebu Compiling (Version 2.0)
+ ; "~/zebu/test/dangelse.zb" to "/tmp/dangelse.tab"
+
+ Reading grammar from dangelse.zb
+
+ Start symbols is: S
+
+ 4 productions, 8 symbols
+ .........9 item sets
+ .........
+ .........
+ ;;; Warning: ACTION CONFLICT!!!-- state: 8
+ ;;; old entry: (6 :S 2) new entry: (6 :R 2)
+ ;;;
+ ;;; Warning: Continuing to build tables despite conflicts...
+ ;;; Will prefer old entry: (6 :S 2)
+
+ Dumping parse tables to /tmp/dangelse.tab
+ #P"/tmp/dangelse.tab"
+\end{verbatim}}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt *warn-conflicts*} \>\>\>{\em variable}
+\end{tabbing}
+
+If {\em true} during LALR-table construction, shift-reduce conflicts
+will be reported. By default, {\tt *warn-conflicts*} is {\em false}.
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt *allow-conflicts*} \>\>\>{\em variable}
+\end{tabbing}
+
+If {\em true} during LALR-table construction, shift-reduce conflicts will be
+resolved in favor of the old entry. By default, {\tt *allow-conflicts*}
+is {\em true}.
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt *check-actions*} \>\>\>{\em variable}
+\end{tabbing}
+
+If {\em true} the semantic action associated with a production will be
+compiled at grammar compilation time in order to display possible
+warning messages. By default, {\tt *check-actions*} is {\em false}.
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt compile-slr-grammar} {\em grammar-file} {\tt \&key} {\em output-file} {\em grammar} \>\>\>{\em function}
+\end{tabbing}
+\index{compile-slr-grammar}
+
+This is like {\tt zebu-compile-file}, but an SLR-table will be made.
+
+Example:
+{\tt \begin{verbatim}
+ (compile-slr-grammar "dangelse.zb"
+ :output-file "/tmp/dangelse.tab")
+
+ Reading grammar from dangelse.zb
+
+ Start symbols is: S
+
+ 4 productions, 8 symbols
+ .........9 item sets
+
+ Dumping parse tables to /tmp/dangelse.tab
+ #P"/tmp/dangelse.tab"
+ \end{verbatim}}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt compile-lalr1-grammar} {\em grammar-file} {\tt \&key} {\em output-file} {\em grammar} \>\>\>{\em function}
+\end{tabbing}
+\index{compile-lalr1-grammar}
+
+This is like {\tt zebu-compile-file}, but does not expand logical pathnames.
+
+Example:
+
+{\tt \begin{verbatim}
+ (compile-lalr1-grammar "dangelse.zb"
+ :output-file "/tmp/dangelse.tab")
+
+ Reading grammar from dangelse.zb
+
+ Start symbols is: S
+
+ 4 productions, 8 symbols
+ .........9 item sets
+ .........
+ .........
+ Dumping parse tables to /tmp/dangelse.tab
+ #P"/tmp/dangelse.tab"
+\end{verbatim}}
+
+\subsection{Loading a grammar}
+\index{zebu-load-file}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt zebu-load-file} {\em filename} {\tt \&key} {\em verbose} \>\>\>{\em function}
+\end{tabbing}
+
+{\em filename} should be the name of a compiled grammar file, i.e.\ a
+file of type "{\tt tab}". If such a file can be found, it will be
+loaded, returning the grammar object needed for parsing. In case a
+domain-file was generated by compiling the grammar, it will also be
+loaded. The type of the domain-file is the first for which a file
+named {\em filename}{\tt -domain}.\metavar{type} exists, by examining
+the lists
+\begin{quote}
+{\tt *load-binary-pathname-types*} and\\
+{\tt *load-source-pathname-types*}
+\end{quote}
+for .\metavar{type} in turn.
+
+ The keyword argument {\em verbose} defaults to {\em true}.
+
+\paragraph {Example:}
+{\tt \begin{verbatim}
+ (zebu-load-file "/tmp/dangelse.tab")
+ <Zebu Grammar: dangelse>
+\end{verbatim}}
+
+It is possible to have many grammars loaded concurrently. Given the name
+of a grammar, one can find a grammar that has been loaded by:
+\index{find-grammar}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt find-grammar} {\em name} \>\>\>{\em function}
+\end{tabbing}
+
+
+{\em name} must be a string. If a grammar of the same name (ignoring
+case) has been loaded, the grammar object is returned, else {\em
+false} is returned.
+
+\paragraph {Example:}
+{\tt \begin{verbatim}
+ (find-grammar "dangelse")
+ <Zebu Grammar: dangelse>
+ \end{verbatim}}
+
+\subsection{Parsing a string with a grammar}
+\index{read-parser}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt read-parser} \>\>\>{\em function} \\
+ \> {\em string} {\tt \&key} {\em grammar} {\em junk-allowed} {\em
+print-parse-errors} {\em error-fn} {\em start}
+\end{tabbing}
+
+The argument of the {\tt :grammar} keyword defaults to {\tt
+*current-grammar*} (initially bound to the null-grammar),
+e.g.
+
+\begin{tabbing}
+mm\=mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+\> {\tt (read-parser \metavm{string} :grammar (find-grammar \metavm{name}))} \\
+\\
+\> is equivalent to\\
+\\
+\> {\tt (setq zebu:*current-grammar* (find-grammar \metavm{name}))} \\
+\> {\tt (read-parser \metavm{string})}
+\end{tabbing}
+
+
+{\tt read-parser} parses the string starting at the position indicated
+by {\tt :start} (default 0).
+
+{\tt read-parser} takes the keyword argument {\tt :junk-allowed},
+which if {\em true} will return as second value an index to the
+unparsed remainder of the string in case not the entire string was
+consumed by the parse.
+
+The keyword {\tt :junk-allowed} has the same meaning as in the {\sf
+Common Lisp} function {\tt read-from-string}.
+
+{\tt :print-parse-errors} controls the printing of errors during
+parsing and defaults to {\em true}.
+
+{\tt :error-fn} is a function used to report errors, it defaults to
+the {\sf Common Lisp} {\tt error} function.
+
+\paragraph{Example:}
+
+\begin{verbatim}
+ (read-parser "if f then if g then h else i"
+ :grammar (find-grammar "dangelse"))
+ ("if" F "then" ("if" G "then" H "else" I))
+
+ (read-parser "1 + a" :grammar (find-grammar "ex1"))
+ (+OP (EXPRESSION (TERM (FACTOR 1)))
+ (TERM (FACTOR A)))
+\end{verbatim}
+
+\subsection{Parsing from a file with a grammar}
+{\samepage
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt file-parser} {\em file} {\tt \&key} {\em grammar} {\em print-parse-errors} {\em verbose} \>\>\>{\em function}
+\end{tabbing}
+\index{file-parser}
+
+{\tt file-parser} parses expressions using the
+grammar specified by {\tt :grammar}, reading from {\em file}. It
+returns a list of the parse-results, i.e.\ a list of what would have
+been returned by {\tt read-parser}. }
+
+The {\tt :grammar} argument defaults to {\tt *current-grammar*} -- which
+initially is bound to the ``null-grammar''.
+
+\index{:print-parse-errors}
+{\tt :print-parse-errors} controls the printing of errors during parsing and
+defaults to {\em true}.
+
+{\tt :verbose} controls whether printing of parse-results occurs, and
+defaults to {\em true}.
+
+The processing of comments by {\tt file-parser} can be influenced by
+the following variables:
+\index{*comment-brackets*} \index{*comment-start*}
+
+\begin{itemize}
+ \item {\tt *comment-brackets*} is a list of bracket pairs.
+ Everything between any of bracket pairs is ignored.
+ Initially {\tt *comment-brackets*} is set to:
+
+ \verb+(("#\|" . "|#"))+.
+
+ \item {\tt *comment-start*} A line beginning with this
+ character is ignored. Initially {\tt *comment-start*} is set to
+ the semicolon character: \verb+#\;+
+\end{itemize}
+
+\paragraph{Example:}
+
+{\tt \begin{verbatim}
+ (file-parser "sample-ex1" :grammar (find-grammar "ex1"))
+ ...
+\end{verbatim}}
+
+
+\subsection{Parsing from a list of tokens}
+\index{list-parser}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt list-parser} {\em token-list} {\tt \&key} {\em grammar} {\em junk-allowed} \>\>\>{\em function}
+\end{tabbing}
+
+{\tt list-parser} is like {\tt read-parser} except that the tokens
+that are passed by the scanner to the driver are already given as the
+elements of {\em token-list}. This function is useful if the options for
+controlling lexical analysis given in section~\ref{grammar-options}
+are insufficient.
+
+\paragraph {Example:}
+{\tt \begin{verbatim}
+ (let ((*current-grammar* (find-grammar "ex1")))
+ (list-parser '(1 "+" x "*" y)))
+ (+OP (EXPRESSION (TERM (FACTOR 1)))
+ (*-OP (TERM (FACTOR X)) (FACTOR Y)))
+ \end{verbatim}}
+
+\subsection{Debugging a grammar}
+\index{debug-parser}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt debug-parser} {\tt \&key} {\em grammar} {\em lexer} \>\>\>{\em function}
+\end{tabbing}
+{\tt debug-parser} will cause a trace of
+the parser to be displayed. The {\em
+ grammar} keyword defaults to {\em true}
+and {\em lexer} defaults to {\em false}.
+If {\em lexer} is {\em true}, more information about lexical analysis
+(see section \ref{lex} below) will be displayed.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section {Lexical Analysis} \label{lex}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Customization and Regular Expressions}
+\index{regular expression}
+
+It should only seldomly be necessary to write a lexical analyzer.
+Before you attempt to introduce your own lexical categories, check
+whether the following variables and keywords would suffice to
+parameterize lexical analysis:
+
+{\tt \begin{tabbing}
+mmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \>*comment-start*\\
+ \>*comment-brackets*\\
+ \>*disallow-packages*\\
+ \>*preserve-case*\\
+ \>*case-sensitive*\\
+ \>:case-sensitive\\
+ \>:identifier-start-chars\\
+ \>:identifier-continue-chars\\
+ \>:string-delimiter\\
+ \>:symbol-delimiter\\
+ \>:white-space \\
+ \>:lex-cats \\
+\end{tabbing}
+}
+\index{*comment-start*}
+\index{*comment-brackets*}
+\index{*disallow-packages*}
+\index{*preserve-case*}
+\index{*case-sensitive*}
+\index{:case-sensitive}
+\index{:identifier-start-chars}
+\index{:identifier-continue-chars}
+\index{:string-delimiter}
+\index{:symbol-delimiter}
+\index{:white-space}
+\index{:lex-cats}
+
+The lexical analyzer works in a top-down one token look-ahead way. It
+tries only to recognize tokens that would be legal continuations of
+the string parsed so far. In case lexical categories overlap this
+will serve to disambiguate tokenization.
+
+
+\subsection{Introducing new Categories by Regular Expressions}
+\label{lex-cats} \index{lexical category}
+
+The keyword {\tt :lex-cats} takes as argument an association list of
+the form:
+{\tt \begin{tabbing}
+mmmm\=mmmmmmmmmmmmmmmmmmmmmmmmmm\kill
+ \>((\metavar{Category} \metavar{Regular Expression}) *)
+ \end{tabbing}
+}
+
+\metavar{Category} is a symbol naming a lexical category and
+\metavar{Regular Expression} is a string representing a regular
+expression as defined in the GNU Emacs Lisp Manual \cite{cs:GNULisp}.
+The regular expression will be compiled into a Common Lisp function
+and invoked by {\tt read-parser} before the built-in categories
+(Identifier, String, Number) are examined. The categories can be used
+in grammar rules like any of the built-in categories.
+
+The regular expression compiler\footnote{Thanks to Lawrence E. Freil
+who wrote the main part of the Regular Expression Compiler.} handles the
+following constructs:
+
+\begin{description}
+
+\item[.] Period matches any single character except a newline.
+\item[*] repeats preceding regular expression as many times as possible.
+\item[+] like * but must match at least once.
+\item[?] like * but must match once or not at all.
+\item[{[\ldots]}] '[' begins a character set, which is terminated by ']'.\\
+ Character ranges can be indicated, e.g.\ a-z, 0-9.
+\item[{[ $\hat{}$ \ldots]}] forms the complement character set.
+\item[\$] matches only at the end of a line.
+\item[$\backslash$(\ldots $\backslash$)] is a grouping construct.
+\item[$\backslash$ \metavar{digit}] means: accept the same string as was matched
+ by the group in position \metavar{digit}.
+\end{description}
+
+\paragraph {Example:}
+
+{\tt \begin{verbatim}
+ :lex-cats ((BibTeX-in-braces "{[^\\n}]*}"))
+ \end{verbatim}}
+
+defines a new category {\tt BibTeX-in-braces} which matches anything
+starting with ``\{'', ending in ``\}'', and not containing either a
+newline or ``\}''.
+
+
+{\tt \begin{verbatim}
+ :lex-cats
+ ((Ratio_Number "-?[0-9]+/[0-9]+")
+ (Simple_Float "-?[0-9]*\\.[0-9]+"))
+ \end{verbatim}}
+
+defines the syntax for rationals and floating point numbers. Note
+that the period needs to be escaped, since it is a special character of
+the regular expression language.
+
+\subsection{The functional interface to the parsing engine}
+
+In case the above parameterization facilities for lexical analysis are
+insufficient or you want to use an existing lexical analyzer, you need
+to understand the functional interface to the parsing engine as
+implemented by the {\tt lr-parse}.
+\index{lr-parse}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt lr-parse} \>\>\>{\em function} \\
+mm\=mmmmmmmmmmmmmm\kill
+ \> {\em next-sym-fn} {\em error-fn} {\em grammar} {\tt \&optional}
+{\em junk-allowed} {\em last-pos-fn}
+\end{tabbing}
+
+{\tt lr-parse} returns the result of parsing the token stream produced
+by {\em next-sym-fn} with {\em grammar} by the LALR(1) method. In case
+{\em junk-allowed}\/ is {\em true}\/ it produces as second value a handle
+to the yet unconsumed token stream by calling the function {\em
+last-pos-fn}.
+
+{\em next-sym-fn} should be bound to a generator function --- a
+function of no arguments --- that will be called to produce the next
+token. It should return two values: (1) the token found and (2) the
+category of the token (obtained by the function {\tt categorize}).
+\index{categorize}
+
+{\em error-fn} is the function to be called in case of an error. {\em
+grammar} is the grammar object that contains important information for
+lexical analysis, (e.g.\ the table of keywords).
+
+To understand the interface to {\tt lr-parse}, consider how
+{\tt list-parser} (described above) might have been defined:
+\index{list-parser}
+
+{\tt \samepage \begin{verbatim}
+(defun list-parser (token-list &key (grammar *current-grammar*)
+ junk-allowed)
+ (let ((last-position token-list)
+ token1)
+ (check-type token-list list)
+ (lr-parse
+ ;; The LEXER supplied to the parsing engine:
+ #'(lambda ()
+ (if (null token-list)
+ (end-of-tokens-category grammar)
+ (progn
+ (setq last-position token-list
+ token1 (pop token-list))
+ (categorize token1 grammar))))
+ ;; The error function supplied to the parsing engine:
+ #'(lambda (string)
+ (error "~S~% Remaining tokens: ~S~{ ~S~}"
+ string token1 token-list))
+ grammar
+ junk-allowed
+ ;; Function that returns the remaining unparsed token-list
+ #'(lambda () last-position))))
+ \end{verbatim}
+}
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt end-of-tokens-category} {\em grammar} \>\>\>{\em function}
+\end{tabbing}
+
+{\tt end-of-tokens-category} returns two values: a token signifying
+the end of the token stream and the appropriate lexical category.
+
+
+\begin{tabbing}
+mmmmmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmmmmmm\=\kill
+{\tt categorize} {\em token} {\em grammar} \>\>\>{\em function}
+\end{tabbing}
+\index{categorize}
+
+{\tt categorize} returns the {\em token} \/ itself and its category, a
+number that represents one of {\tt number}, {\tt identifier}, {\tt
+ string} or a terminal token defined by {\tt :lex-cats}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section {Future Work}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Translation involves three processes:
+\begin{itemize}
+ \item parsing
+ \item transformation
+ \item generation
+\end{itemize}
+
+ {\sf Zebu} is a tool that helps in 1 and 3. There are cases where 2
+reduces to the identity function, since the abstract syntax is the
+same for the source and the target language of translation. Examples
+for these ``syntactic variants'' are infix and prefix notation for
+arithmetic or boolean expressions.
+
+ In general, the situation is more complicated. For languages with
+the same expressive power, some transformation process can be defined.
+Between languages with different expressive power such a
+transformation is not always possible. For a language that is not
+Turing complete, it is not possible to express every computation, e.g.
+SQL cannot express recursion, and hence it is not possible to express
+the ``ancestor'' relation (which is recursively defined). A technique
+to represent transformation are ``rewrite rule systems''. The {\sf
+Refine} language \cite{refine} contains a rewrite-rule mechanism in
+which the rules are in terms of patterns of the concrete syntax. We
+have implemented a rewrite-rule system based on typed feature
+structures, called {\sf Zebu-RR}, which will be described in a future
+report.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Appendix
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\appendix
+
+\section{Installation}
+\label{installation}
+
+There are two ways to install {\sf Zebu}:
+
+\begin{itemize}
+ \item Installation using {\tt defsystem}
+
+This makes it easier to load and compile grammars, since one does not
+need to remember the location of a module in a directory structure and
+the particular compilation and loading functions. To install, follow
+the directions in {\tt ZEBU-sys.lisp}. You need the portable {\tt
+defsys} for that. This is available as {\tt Defsys.tar.gz} at the same
+place as {\tt zebu-???.tar.gz}.
+
+The file {\tt ZEBU-sys.lisp} is used to load or compile {\sf Zebu},
+which actually consists of two systems (defined by {\tt defsystem})
+
+\begin{tabbing}
+mmmmm\=mmmmmmmmmmmmmmm\=mmmmmmmmmmmmmm\=\kill
+ \>{\sf Zebu} \>the runtime system\\
+ \>{\sf Zebu-compiler} \>the compiler\\
+\end{tabbing}
+
+ \item Installation without {\tt defsystem}\\
+If you don't want to use {\tt defsystem}, load the file {\tt
+COMPILE-ZEBU.lisp}, which compiles the {\sf Zebu} files in the right
+order.
+\index{zebu} \index{zebu-compiler}
+After loading the file {\tt ZEBU-init.lisp} you can call:
+
+ {\tt (zb:zebu)} to load the runtime system\\
+or\\
+ {\tt (zb:zebu-compiler)} to load the grammar compiler.
+\end{itemize}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\bibliography{/users/laubsch/texlib/general}
+\begin{thebibliography}{99}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\bibitem{aho:79}
+A.V. Aho and J.D. Ullman.
+\newblock {\em Principles of Compiler Design}.
+\newblock Addison Wesley, New York, 1979.
+
+\bibitem{compiler:88}
+Charles~N. Fischer and Richard~J. LeBlanc.
+\newblock {\em Crafting a Compiler}.
+\newblock Benjamin/Cummings, Menlo Park, CA, 1988.
+
+\bibitem{cs:Genesereth92}
+Michael~R. Genesereth.
+\newblock An agent-based framework for software interoperability.
+\newblock Technical Report Logic-92-02, Department Of Computer Science, Stanford
+ University, Stanford, 1992.
+
+\bibitem{cs:kif92}
+Michael~R. Genesereth, Richard Fikes, et~al.
+\newblock Knowledge interchange format, version 3.0. reference manual.
+\newblock Report Logic-92-1, Logic Group Report, Computer Science Department,
+ Stanford University, Stanford, June 1992.
+
+\bibitem{johnson:88}
+Mark Johnson.
+\newblock {\em Attribute Value Logic and the Theory of Grammar}.
+\newblock Center for the Study of Language and Information, Stanford, 1988.
+
+\bibitem{ap:refine}
+Joachim Laubsch and Derek Proudian.
+\newblock A case study in {REFINE}: interfacing modules via languages.
+\newblock Report HPL-STL-TM-88-11, Hewlett Packard, 1988.
+
+\bibitem{cs:GNULisp}
+Bill Lewis, Dan LaLiberte, and the GNU Manual~Group.
+\newblock {\em GNU Emacs Lisp Reference Manual}.
+\newblock The Free Software Foundation, Cambridge, MA, December 1990.
+
+\bibitem{refine}
+Reasoning Systems, Palo Alto, 3260 Hillview Ave., CA 94304.
+\newblock {\em Refine User's Guide}, 1989.
+
+\bibitem{ap:smith85}
+Douglas~R. Smith, Gordon~B. Kotik, and Stephen~J. Westfold.
+\newblock Research on knowledge-based software environments at {KESTREL}
+ institute.
+\newblock {\em IEEE Transactions on Software Engineering}, SE-11:1278--1295,
+ November 1985.
+
+\end{thebibliography}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{theindex}
+
+ \item *allow-conflicts*, 18
+ \item *case-sensitive*, 5, 24
+ \item *check-actions*, 18
+ \item *comment-brackets*, 23, 24
+ \item *comment-start*, 23, 24
+ \item *disallow-packages*, 5, 24
+ \item *preserve-case*, 5, 24
+ \item *warn-conflicts*, 18
+ \item :build semantic action, 6
+ \item :case-sensitive, 9, 24
+ \item :domain, 8
+ \item :domain-file, 8
+ \item :grammar, 8
+ \item :identifier-continue-chars, 8, 24
+ \item :identifier-start-chars, 8, 24
+ \item :intern-identifier, 8
+ \item :lex-cats, 8, 24
+ \item :name, 8
+ \item :package, 8
+ \item :print-parse-errors, 22
+ \item :string-delimiter, 8, 24
+ \item :symbol-delimiter, 8, 24
+ \item :white-space, 9, 24
+
+ \indexspace
+
+ \item categorize, 27
+ \item compile-lalr1-grammar, 20
+ \item compile-slr-grammar, 20
+
+ \indexspace
+
+ \item debug-parser, 23
+ \item def-tree-attributes, 11
+ \item domain
+ \subitem defining, 9, 13
+ \subitem top type, 10
+
+ \item feature structures, 12
+ \item file-parser, 22
+ \item find-grammar, 21
+
+ \indexspace
+
+ \item grammar
+ \subitem name, 8
+ \subitem options, 8
+
+ \indexspace
+
+ \item kb-compare, 10
+ \item kb-domain, 10
+ \item kb-domain-p, 10
+ \item kb-equal, 10
+ \item kb-sequence, 10
+ \item Kleene *, 5, 16, 17
+
+ \indexspace
+
+ \item lexical category, 24
+ \item list-parser, 23, 26
+ \item lr-parse, 25
+
+ \indexspace
+
+ \item meta grammar, 4, 12
+
+ \indexspace
+
+ \item non-terminal, 5
+ \subitem ``.n'' notation, 8
+ \item null-grammar, 4
+
+ \indexspace
+
+ \item option list, 8
+
+ \indexspace
+
+ \item print-actions, 8
+ \item print-function, 12, 14
+
+ \indexspace
+
+ \item read-parser, 17, 21
+ \item regular expression, 9, 23
+
+ \indexspace
+
+ \item semantic actions, 6, 7
+ \item start-symbol, 5
+
+ \indexspace
+
+ \item zebu, 28
+ \item zebu-compile-file, 18
+ \item zebu-compiler, 28
+ \item zebu-load-file, 20
+ \item zebu-mg, 12
+
+%\input{Zebu_intro.ind}
+\end{theindex}
+
+\end{document}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% End of Zebu_intro.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Added: vendor/zebu/test/arith.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/arith.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,79 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: arith.zb
+; Description: Grammar 4.19 from Dragon, p. 222
+; Author: Joachim H. Laubsch
+; Created: 8-Apr-92
+; Modified: Thu Oct 2 13:02:08 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "arith"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ "$-+*&_.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain-file "ar-dom")
+
+;; Domain definition
+
+Arith-exp := Kb-domain: [];
+Factor := Arith-exp: [(-value)] <<print-function: Print-factor>>;
+Mult-op := Arith-exp: [(-arg1) (-arg2)];
+Plus-op := Arith-exp: [(-arg1) (-arg2)];
+
+;; Productions
+
+EE --> EE "+" TT { Plus-op: [(-arg1 EE) (-arg2 TT)] }
+ | TT ;
+
+TT --> TT "*" F { Mult-op: [(-arg1 TT) (-arg2 F)] }
+ | F ;
+
+F --> "(" EE ")" { factor: [(-value EE)] }
+ | IDENTIFIER { factor: [(-value IDENTIFIER)] }
+ | NUMBER { factor: [(-value NUMBER)] } ;
+
+#||
+
+(read-parser "EE --> EE \"+\" TT { Plus-op: [(-arg1 EE) (-arg2 TT)] }
+ | TT ;" :grammar (find-grammar "zebu-mg"))
+
+(zb:compile-slr-grammar (merge-pathnames "arith.zb" *ZEBU-test-directory*)
+ :output-file (merge-pathnames
+ "binary/arith.tab" *ZEBU-test-directory*)
+ :grammar (find-grammar "zebu-mg"))
+
+(zb:zebu-load-file (merge-pathnames "binary/arith.tab" *ZEBU-test-directory*))
+(zebu::print-actions "arith")
+
+(defun print-factor (item stream level)
+ (declare (ignore level))
+ (let ((v (factor--value item)))
+ (if (or (symbolp v) (numberp v))
+ (format stream "~a" v)
+ (format stream "(~a)" v))))
+
+(equalp (list-parser '(ned "+" jed) :grammar (zb:find-grammar "arith"))
+ (read-parser "ned + jed" :grammar (zb:find-grammar "arith")))
+
+(equalp (read-parser "(ned + jed) * 4" :grammar (zb:find-grammar "arith"))
+ '#S(Mult-op
+ -ARG1 #S(FACTOR
+ -VALUE #S(PLUS-OP -ARG1 #S(FACTOR -VALUE NED)
+ -ARG2 #S(FACTOR -VALUE JED)))
+ -ARG2 #S(FACTOR -VALUE 4)))
+
+
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of arith.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/avm-p.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/test/avm-p.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,49 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: av-printers.l
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 13-Apr-92
+; Modified: Thu Oct 2 12:49:53 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "CL-USER")
+
+(defun print-FEAT-TERM (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~@[type: ~S ~][~{~S~^ ~}]"
+ (FEAT-TERM--type ITEM)
+ (FEAT-TERM--slots ITEM)))
+
+(defun print-General-Var (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "%~S"
+ (General-Var--name ITEM)))
+
+(defun print-Label-value-pair (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "(~S ~S)"
+ (Label-value-pair--label ITEM)
+ (Label-value-pair--value ITEM)))
+
+(defun PRINT-TAGGED-TERM (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~S=~S"
+ (Tagged-Term--tag ITEM)
+ (Tagged-Term--term ITEM)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of av-printers.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/avm.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/avm.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,101 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: avm.zb
+; Description: typed attribute-value language
+; Author: Joachim H. Laubsch
+; Created: 13-Apr-92
+; Modified: Thu Oct 2 12:50:10 1997 (Joachim H. Laubsch)
+; Language: Lisp
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "avm"
+ :grammar "null-grammar"
+ :package "CL-USER"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+
+;; Domain definition
+
+(defstruct (avm (:include kb-domain)))
+
+(defstruct (Feat-Term (:include avm))
+ -type -slots)
+(defstruct (Label-value-pair (:include avm))
+ -label -value)
+(defstruct (general-var (:include avm))
+ -name)
+(defstruct (tagged-term (:include avm))
+ -term -tag)
+
+;; Productions
+
+(defrule Feat-Term
+ := General-Var
+ := Untagged-Term
+ := Tagged-Term
+ )
+
+(defrule Tagged-Term
+ := ( General-Var "=" Untagged-Term )
+ :build (:type Tagged-Term
+ :map ((General-Var . :-tag)
+ (Untagged-Term . :-term))))
+
+(defrule Untagged-Term
+ := Pos-Untagged-Term
+ )
+
+(defrule Pos-Untagged-Term
+ := Identifier
+
+ := ( "type:" Identifier Conj )
+ :build (:type Feat-Term
+ :map ((Conj . :-slots)
+ (Identifier . :-type)))
+ := Conj
+ :build (:type Feat-Term
+ :map ((Conj . :-slots)))
+ )
+
+(defrule Conj
+ := ( "[" Label-value-pairs "]" )
+ :build (:form Label-value-pairs))
+
+(defrule Label-value-pair
+ := ( "(" Identifier Feat-Term ")" )
+ :build (:type Label-value-pair
+ :map ((Identifier . :-label)
+ (Feat-Term . :-value))))
+
+(defrule Label-value-pairs
+ := ()
+
+ := ( Label-value-pair Label-value-pairs )
+ :build cons
+ )
+
+(defrule General-Var
+ := ( "%" Number )
+ :build (:type General-Var
+ :map ((Number . :-name))) )
+
+#||
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zb:zebu-compile-file "avm.zb"
+ :output-file (merge-pathnames
+ "avm.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+
+ (load "avm-p"))
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of avm.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/avm1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/avm1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,77 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: avm1.zb
+; Description: typed attribute-value language
+; Author: Joachim H. Laubsch
+; Created: 13-Apr-92
+; Modified: Thu Oct 2 12:50:29 1997 (Joachim H. Laubsch)
+; Language: Lisp
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "avm1"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain-file "avm1-domain"
+)
+
+;; Domain definition
+
+Neg-Term := [(-subterm)];
+Feat-Term := [(-type) (-slots)] ;
+Label-value-pair := [(-label) (-value)];
+General-Var := [(-name)];
+Tagged-Term := [(-term) (-tag)];
+Za-Avm := [(-type)];
+
+;; Productions
+
+Feat-Term --> General-Var | Untagged-Term | Tagged-Term | Term ;
+
+Term -->
+ Number |
+ Identifier
+ {Za-Avm:[(-type Identifier)]} |
+ "(" Tagged-Term ")" ;
+
+
+Tagged-Term --> General-Var "=" Untagged-Term
+ {Tagged-Term:
+ [(-tag General-Var)
+ (-term Untagged-Term)]} ;
+
+General-Var --> "%" Number
+ {General-Var: [(-name Number)]} ;
+
+Untagged-Term --> Pos-Untagged-Term | Neg-Untagged-Term;
+
+Neg-Untagged-Term --> "~" Pos-Untagged-Term
+ {Neg-Term:[(-subterm Pos-Untagged-Term)]};
+
+Pos-Untagged-Term --> Identifier
+ | String
+ | Identifier ":" "[" Label-value-pairs "]"
+ {Feat-Term:
+ [(-type Identifier) (-slots Label-value-pairs)]}
+ | "[" Label-value-pairs "]"
+ {Feat-Term: [(-slots Label-value-pairs)]} ;
+
+Label-value-pair --> "(" Identifier Feat-Term ")"
+ {Label-value-pair:
+ [(-label Identifier) (-value Feat-Term)]} ;
+
+Label-value-pairs --> Label-value-pair * " " ;
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of avm1.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/bug-exp.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/bug-exp.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,16 @@
+(:name "bug-exp"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :lex-cats ((SIMPLEID "[a-zA-Z][_a-zA-Z0-9]*"))
+ )
+
+Underlying_type --> String_type |
+ "any junk" ;
+
+String_type --> "STRING" "(" NUMBER ")" ;
+
+
\ No newline at end of file
Added: vendor/zebu/test/bug-exp1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/bug-exp1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,16 @@
+(:name "bug-exp1"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :lex-cats ((SIMPLEID "[a-zA-Z][_a-zA-Z0-9]*"))
+ )
+
+Underlying_type --> String_type |
+ IDENTIFIER ;
+
+String_type --> "STRING" "(" NUMBER ")" ;
+
+
\ No newline at end of file
Added: vendor/zebu/test/bug-exp2.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/bug-exp2.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,17 @@
+(:name "bug-exp2"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :intern-identifier t
+ :lex-cats ((SIMPLEID "[a-zA-Z][_a-zA-Z0-9]*"))
+ )
+
+Underlying_type --> String_type |
+ SIMPLEID ;
+
+String_type --> "STRING" "(" NUMBER ")" ;
+
+
\ No newline at end of file
Added: vendor/zebu/test/bug-exp3.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/bug-exp3.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,16 @@
+(:name "bug-exp3"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :intern-identifier nil
+ )
+
+Underlying_type --> String_type |
+ Identifier ;
+
+String_type --> "STRING" "(" NUMBER ")" ;
+
+
\ No newline at end of file
Added: vendor/zebu/test/dYoung.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/test/dYoung.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,7 @@
+(cd "~/zebu")
+(load "ZEBU-init.lisp")
+(zb:zebu-compiler :compiled nil)
+(setq zb::*grammar-debug* t)
+(zb:read-parser "Program := KB-domain: [(-stmts KB-Sequence)];"
+ :grammar (zb:find-grammar "zebu-mg"))
+
\ No newline at end of file
Added: vendor/zebu/test/dangelse.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/dangelse.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,12 @@
+;;; The dangling else example of pp 228 of the old dragon book.
+(:name "dangelse" :grammar "null-grammar")
+
+;; Productions
+
+(defrule s
+ := ("if" s "then" s "else" s)
+
+ := ("if" s "then" s)
+
+ := IDENTIFIER)
+
\ No newline at end of file
Added: vendor/zebu/test/ex1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,79 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex1.zb
+; Description: Grammar 4.19 from Dragon, p. 222
+; Author: Joachim H. Laubsch
+; Created: 8-Apr-92
+; Modified: Thu Oct 2 12:51:48 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex1"
+ :domain-file "ex1-dom"
+ :package "CL-USER"
+ :grammar "null-grammar"
+ :lex-cats ((Ratio_Number "-?[0-9]+/[0-9]+")
+ (Simple_Float "-?[0-9]*\\.[0-9]+"))
+ )
+
+(defrule EE
+ := ( EE "+" TT )
+ :build (:form (LIST '+op EE TT))
+ := TT
+ :build (:form (LIST 'expression TT)))
+
+(defrule TT
+ := (TT "*" F)
+ :build (:form (LIST '*-op TT F))
+
+ := F
+ :build (:form (LIST 'term F)) )
+
+(defrule F
+ := ( "(" EE ")" )
+ :build (:form (LIST 'factor EE))
+
+ := IDENTIFIER
+ :build (:form (list 'factor IDENTIFIER))
+
+ := Numeric
+ :build (:form (list 'factor Numeric)) )
+
+(defrule Numeric
+ := NUMBER
+ := Ratio_Number
+ :build (:form (read-from-string Ratio_Number))
+ := Simple_Float
+ :build (:form (read-from-string Simple_Float)))
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(zb:compile-slr-grammar "ex1.zb" :output-file "binary/ex1.tab")
+
+(zb:zebu-load-file "binary/ex1.tab")
+(zb::print-collection nil)
+(zb::print-collection t)
+
+(zb:read-parser "b" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "1" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "1/2" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "1.2" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "(1)" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "-1.2" :grammar (zb:find-grammar "ex1"))
+
+(zb:read-parser "(b + a)" :grammar (zb:find-grammar "ex1"))
+(zb:read-parser "(1 + a)" :grammar (zb:find-grammar "ex1"))
+
+(zb::cruise-first-sets)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex1.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex1a.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex1a.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,63 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex1a.zb
+; Description: Variation of ex1 which accepts empty string
+; Author: Joachim H. Laubsch
+; Created: 8-Apr-92
+; Modified: Thu Oct 2 12:51:56 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex1a" :package "CL-USER" :grammar "null-grammar")
+
+(defrule EE
+ := ( EE "+" TT )
+ :build (:form (LIST '+op EE TT))
+ := TT
+ :build (:form (LIST 'expression TT)))
+
+(defrule TT
+ := (TT "*" F)
+ :build (:form (LIST '*-op TT F))
+
+ := F
+ :build (:form (LIST 'term F)) )
+
+(defrule F
+ := ( "(" EE ")" )
+ :build (:form (LIST 'factor EE))
+
+ := IDENTIFIER
+ :build (:form (list 'factor IDENTIFIER))
+
+ := NUMBER
+ :build (:form (list 'factor NUMBER))
+
+ := ()
+ )
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar
+ (merge-pathnames "ex1a.zb" *ZEBU-test-directory*)
+ :output-file (merge-pathnames "ex1a.tab" *ZEBU-test-binary-directory*))
+
+(zb:zebu-load-file (merge-pathnames "ex1a.tab" *ZEBU-test-binary-directory*))
+
+(zb:read-parser "" :grammar (find-grammar "ex1a"))
+(zb:read-parser "11" :grammar (find-grammar "ex1a"))
+(zb:read-parser "(b + a)" :grammar (find-grammar "ex1a"))
+
+(zb::cruise-first-sets)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex1a.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex2.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex2.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,61 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex2.zb
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 27-Mar-92
+; Modified: Thu Oct 2 12:52:05 1997 (Joachim H. Laubsch)
+; Language: ZEBU
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex2" :package "CL-USER" :grammar "null-grammar"
+ :domain-file "ex2-dom")
+
+(defrule EE
+ := (TT E-PRIME)
+ :build (:form (append TT E-PRIME)) )
+
+(defrule E-PRIME
+ := ("+" TT E-PRIME)
+ :build (:form (cons "+" (append TT E-PRIME)))
+
+ := ())
+
+(defrule TT
+ := (FF T-PRIME)
+ :build (:form (cons FF T-PRIME)) )
+
+(defrule T-PRIME
+ := ("*" FF T-PRIME)
+ :build (:form (list* "*" FF T-PRIME))
+
+ := ())
+
+(defrule FF
+ := ( "(" EE ")")
+ :build (:form EE)
+ := IDENTIFIER
+ := NUMBER
+ )
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar "ex2.zb")
+(zb:zebu-load-file "ex2.tab")
+(zebu::print-actions "ex2")
+(equal (zb:read-parser "x * y" :grammar (find-grammar "ex2"))
+ '(X "*" Y))
+(equal (zb:read-parser "(x * y) + (x * y)" :grammar (find-grammar "ex2"))
+ '((X "*" Y) "+" (X "*" Y)))
+||#
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex2.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex3.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex3.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,49 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex3.zb
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 7-Apr-92
+; Modified: Thu Oct 2 12:52:13 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex3" :grammar "null-grammar")
+
+(defrule a
+ := "b"
+ := ())
+
+(defrule c
+ := "b"
+ := ())
+
+
+(defrule d
+ := (a c a))
+
+(defrule e
+ := (a "f" a))
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar "ex3.zb")
+(zb:zebu-load-file "ex3.tab")
+
+(equal (zb:read-parser "b" :grammar (find-grammar "ex3"))
+ "b")
+
+(compile-lalr1-grammar "ex3.zb" "/tmp/ex3-lalr1.tab")
+(zb:zebu-load-file "/tmp/ex3-lalr1.tab")
+(equal (zb:read-parser "b" :grammar (find-grammar "ex3"))
+ "b")
+||#
+
+
+
\ No newline at end of file
Added: vendor/zebu/test/ex4.40.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex4.40.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,55 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex4.40.zb
+; Description: Variation on Example 3 (ex3.zb)
+; Author: Joachim H. Laubsch
+; Created: 7-Apr-92
+; Modified: Thu Oct 2 12:52:23 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex4.40" :grammar "null-grammar")
+
+(defrule a
+ := "b"
+ := ())
+
+(defrule c
+ := "b"
+ := ())
+
+
+(defrule d
+ := (a c a))
+
+(defrule e
+ := (a "f" a))
+
+#||
+(compile-slr-grammar (merge-pathnames "ex4.40.zb" *ZEBU-test-directory*))
+
+(zb:zebu-load-file (merge-pathnames "ex4.40.tab" *ZEBU-test-directory*))
+
+(zb:read-parser "b xx" :grammar (find-grammar "ex4.40")
+ :junk-allowed t)
+
+(list-parser '("b") :grammar (find-grammar "ex4.40"))
+
+(list-parser '("b" "xx") :grammar (find-grammar "ex4.40") :junk-allowed t)
+
+(equal (zb:read-parser "b" :grammar (find-grammar "ex4.40"))
+ "b")
+||#
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex4.40.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex4.41.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex4.41.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,35 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex4.41.zb
+; Description: p. 231 (Dragon)
+; Author: Joachim H. Laubsch
+; Created: 7-Apr-92
+; Modified: Thu Oct 2 12:52:33 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex4.41")
+
+(defrule S := ( B B ) )
+
+(defrule B := ( "a" B )
+ := "b" )
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar "ex4.41.zb")
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+||#
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex4.41.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex4.42.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex4.42.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,70 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: ex4.42.zb
+; Description: p. 231 (Dragon)
+; Author: Joachim H. Laubsch
+; Created: 7-Apr-92
+; Modified: Thu Oct 2 12:52:46 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "ex4.42")
+
+(defrule S := ( C C ) )
+
+(defrule C := ( "c" C )
+ := "d" )
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar "ex4.42.zb")
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+
+(zb::load-grammar "ex4.42.zb")
+(zb::make-lr0-collection)
+(zb::print-collection nil)
+(zb::print-collection t)
+
+(zb::lalr1-tables-from-grammar "ex4.42.zb")
+(zb::print-collection t)
+
+Start state index: 0
+------------------ 0 -------------------
+AUGMENTED-START -> . S { THE-END-G-SYMBOL }
+S -> . C C { THE-END-G-SYMBOL }
+C -> . c C { c d }
+C -> . d { c d }
+gotos: S -> 1 C -> 2 c -> 4 d -> 6
+------------------ 1 -------------------
+AUGMENTED-START -> S . { THE-END-G-SYMBOL }
+------------------ 2 -------------------
+S -> C . C { THE-END-G-SYMBOL }
+C -> . c C { THE-END-G-SYMBOL }
+C -> . d { THE-END-G-SYMBOL }
+gotos: C -> 3 c -> 4 d -> 6
+------------------ 3 -------------------
+S -> C C . { THE-END-G-SYMBOL }
+------------------ 4 -------------------
+C -> . c C { THE-END-G-SYMBOL c d }
+C -> c . C { THE-END-G-SYMBOL c d }
+C -> . d { THE-END-G-SYMBOL c d }
+gotos: C -> 5 c -> 4 d -> 6
+------------------ 5 -------------------
+C -> c C . { THE-END-G-SYMBOL c d }
+------------------ 6 -------------------
+C -> d . { THE-END-G-SYMBOL c d }
+NIL
+
+(zb::cruise-parse-tables)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex4.42.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex5.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex5.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,28 @@
+(:grammar "zebu-mg")
+
+;; Domain definition
+
+Program := [(-stmts kb-sequence)];
+Combination := [(-function) (-args kb-sequence)];
+Tuple := [(-members kb-sequence)];
+
+;; Rules
+
+Program --> "begin" Stmt+ "." "end"
+ { Program: [(-stmts Stmt+)] } ;
+
+Stmt --> Identifier | Appl | Program ;
+
+Appl --> Identifier "(" Arg* "," ")"
+ {Combination: [(-function Identifier) (-args Arg*)]};
+
+Arg --> Identifier | Number | Appl | Tuple ;
+
+Tuple --> "<" Arg+ " " ">"
+ { Tuple: [(-members Arg+)] };
+
+#||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of ex5.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/ex6_2.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex6_2.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,39 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+(:name "ex6_2"
+ :domain-file "ex6-dom"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "_-=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ )
+
+;; Domain definition
+
+ assignment := [(-lhs) (-rhs)];
+ locative := [(-path)];
+
+;; Productions
+
+ S --> L "=" R {assignment: [(-lhs L) (-rhs R)]}
+ | R ;
+
+ L --> "*" R {locative: [(-path R)]}
+ | Identifier;
+
+ R --> NUMBER
+ | L;
+
+
+#||
+(ds:compile-module "ex6_2")
+(ds:load-module "ex6_2")
+(read-parser "foo = 0" :grammar (find-grammar "ex6_2"))
+(type-of (read-parser "**foo = ***x" :grammar (find-grammar "ex6_2")))
+(equalp (ASSIGNMENT--lhs
+ (read-parser "**foo = ***x" :grammar (find-grammar "ex6_2")))
+ (read-parser "**foo" :grammar (find-grammar "ex6_2")))
+||#
+
+
+
\ No newline at end of file
Added: vendor/zebu/test/ex7.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex7.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,30 @@
+(:name "ex5"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :lex-cats ((BEGIN "begin")
+ (END "end")
+ (Id2 "[-a-zA-Z][-$_a-zA-Z0-9]*")
+ ))
+
+
+;; Domain definition
+
+ Program := [(-stmts kb-sequence)];
+ Combination := [(-function) (-args kb-sequence)];
+ Tuple := [(-members kb-sequence)];
+
+;; Rules
+
+ Program --> BEGIN Stmt+ ";" END
+ { Program: [(-stmts Stmt+)] } ;
+
+ Stmt --> Id2 | Appl | Program ;
+
+ Appl --> Identifier "(" Arg* "," ")"
+ {Combination: [(-function Identifier) (-args Arg*)]};
+
+ Arg --> Identifier | Number | Appl | Tuple ;
+
+ Tuple --> "<" Arg+ " " ">"
+ { Tuple: [(-members Arg+)] };
+
\ No newline at end of file
Added: vendor/zebu/test/ex8.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/ex8.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,6 @@
+(:name "ex8" :package "USER" :grammar "zebu-mg")
+
+_root := [(ids kb-sequence)];
+
+starttoken --> IDENTIFIER+ " " {_root:[(ids IDENTIFIER+)]};
+
\ No newline at end of file
Added: vendor/zebu/test/exercise.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/test/exercise.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,918 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: exercise.lisp
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 26-Mar-92
+; Modified: Wed Jan 13 13:41:01 1999 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "CL-USER")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; pathnames
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(unless (boundp '*ZEBU-directory*)
+ (setq *ZEBU-directory*
+ (make-pathname :directory (butlast (pathname-directory *LOAD-TRUENAME*)))
+ ))
+
+(setq *ZEBU-binary-directory*
+ (make-pathname :directory (append (pathname-directory *ZEBU-directory*)
+ (list "binary"))))
+
+(defparameter *ZEBU-test-directory*
+ (make-pathname :directory (append (pathname-directory *ZEBU-directory*)
+ (list "test"))))
+
+(defparameter *ZEBU-test-binary-directory*
+ (make-pathname :directory (append (pathname-directory *ZEBU-test-directory*)
+ (list "binary"))))
+
+(defparameter *ZEBU-compile-domain*
+ #+(or :ALLEGRO :HARLEQUIN-PC-LISP) nil
+ #-(or :ALLEGRO :HARLEQUIN-PC-LISP) t)
+
+#+DEFSYS
+(let ((*default-pathname-defaults* *ZEBU-directory*))
+ (require "ZEBU-sys")
+ (ds:compile-system 'Zebu-compiler)
+ (ds:load-system 'Zebu-compiler)
+ (ds:load-system 'Zebu-rr)
+ (use-package (find-package "ZEBU")
+ (find-package "CL-USER"))
+)
+
+#-DEFSYS
+(let ((*default-pathname-defaults* *ZEBU-directory*))
+ (load (make-pathname :name "ZEBU-init" :type "lisp"))
+ (zb:zebu-compiler :compiled *ZEBU-compile-domain*)
+ (zb:zebu-rr :compiled *ZEBU-compile-domain*)
+)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ex1
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+#+DEFSYS
+(progn (ds:compile-module "ex1") (ds:load-module "ex1"))
+#-DEFSYS
+(progn
+ (zebu-compile-file (merge-pathnames
+ (make-pathname :name "ex1" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "ex1" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+
+ (zb:zebu-load-file (merge-pathnames
+ (make-pathname :name "ex1" :type "tab")
+ *ZEBU-test-binary-directory*)))
+(setq zebu:*current-grammar* (find-grammar "ex1"))
+(format t "Grammar: ~S" zebu:*current-grammar*)
+
+(let ((l '(1 "+" a foo bar)))
+ (multiple-value-bind (v rest)
+ (list-parser l :junk-allowed t)
+ (unless (and (equal v '(+OP (EXPRESSION (TERM (FACTOR 1)))
+ (TERM (FACTOR A))))
+ (eq rest (nthcdr 3 l)))
+ (warn "list-parser broken"))))
+
+(handler-case (equal (list-parser '(1 "+" a ) )
+ (read-parser "1 + a"))
+ (error () 'ok)
+ (:no-error (&rest args) args))
+
+(if (and
+ (equal (read-parser "1 + a")
+ '(+OP (EXPRESSION (TERM (FACTOR 1)))
+ (TERM (FACTOR A))))
+ (equal (read-parser "1 + a") (read-parser "1 + a dd" :junk-allowed t))
+ (equal (list-parser '(1 "+" a foo bar) :junk-allowed t)
+ (read-parser "1 + a foo bar" :junk-allowed t))
+ (equal (read-parser ".1 + 1/3") (read-parser "0.1 + 1/3"))
+ (equal (read-parser "1 + a") (list-parser '(1 "+" a)))
+ (equal (read-parser "1 + 1") (list-parser '(1 "+" 1)))
+ (equal (read-parser "1 + x * y") (list-parser '(1 "+" x "*" y)))
+ (equal (read-parser "(1 + x) * y") (list-parser '("(" 1 "+" x ")" "*" y))))
+ (print 'ok)
+ (warn "error parsing with grammar ex1"))
+
+(zb:FILE-PARSER (merge-pathnames "sample-ex1" *ZEBU-test-directory*)
+ :grammar (zb:find-grammar "ex1"))
+
+(zebu::cruise-follow-sets)
+(zebu::print-productions)
+
+(compile-slr-grammar
+ (merge-pathnames "ex1a.zb" *ZEBU-test-directory*)
+ :output-file (merge-pathnames "ex1a.tab" *ZEBU-test-binary-directory*))
+(zb:zebu-load-file (merge-pathnames "ex1a.tab" *ZEBU-test-binary-directory*))
+
+(unless (zb:read-parser "" :grammar (find-grammar "ex1a"))
+ (warn "error with grammar ex1a, given an empty string"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; meta-grammar test
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(unless (equal (zb::grammar-identifier-start-chars (zb:find-grammar "zebu-mg"))
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
+ (warn "zebu-mg"))
+
+(zb:read-parser "Program := KB-domain: [(-stmts KB-Sequence)];"
+ :grammar (zb:find-grammar "zebu-mg"))
+
+(zb:read-parser "Program := [(-stmts KB-Sequence)];"
+ :grammar (zb:find-grammar "zebu-mg"))
+
+(zb:read-parser "Arith-exp := Kb-domain : [];"
+ :grammar (zb:find-grammar "zebu-mg"))
+
+(zb:read-parser "Factor := Arith-exp : [(-value)];"
+ :grammar (zb:find-grammar "zebu-mg"))
+
+(zb:read-parser "Program --> \"begin\" Stmts \"end\"
+ { Program: [(-stmts Stmts)
+ (-label \"bar\")] } ;"
+ :grammar (zb:find-grammar "zebu-mg"))
+
+(unless (equalp
+ (zb:read-parser "Program --> \"begin\" Stmts \"end\"
+ { Program: [(-stmts Stmts)] } ;"
+ :grammar (zb:find-grammar "zebu-mg"))
+ '#S(ZEBU::ZB-RULE
+ -NAME PROGRAM
+ -PRODUCTIONS (#S(ZEBU::PRODUCTION-RHS
+ -SYNTAX ("begin" STMTS "end")
+ -SEMANTICS #S(ZEBU::FEAT-TERM
+ -TYPE PROGRAM
+ -SLOTS (#S(ZEBU::LABEL-VALUE-PAIR
+ -LABEL -STMTS
+ -VALUE STMTS)))
+ -BUILD-FN NIL))))
+ (warn "zebu-mg 1"))
+
+(with-open-file (s (merge-pathnames "arith.zb" *ZEBU-test-directory*))
+ (read s)
+ (zb::file-parser-aux s #'error t (zb:find-grammar "zebu-mg") t))
+
+
+#+DEFSYS (ds:compile-module "arith")
+#-DEFSYS
+(zebu-compile-file (merge-pathnames "arith" *ZEBU-test-directory*)
+ :output-file (merge-pathnames
+ "arith" *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+
+(compile-file
+ (merge-pathnames (make-pathname :name "ar-dom"
+ :type (car *load-source-pathname-types*))
+ *ZEBU-test-directory*)
+ :output-file (merge-pathnames
+ "ar-dom" *ZEBU-test-binary-directory*))
+
+(defun PRINT-FACTOR (item STREAM LEVEL)
+ (FORMAT STREAM "~a" (factor--value item)))
+#+DEFSYS
+(ds:load-module "arith")
+#-DEFSYS
+(zebu-load-file (merge-pathnames (make-pathname :name "arith" :type "tab")
+ *ZEBU-test-binary-directory*))
+(zebu::print-actions "arith")
+
+(unless (and (equalp (list-parser '(ned "+" jed)
+ :grammar (zb:find-grammar "arith"))
+ (read-parser "ned + jed"
+ :grammar (zb:find-grammar "arith")))
+
+ (equalp (read-parser "(ned + jed) * 4"
+ :grammar (zb:find-grammar "arith"))
+ '#S(Mult-OP
+ -ARG1 #S(FACTOR
+ -VALUE #S(Plus-OP -ARG1 #S(FACTOR -VALUE NED)
+ -ARG2 #S(FACTOR -VALUE JED)))
+ -ARG2 #S(FACTOR -VALUE 4))))
+ (warn "arith did not compile correctly"))
+
+(defun print-factor (item stream level)
+ (declare (ignore level))
+ (let ((v (factor--value item)))
+ (if (or (symbolp v) (numberp v))
+ (format stream "~a" v)
+ (format stream "(~a)" v))))
+
+(unless (string= (with-output-to-string (s)
+ (prin1
+ (read-parser "(ned + jed) * 4"
+ :grammar (zb:find-grammar "arith"))
+ s))
+ "(NED + JED) * 4")
+ (warn "printing for arith failed"))
+
+;; mini-la
+(let ((zebu:*allow-conflicts* t)
+ (*generate-domain* t))
+ (compile-slr-grammar
+ (merge-pathnames "mini-la.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "mini-la.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+ )
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "mini-la.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+(unless (typep (zb::read-parser "begin a end" :grammar (zb:find-grammar "mini-la"))
+ 'program)
+ (warn "failed to parse with mini-la: 1"))
+
+(unless (typep (zb::read-parser "begin A; B ; C end"
+ :grammar (zb:find-grammar "mini-la"))
+ 'program)
+ (warn "failed to parse with mini-la: 2"))
+
+(unless (typep (zb::read-parser "begin A; begin B1; B2 end ; C end"
+ :grammar (zb:find-grammar "mini-la"))
+ 'program)
+ (warn "failed to parse with mini-la: 3"))
+
+(let ((s " begin F({1,2,4}) end"))
+ (equal (format nil "~s" (zb::read-parser s))
+ s)
+ )
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ex6_2
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zebu-compile-file "ex6_2.zb"
+ :output-file (merge-pathnames "ex6_2.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*)
+ (setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "ex6_2.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+ )
+(unless (and (let ((zb:*preserve-case* t))
+ (string= (format nil "~s" (read-parser "foo = 0"))
+ "foo = 0"))
+ (eq (type-of (read-parser "**foo = ***x")) 'ASSIGNMENT)
+ (equalp (ASSIGNMENT--lhs
+ (read-parser "**foo = ***x"))
+ (read-parser "**foo")))
+ (warn "Grammar ex6_2 did not compile correctly"))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ex2
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#+DEFSYS
+(progn (compile-module "ex2") (load-module "ex2"))
+
+#-DEFSYS
+(progn
+ (zebu-compile-file (merge-pathnames
+ (make-pathname :name "ex2" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "ex2" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*
+ :verbose t)
+
+ (zb:zebu-load-file (merge-pathnames
+ (make-pathname :name "ex2" :type "tab")
+ *ZEBU-test-binary-directory*)))
+
+(setq zebu:*current-grammar* (find-grammar "ex2"))
+(format t "Grammar: ~S" zebu:*current-grammar*)
+
+(zebu::print-productions)
+(zebu::cruise-follow-sets)
+(zebu::print-actions (zebu::grammar-name zebu:*current-grammar*))
+
+(and
+ (equal (read-parser "G") (list-parser '(G)))
+ (equal (read-parser "(G)") (list-parser '( "(" G ")" )))
+ (equal (read-parser "(((P)))") '((((P)))))
+ (equal (read-parser "(F + 3 + 1)") '((F "+" 3 "+" 1)))
+ (equal (read-parser "(F + 3 * (2 + 1))") '((F "+" 3 "*" (2 "+" 1))))
+ (equal (read-parser "(F + 3) * (2 + 1)") '((F "+" 3) "*" (2 "+" 1)))
+ (equal (read-parser "((F + 3) * 2) + 1") '(((F "+" 3) "*" 2) "+" 1))
+ (equal (list-parser '(ned "+" "(" jed "*" fred ")"))
+ '(NED "+" (JED "*" FRED)))
+ (print 1))
+
+(and
+ (let (zebu:*current-grammar*)
+ (equal (read-parser "ned + jed" :grammar (find-grammar "ex2"))
+ (list-parser '(ned "+" jed ) :grammar (find-grammar "ex2"))))
+
+ (equal (read-parser "ned + jed" :grammar (find-grammar "ex2"))
+ (list-parser '(ned "+" jed ) :grammar (find-grammar "ex2")))
+ (print 2))
+
+#+DEFSYS
+(progn (compile-module "ex3") (load-module "ex3"))
+#-DEFSYS
+(progn
+ (zebu-compile-file (merge-pathnames
+ (make-pathname :name "ex3" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "ex3" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+
+ (zb:zebu-load-file (merge-pathnames
+ (make-pathname :name "ex3" :type "tab")
+ *ZEBU-test-binary-directory*)))
+
+(and
+ (equal (read-parser "b" :grammar (find-grammar "ex3")) "b")
+ (null (read-parser "" :grammar (find-grammar "ex3")))
+ (print 3))
+
+#+DEFSYS
+(progn
+ (compile-module "useless")
+ (load-module "useless")
+ (setq zebu:*current-grammar* (zb:find-grammar "useless"))
+ )
+
+#+DEFSYS
+(progn (compile-module "lr4-21") (load-module "lr4-21"))
+
+#-DEFSYS
+(progn
+ (zebu-compile-file (merge-pathnames
+ (make-pathname :name "lr4-21" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "lr4-21" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+
+ (zb:zebu-load-file (merge-pathnames
+ (make-pathname :name "lr4-21" :type "tab")
+ *ZEBU-test-binary-directory*)))
+
+(setq zebu:*current-grammar* (zb:find-grammar "lr4-21"))
+(read-parser "foo = 0")
+(read-parser "foo = x")
+
+(read-parser "*foo = x")
+(read-parser "*0 = x")
+(read-parser "**foo = ***x")
+
+
+(zb:zebu-load-file
+ (compile-slr-grammar (merge-pathnames "ex4.40.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames
+ "ex4.40.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+; this should print warnings
+; The following non-terminals where defined but not used: D E
+(equal (zb:read-parser "b" :grammar (find-grammar "ex4.40"))
+ "b")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Propositional Calculus
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((zebu:*allow-conflicts* t)
+ (*generate-domain* t))
+ (compile-lalr1-grammar
+ (merge-pathnames "pc1.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "pc1.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :verbose t)
+ (load (merge-pathnames "pc1-dom.lisp" *ZEBU-TEST-DIRECTORY*))
+ (load (merge-pathnames "pc1-p.lisp" *ZEBU-TEST-DIRECTORY*))
+ (zebu-load-file (merge-pathnames "pc1.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+ (setq zebu:*current-grammar* (zb:find-grammar "pc1"))
+ )
+
+(unless (and
+ (eq (type-of (read-parser "P")) 'PROPOSITIONAL-VARIABLE)
+ (type-of (read-parser "P and Q"))
+ (string= (format nil "~s" (read-parser "P and Q"))
+ "P and Q"))
+ (warn "pc1 didn't compile correctly"))
+
+(read-parser "P and Q and R")
+(read-parser "P and Q or R and S")
+(read-parser "(P and Q) or R and S")
+(read-parser "P and (Q or R) and S")
+(string= (format nil "~s" (read-parser "P(a: 1 b:S)"))
+ "P(A: 1 B: S)")
+(let ((zb:*preserve-case* t))
+ (unless (string= (format nil "~s" (read-parser "P(a: 1 b:S)"))
+ "P(a: 1 b: S)")
+ (warn "Printing with grammar pc1 failed")))
+
+(let ((zb:*preserve-case* nil))
+ (unless (string= (format nil "~s" (read-parser "walks(agent: John)"))
+ "WALKS(AGENT: JOHN)")
+ (warn "Printing with grammar pc1 failed")))
+
+(zebu::print-actions "pc1")
+(zebu::print-productions)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; dangling else
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((zebu:*allow-conflicts* t) (zebu:*warn-conflicts* t))
+ (zebu-load-file
+ (compile-lalr1-grammar
+ (merge-pathnames "dangelse.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "dangelse.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*))))
+
+(unless (equal (read-parser "if f then if g then h else i"
+ :grammar (find-grammar "dangelse"))
+ '("if" F "then" ("if" G "then" H "else" I)))
+ (warn "error in dangelse grammar"))
+
+(defpackage "ZEBU-TEST"
+ #-LUCID (:use "COMMON-LISP")
+ #+LUCID (:use "LUCID-COMMON-LISP")
+ )
+
+#+DEFSYS
+(progn (compile-module "pc2") (load-module "pc2")
+ )
+
+#-DEFSYS
+(zebu-load-file
+ (compile-lalr1-grammar
+ (merge-pathnames "pc2.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "pc2.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+(def-tree-attributes Atomic-Wff
+ Atomic-Wff--predicate
+ )
+
+(def-tree-attributes Role-Argument-Pair
+ Role-Argument-Pair--Role
+ Role-Argument-Pair--Argument)
+
+(def-tree-attributes Boolean-And
+ Boolean-Expr--rand1
+ Boolean-Expr--rand2)
+
+(zebu-load-file
+ (merge-pathnames "pc1.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*))
+
+
+(or (kb-equal (zb:read-parser "walks(agent: John)"
+ :grammar (zb:find-grammar "pc1"))
+ (zb:read-parser "walks(agent: John)"
+ :grammar (zb:find-grammar "pc2")))
+ (warn "error in grammar pc2: 1"))
+
+(def-tree-attributes Atomic-Wff
+ Atomic-Wff--Role-Argument-Pairs
+ )
+
+(and (kb-equal (zb:read-parser "walks(agent: John)" :grammar (zb:find-grammar "pc1"))
+ (zb:read-parser "walks(agent: Joe)" :grammar (zb:find-grammar "pc2")))
+ (warn "error in grammar pc2: 2"))
+
+(or (kb-equal (zb:read-parser "walks(agent: John) and talks(agent: John)"
+ :grammar (zb:find-grammar "pc1"))
+ (zb:read-parser "walks(agent: John) and talks(agent: John)"
+ :grammar (zb:find-grammar "pc2")))
+ (warn "error in grammar pc2: 3"))
+
+(unless (typep (zb:read-parser "walks(agent: John) and talks(agent: John) and Q"
+ :grammar (zb:find-grammar "pc2"))
+ 'BOOLEAN-AND)
+ (warn "error in grammar pc2: 4"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; recompile NLL grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#+(and DEFSYS (not (or MCL cmu)))
+(let ((nll-sys (probe-file (merge-pathnames
+ "NLL-sys.l"
+ (make-pathname :directory
+ (append (butlast (pathname-directory
+ *ZEBU-directory*))
+ (list "nll")))))))
+ (when nll-sys
+ (load nll-sys)
+ (let (zebu:*warn-conflicts* (zebu:*allow-conflicts* t))
+ (compile-module "nll-grammar"))
+ (load-system 'NLL-test) )
+
+ (load-module "test-nll-syntax-1")
+ (load-module "test-nll-syntax-2")
+ (load-module "nll-simplify-test-1")
+ (load-module "nll-simplify-test-2")
+ (load-module "drt-to-lgq-test"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; avm grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zb:zebu-compile-file "avm.zb"
+ :output-file (merge-pathnames
+ "avm.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*)
+
+ (load (merge-pathnames
+ (make-pathname :name "avm-p"
+ :type (car *load-source-pathname-types*)))))
+
+(zb:zebu-load-file
+ (merge-pathnames "avm.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+
+(unless (and
+ (equalp (zb:read-parser "[(s1 v1) (s2 v2)]" :grammar (find-grammar "avm"))
+ '#S(FEAT-TERM
+ -TYPE NIL
+ -SLOTS (#S(LABEL-VALUE-PAIR -LABEL S1 -VALUE V1)
+ #S(LABEL-VALUE-PAIR -LABEL S2 -VALUE V2))))
+ (equalp (zb:read-parser "[(s1 v1) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm"))
+ '#S(FEAT-TERM
+ -TYPE NIL
+ -SLOTS (#S(LABEL-VALUE-PAIR -LABEL S1 -VALUE V1)
+ #S(LABEL-VALUE-PAIR
+ -LABEL S2
+ -VALUE #S(TAGGED-TERM
+ -TERM V2
+ -TAG #S(GENERAL-VAR -NAME 1)))
+ #S(LABEL-VALUE-PAIR
+ -LABEL S3
+ -VALUE #S(GENERAL-VAR -NAME 1)))))
+ (equalp (zb:read-parser "type: foo [(s1 v1) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm"))
+ '#S(FEAT-TERM -TYPE FOO
+ -SLOTS (#S(LABEL-VALUE-PAIR -LABEL S1 -VALUE V1)
+ #S(LABEL-VALUE-PAIR -LABEL S2
+ -VALUE #S(TAGGED-TERM -TERM V2
+ -TAG #S(GENERAL-VAR -NAME 1)))
+ #S(LABEL-VALUE-PAIR -LABEL S3
+ -VALUE #S(GENERAL-VAR -NAME 1)))))
+ (equalp (zb:read-parser "%0 = type: foo [(s1 %0) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm"))
+ '#S(TAGGED-TERM
+ -TERM #S(FEAT-TERM
+ -TYPE FOO
+ -SLOTS (#S(LABEL-VALUE-PAIR
+ -LABEL S1
+ -VALUE #S(GENERAL-VAR -NAME 0))
+ #S(LABEL-VALUE-PAIR
+ -LABEL S2
+ -VALUE #S(TAGGED-TERM
+ -TERM V2
+ -TAG #S(GENERAL-VAR -NAME 1)))
+ #S(LABEL-VALUE-PAIR
+ -LABEL S3
+ -VALUE #S(GENERAL-VAR -NAME 1))))
+ -TAG #S(GENERAL-VAR -NAME 0))))
+ (warn "avm grammar did not compile correctly"))
+
+
+(let ((*load-verbose* t))
+ (zb:zebu-compile-file
+ (merge-pathnames "avm1.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "avm1.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+;;(zebu::print-actions "avm1")
+(zb:zebu-load-file
+ (merge-pathnames "avm1.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+(zb:read-parser "[(s1 v1) (s2 v2)]" :grammar (find-grammar "avm1"))
+(zb:read-parser "foo: [(s1 v1) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser "foo: [(s1 v1) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser "foo: []"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser " []"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser " [( s1 \"foo\" )]"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser " [( s1 \"foo\\\"bar\" )]"
+ :grammar (find-grammar "avm1"))
+(zb:read-parser "foo : [(s1 [(s1 v1)]) (s2 %1= v2) (s3 %1)]"
+ :grammar (find-grammar "avm1"))
+
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zb:file-parser "sample-avm1" :grammar (find-grammar "avm1")))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; fs-grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(zebu-compile-file (merge-pathnames
+ (make-pathname :name "fsg" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "fsg" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+(zebu-load-file
+ (merge-pathnames "fsg.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+
+(read-parser " (:type ATOMIC-WFF) [(PRED walk) (AGENT peter)] "
+ :grammar (find-grammar "tfs-g2"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; tdl grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(zebu-compile-file (merge-pathnames
+ (make-pathname :name "hh-tdl" :type "zb") *ZEBU-test-directory*)
+ :output-file
+ (merge-pathnames
+ (make-pathname :name "hh-tdl" :type "tab")
+ *ZEBU-test-binary-directory*)
+ :compile-domain *ZEBU-compile-domain*)
+(zebu-load-file
+ (merge-pathnames "hh-tdl.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+(file-parser (merge-pathnames
+ (make-pathname :name "hh-test" :type "tdl") *ZEBU-test-directory*)
+ :grammar (find-grammar "hh-tdl"))
+
+(read-parser
+ "index := *avm* &
+ [ PERSON person,
+ NUMBER number,
+ GENDER gender]."
+ :grammar (find-grammar "hh-tdl"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Regular Expression Compiler
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((*load-verbose* t))
+ (load (merge-pathnames "regextst.lisp" *ZEBU-TEST-DIRECTORY*))
+
+ (zb:zebu-compile-file
+ (merge-pathnames "pb.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames
+ "pb.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+(zb:zebu-load-file
+ (merge-pathnames "pb.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+
+(unless (equal (zb:read-parser "FOO : bar."
+ :grammar (find-grammar "pb"))
+ '("FOO" BAR))
+ (warn "Didn't parse pb grammar expression."))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Phone-and-E-Mail
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*)
+ (*load-verbose* t))
+ (zb:zebu-compile-file "lieber.zb"
+ :output-file (merge-pathnames
+ "lieber.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+(defclass e-mail-address ()
+ ((person :initarg :person :accessor person) (host :initarg :host :accessor host)))
+
+(defclass host () ((domain-path :initarg :domain-path :accessor domain-path)))
+
+(defclass phone-number ()
+ ((area-code :initarg :area-code :accessor area-code) (exchange :initarg :exchange :accessor exchange)
+ (extension :initarg :extension :accessor extension)))
+
+(zb:zebu-load-file
+ (merge-pathnames "lieber.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+
+(find-grammar "Phone-and-E-Mail")
+
+
+;; This doesn't work...
+(read-parser
+ "My name is Henry, my address is lieber at media.mit.edu and you can call me at (617) 253-0315"
+ :grammar (find-grammar "Phone-and-E-Mail"))
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; BibTeX
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#+HP300
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*)
+ (*load-verbose* t))
+ (zb:zebu-compile-file "bibtex.zb"
+ :output-file (merge-pathnames
+ "bibtex.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+#+HP300
+(let ((*default-pathname-defaults* *ZEBU-TEST-BINARY-DIRECTORY*))
+ (zb:zebu-load-file "bibtex.tab"))
+
+#+HP300
+(read-parser "@TechReport{allen81a,
+key\"allen81a\",
+author \"ALLEN, J.F.\",
+title \"Maintaining Knowledge About Temporal Intervals, TR 86\",
+institution \"University of Rochester, Department of Computer Science\",
+year \"1981\"}" :grammar (find-grammar "bibtex"))
+#+HP300
+(progn
+ (file-parser "~/notes/lit/bib/time.bib" :grammar (find-grammar "bibtex")
+ :print-parse-errors t :verbose nil)
+
+ (file-parser "~/notes/lit/bib/functional-lang.bib" :grammar (find-grammar "bibtex")
+ :print-parse-errors t :verbose nil)
+
+
+ (file-parser "~/notes/lit/bib/cs.bib" :grammar (find-grammar "bibtex")
+ :print-parse-errors t :verbose nil)
+
+ (file-parser "~/notes/lit/bib/planning.bib" :grammar (find-grammar "bibtex")
+ :print-parse-errors t :verbose nil))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; zebra-grammar.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#+HP300
+(defvar *ZEBRA-DIRECTORY*
+ (let ((d (pathname-directory *ZEBU-TEST-DIRECTORY*)))
+ (make-pathname :directory (append (subseq d 0 (- (length d) 2))
+ (list "zebra" "zebra-release")))))
+#+HP700
+(defvar *ZEBRA-DIRECTORY*
+ (let ((d (pathname-directory *ZEBU-TEST-DIRECTORY*)))
+ (make-pathname :directory (list "zebra" "zebra-release"))))
+
+
+
+#+(OR :HP300 :HP700)
+(when (and (boundp '*ZEBRA-DIRECTORY*) (probe-file *ZEBRA-DIRECTORY*))
+ (let ((*default-pathname-defaults* *ZEBRA-DIRECTORY*)
+ (*load-verbose* t))
+ (load "ZEBRA-system"))
+ )
+
+#+(OR :HP300 :HP700)
+(progn
+(compile-system "ZEBRA")
+(load-system "ZEBRA")
+
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*)
+ (*load-verbose* t))
+ (zb:zebu-compile-file "zebra-grammar.zb"
+ :output-file (merge-pathnames
+ "zebra-grammar.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*)
+ (*load-verbose* t))
+ (zb:zebu-load-file (merge-pathnames "zebra-grammar.tab"
+ *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+(zb:read-parser "Rule string2terminal :=
+ #1 stringp(#1) --> terminal:[(-string #1)];"
+ :grammar (zb:find-grammar "zebra-grammar"))
+
+(defun zebra-read-string (s)
+ (zb:read-parser s :grammar (zb:find-grammar "zebra-grammar")))
+
+(zebra-read-string "Rule string2terminal :=
+ #1 stringp(#1) --> terminal:[(-string #1)];")
+(zebra-read-string "Rule R1 := bar:[(-slot {...})] --> baz:[(-slot {a,b})]; ")
+(zebra-read-string "rule t1 := a:[] --> test:[];")
+(zebra-read-string "rule t1 := a --> test:[];")
+(zebra-read-string "rule t1 := a --> [test];")
+(zebra-read-string "rule t1 := a --> b;")
+
+(setq zebu:*current-grammar* (zb:find-grammar "zebra-grammar"))
+;;(zebu::print-collection nil)
+(zebu::print-productions)
+
+(let ((zb:*preserve-case* t))
+ (zebra-read-string "Rule t1:=a --> test;"))
+
+(let ((zb:*preserve-case* t)
+ (s " Rule t1:=a --> test;"))
+ (string= s (format nil "~a" (zebra-read-string s))))
+
+;;(zb:file-parser (merge-pathnames "zebra-parser.za" *ZEBU-TEST-DIRECTORY*))
+)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; time
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#+(and LUCID HP300)
+(let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zb:zebu-load-file
+ (zb:zebu-compile-file "time.zb"
+ :output-file (merge-pathnames
+ "time.tab" *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+
+ )
+#+(and LUCID HP300)
+(progn
+ (zebu::print-actions "time")
+ (zebu::print-productions))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Kleene+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((zebu:*allow-conflicts* t)
+ (*generate-domain* t))
+ (compile-slr-grammar (merge-pathnames "ex5.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "ex5.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+ )
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "ex5.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; circular print
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((zebu:*allow-conflicts* t)
+ (*generate-domain* t))
+ (compile-slr-grammar (merge-pathnames "ex7.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "ex7.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+ )
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "ex7.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Kleene +
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((*generate-domain* t))
+ (compile-slr-grammar (merge-pathnames "ex8.zb" *ZEBU-TEST-DIRECTORY*)
+ :output-file (merge-pathnames "ex8.tab" *ZEBU-TEST-BINARY-DIRECTORY*))
+ )
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "ex8.tab" *ZEBU-TEST-BINARY-DIRECTORY*)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; bug-exp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun compile-load-test-file (file)
+ (let ((*default-pathname-defaults* *ZEBU-TEST-DIRECTORY*))
+ (zb:zebu-load-file
+ (zb:zebu-compile-file (format nil "~a.zb" file)
+ :output-file (merge-pathnames
+ (format nil "~a.tab" file)
+ *ZEBU-TEST-BINARY-DIRECTORY*)
+ :compile-domain *ZEBU-compile-domain*))
+ ))
+
+(let ()
+ (compile-load-test-file "bug-exp")
+ (compile-load-test-file "bug-exp1")
+ (compile-load-test-file "bug-exp2")
+ (compile-load-test-file "bug-exp3")
+ )
+
+(equal (read-parser "STRING (30)"
+ :grammar (zb:find-grammar "bug-exp"))
+ (read-parser "STRING (30)"
+ :grammar (zb:find-grammar "bug-exp1")))
+
+(equal (read-parser "STRING (30)"
+ :grammar (zb:find-grammar "bug-exp2"))
+ (read-parser "STRING (30)"
+ :grammar (zb:find-grammar "bug-exp3")))
+
+(equal (let ((*preserve-case* t))
+ (read-parser "fooBar"
+ :grammar (zb:find-grammar "bug-exp3")))
+ "fooBar")
+
+;;(debug-parser)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Monitoring the Zebu compiler (in Lucid CL)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; in fresh CL:
+#||
+(set-working-directory *ZEBU-directory*)
+(load "ZEBU-sys.lisp")
+(compile-system 'Zebu-compiler)
+(with-monitored-definitions (load-system 'Zebu-compiler))
+(set-working-directory "../nll/")
+(load "NLL-sys.lisp")
+(start-monitoring)
+(time (compile-module "nll-grammar"))
+(summarize-monitors :number-of-calls t)
+
+(start-monitoring)
+(time (compile-module "ex1"))
+(SUMMARIZE-MONITORS)
+
+(reset-monitors)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of exercise.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/fsg.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/fsg.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,224 @@
+;;; -*- Mode: Fundamental; Syntax: ZEBU; Package: NLL -*-
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; file: fsg.zb
+;;; module: TFS-2
+;;; version: 2.0, Zebu 3.2.8. with Meta Grammar
+;;; written by: Karsten Konrad (konrad at dfki.uni-sb.de)
+;;; last update: 7-Sep-1994
+;;; updated by: KaKo
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; author | date | modification
+;;; ------------------|-------------|------------------------------------------
+;;; | |
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Grammar for Typed Feature Structures (TFS) using MetaGrammar of Zebu.
+;;;
+;;; The grammar's syntax is according to UDiNe (Backofen).
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(:name "tfs-g2"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ ":$+-_*.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :identifier-start-chars
+ "$+-_*.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain-file "tfs-d2"
+ )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Domain Definition
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+fs-object := kb-domain:[(-extras)];
+
+feat-term := fs-object:[];
+
+;; type expressions for typed terms
+
+fs-type-expr := fs-object:[];
+
+fs-type := fs-type-expr:[(-type)(-sort-p)];
+fs-atomar := fs-type-expr:[(-value)];
+fs-type-conj := fs-type-expr:[(-types)];
+fs-type-disj := fs-type-expr:[(-types)];
+fs-type-neg := fs-type-expr:[(-type)];
+
+;; other objects
+
+label-value-pair := fs-object:[(-label)(-value)]
+ << print-function: print-label-value-pair >>;
+
+neg-var := fs-object:[(-number)];
+neg-vars := fs-object:[(-members)];
+
+fs-var := feat-term:[(-number)(-var-bound)(-neg-vars)];
+
+tagged-term := feat-term:[(-tag)(-term)];
+
+typed-fs-term := feat-term:[(-type)(-conj)];
+
+fs-atom := feat-term:[(-value)]
+ << print-function: print-fs-atom >>;
+
+negative-atoms := feat-term:[(-atoms)];
+
+fs-conj-term := feat-term:[(-lvps)]
+ << print-function: print-fs-conj-term >>;
+
+fs-disj-term := feat-term:[(-members)]
+ << print-function: print-fs-disj-term >>;
+
+fs-list := feat-term:[(-first)(-rest)];
+
+empty-fs-list := feat-term:[];
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Syntax Rules
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+Feature-Term -->
+ Untagged-Term |
+ Tagged-Term |
+ FS-Var;
+
+Tagged-Term -->
+ FS-Var "=" Untagged-Term
+ {Tagged-Term:[(-tag FS-VAR)(-term Untagged-Term)]};
+
+Untagged-Term -->
+ Pos-Untagged-Term |
+ Negative-Atoms;
+
+Negative-Atoms -->
+ "-(" FS-Atom + " " ")"
+ {Negative-Atoms:[(-atoms FS-Atom+)]};
+
+Pos-Untagged-Term -->
+ Typed-Fs-Term |
+ FS-Conj-Term |
+ FS-Disj-Term |
+ FS-List |
+ FS-Atom;
+
+Typed-Fs-Term -->
+ Type-Expr Fs-Conj-Term
+ {Typed-Fs-Term:[(-type Type-Expr)
+ (-conj Fs-Conj-Term)]};
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Lists
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+FS-List -->
+ "nil"
+ {empty-fs-list:[]} |
+ "<" ">"
+ {empty-FS-List:[]} |
+ "<" Feature-Term ">"
+ {FS-List:[(-first Feature-Term)
+ (-rest empty-FS-List)]} |
+ "<" Feature-Term FS-List-Rest ">"
+ {FS-List:[(-first Feature-Term)
+ (-rest FS-List-Rest)]};
+
+FS-List-Rest -->
+ Feature-Term.1 "." Feature-Term.2
+ {FS-List:[(-first Feature-Term.1)
+ (-rest Feature-Term.2)]} |
+ Feature-Term FS-List-Rest
+ {FS-List:[(-first Feature-Term)
+ (-rest FS-List-Rest)]} |
+ Feature-Term
+ {FS-List:[(-first Feature-Term)
+ (-rest Empty-FS-List)]};
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Conj Terms
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+FS-Conj-Term -->
+ "[" Label-Value-Pair * " " "]"
+ {FS-Conj-Term:[(-lvps Label-Value-Pair*)]};
+
+FS-Disj-Term -->
+ "{" Feature-Term + "," "}"
+ {FS-Disj-Term:[(-members Feature-Term+)]};
+
+
+FS-Atom -->
+ IDENTIFIER
+ {FS-Atom:[(-value IDENTIFIER)]} |
+ NUMBER
+ {FS-Atom:[(-value NUMBER)]} |
+ STRING
+ {FS-Atom:[(-value STRING)]};
+
+
+Label-Value-Pair -->
+ "(" IDENTIFIER Feature-Term ")"
+ {Label-Value-Pair:[(-label IDENTIFIER)
+ (-value Feature-Term)]};
+
+FS-Var -->
+ "%" Number
+ {Fs-Var:[(-number Number)]} |
+ "%" Number Neg-Vars
+ {Fs-Var:[(-number Number)
+ (-neg-vars Neg-Vars)]};
+
+Neg-Vars -->
+ "(" Neg-Var + " " ")"
+ {Neg-Vars:[(-members Neg-Var+)]};
+
+Neg-Var -->
+ "-" "%" Number
+ {Neg-Var:[(-number Number)]};
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; TDL Types
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+Atomar -->
+ "(" ":atom" Identifier ")"
+ {FS-Atomar:[(-value Identifier)]} |
+ "(" ":atom" Number ")"
+ {FS-Atomar:[(-value Number)]} |
+ "(" ":atom" String ")"
+ {FS-Atomar:[(-value String)]};
+
+Conjunction -->
+ "(" ":and" TYPE + " " ")"
+ {FS-Type-Conj:[(-types TYPE+)]};
+
+Disjunction -->
+ "(" ":or" TYPE + " " ")"
+ {FS-Type-Disj:[(-types TYPE+)]};
+
+Negation -->
+ "(" ":not" TYPE ")"
+ {FS-Type-Neg:[(-type TYPE)]};
+
+;; Type can be printed with (:type <type>) or <type>
+;; ugly syntax convention, but no problem on this side.
+;; (replaced by syntax transformation)
+
+Type-Expr -->
+ "(" ":type" Type ")"
+ {FS-Type:[(-type Type)]} |
+ "(" ":type" Type ":sort-p" Identifier ")"
+ {FS-Type:[(-type Type)(-sort-p Identifier)]} |
+ Type;
+
+Type -->
+ Identifier |
+ Conjunction |
+ Disjunction |
+ Negation |
+ Atomar;
+
+
+
\ No newline at end of file
Added: vendor/zebu/test/g0.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/g0.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,34 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: g0.zb
+; Description: Zebu Grammar: Simple Expressions
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "G0")
+
+(defrule Program := ( "begin" Stmts "end" ) )
+
+(defrule Stmts := ( SimpleStmt ";" Stmts)
+ := ( "begin" Stmts "end" ";" Stmts )
+ := () )
+(defrule SimpleStmt := Identifier)
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*load-verbose* t))
+ (compile-slr-grammar "g0.zb"))
+(setq zebu:*current-grammar*
+ (zebu-load-file "g0.tab"))
+(progn (format t "symbols: ") (terpri) (zebu::cruise-symbols-2))
+(zebu::print-collection t)
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+(zb::read-parser "begin A; B; end")
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of g0.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/g1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/g1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,36 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: g1.zb
+; Description: Grammar Example g1 from Fischer&LeBlanc
+; Author: Joachim H. Laubsch
+; Language: Zebu
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "g1")
+
+(defrule S := E)
+
+(defrule E := (E "+" Term)
+ := Term)
+
+(defrule Term := Identifier
+ := ( "(" E ")" ) )
+
+#||
+(setf (SYSTEM::environment-variable "zebutest") "~/hpnlrw/zebu/test")
+
+(let ((*load-verbose* t))
+ (compile-slr-grammar
+ (merge-pathnames "g1.zb" *ZEBU-test-directory*)))
+
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "g1.tab" *ZEBU-test-directory*)))
+(progn (format t "symbols: ") (terpri) (zebu::cruise-symbols-2))
+(zebu::print-collection t)
+(zebu::calculate-first-sets)
+(setq $i (third (zb::oset-item-list zb::f-i-set)))
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of g1.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/g2.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/g2.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,36 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: g1.zb
+; Description: Zebu Grammar Example with useless nonterminals
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "g1")
+
+(defrule S := A
+ := B)
+
+(defrule A := "a")
+
+(defrule B := (B "b") )
+
+(defrule C := "c")
+
+#||
+(setf (SYSTEM::environment-variable "zebutest") "~/hpnlrw/zebu/test")
+(let ((*load-verbose* t))
+ (compile-slr-grammar
+ (merge-pathnames "g1.zb" *ZEBU-test-directory*)))
+;;; Warning: The following non-terminals where defined but not used: C
+
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "g1.tab" *ZEBU-test-directory*)))
+(progn (format t "symbols: ") (terpri) (zebu::cruise-symbols-2))
+(zebu::print-collection t)
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of g1.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/hh-tdl.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/hh-tdl.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,93 @@
+(:name "hh-tdl"
+ :grammar "zebu-mg"
+ :package "CL-USER"
+ :identifier-continue-chars
+ "$*-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :identifier-start-chars
+ "$*-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+)
+;; ENRICH 'lex-cats' !!! (to handle '*avm*'...)
+;; :lex-cats ((Identifier "[A-z]+"))
+;;
+
+;; Domain definition
+;; skip 'options,' optional expressions to begin
+
+;; REORGANIZE W.R.T. KB-DOMAIN ???
+;; (ISN'T THIS OPTIONAL ANYWAY ??)
+;; CREATE GLOBAL HIERARCHY??? (how to break down?)
+
+Type-Feat := kb-domain: [];
+
+Type-Def := Type-Feat: [(-type Identifier) (-def)];
+;; 1st restricted, 2nd generic ?!!
+;; return what, where?
+;; are these things nested??
+
+AVM-Def := Type-Feat: [(-body)];
+;; unique labels? case sensitivity??
+
+Disjunction := Type-Feat: [(-terms)];
+ Disj-Inc := Disjunction: [];
+ Disj-Exc := Disjunction: [];
+;; (dis)advantages of specificity?
+
+Conjunction := Type-Feat: [(-terms)];
+
+Feature-Term := Type-Feat: [(-terms)];
+
+Attr-Val := Type-Feat: [(-attr-path) (-val)];
+
+
+
+;; Productions
+
+
+Type-Def --> Type AVM-Def "."
+ {Type-Def: [(-type Type)
+ (-def AVM-Def)]};
+
+;; | Type Subtype-Def "."
+;; {Type-Def: [(-type Type)
+;; (-def Subtype-Def)]};
+
+
+AVM-Def --> ":=" Body
+ {AVM-Def: [(-body Body)]};
+
+Body --> Disjunction;
+;;currently transparent, soon to include the following...
+;; {Body: [(-disj Disjunction)
+;; (-const Constraint+)]}
+
+Disjunction --> Conjunction+ "|"
+ {Disj-Inc: [(-terms Conjunction+)]} |
+ Conjunction+ "^"
+ {Disj-Exc: [(-terms Conjunction+)]};
+;; "+" vs. "*" ?
+;; tricky tricky!
+
+Conjunction --> Term+ "&"
+ {Conjunction: [(-terms Term+)]};
+
+Term --> Type |
+ Feature-Term;
+
+Feature-Term --> "[" Attr-Val* "," "]"
+ {Feature-Term: [(-terms Attr-Val*)]};
+;; "*" vs. "+" ?
+;; tricky tricky!
+
+Attr-Val --> Attribute+ "."
+ {Attr-Val: [(-attr-path Attribute+)
+ (-val NIL)]}
+
+ | Attribute+ "." Disjunction
+ {Attr-Val: [(-attr-path Attribute+)
+ (-val Disjunction)]};
+;; what about paths -- sufficiently general??
+
+Type --> Identifier;
+
+Attribute --> Identifier;
+
\ No newline at end of file
Added: vendor/zebu/test/hh-test.tdl
==============================================================================
--- (empty file)
+++ vendor/zebu/test/hh-test.tdl Wed Oct 17 09:04:46 2007
@@ -0,0 +1,6 @@
+index := *avm* &
+ [ PERSON person,
+ NUMBER number,
+ GENDER gender].
+
+
\ No newline at end of file
Added: vendor/zebu/test/lex1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/lex1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,80 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: lex1.zb
+; Description: Zebu Grammar: Simple Expressions
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "lex1"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+
+;; Domain definition
+
+Program := [(-stmts kb-sequence)];
+Combination := [(-function) (-arg)];
+Quantity := [(-dim) (-val)];
+Dimension := [(-val)];
+
+;; rules
+
+Program --> "begin" Stmt+ " " "end"
+ { Program: [(-stmts Stmt+)] } ;
+
+Stmt --> Identifier | Quantity | Appl | Program ;
+
+Appl --> Identifier "(" Arg* " " ")"
+ {Combination: [(-function Identifier) (-arg Arg*)]};
+
+Arg --> Identifier | Number | Appl | Quantity ;
+
+Quantity --> "<" Dimension "." Number ">"
+ {Quantity: [(-dim Dimension) (-val Number)]};
+
+Dimension --> "#" Identifier
+ {Dimension: [(-val Identifier)]} ;
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*load-verbose* t))
+ (zb:compile-slr-grammar "lex1.zb"
+ :output-file (merge-pathnames
+ "binary/lex1.tab"
+ *ZEBU-test-directory*)
+ :verbose t))
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames
+ "binary/lex1.tab" *ZEBU-test-directory*)
+ :verbose t))
+
+(zb::read-parser "begin <#k . 1> end")
+(zb::read-parser "begin <#k . .1> end")
+(zb::read-parser "begin <#K . 2.1> end")
+
+(zebu::print-collection t)
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+(zebu::print-productions)
+(zebu::print-actions "lex1")
+
+(zb::read-parser "begin A end")
+(zb::read-parser "begin A B C end")
+(zb::read-parser "begin A begin B1 B2 end C end")
+(zb::read-parser "begin f() end")
+(zb::read-parser "begin f(a) end")
+(zb::read-parser "begin f(1) end")
+(zb::read-parser "begin A f(1) end")
+(zb::read-parser "begin f(1 2) end")
+(zb::read-parser "begin f(1) A end")
+(zb::read-parser "begin f(g(a)) A end")
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of lex1.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/lieber.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/lieber.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,82 @@
+;; This is a Zebu grammmar that recognizes phone numbers and e-mail addresses in free text.
+;; Henry Lieberman 2 February 1995
+
+(:name "Phone-and-E-Mail"
+ :identifier-start-chars "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#%*^&:;,?/|\\~`+='"
+ :identifier-continue-chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
+;;
+
+(defrule Words
+ := ()
+ := (Word)
+ :build (:form (list Word))
+ := (Word Words)
+ :build (:form (cons Word Words))
+ )
+
+(defrule Word
+ := Identifier
+ := Number
+ := Phone-Number
+ := E-Mail-Address)
+
+(defrule Phone-Number
+ ;; Example: 253-0315
+ := (Number.1 "-" Number.2)
+ :build (:form (make-instance 'phone-number :exchange Number.1 :extension Number.2))
+ ;; Example: (617) 253-0315
+ := ("(" Number ")" Phone-Number)
+ :build (:form (make-instance 'phone-number
+ :area-code Number
+ :exchange (exchange Phone-Number)
+ :extension (extension Phone-Number))))
+
+;; I didn't put anything about restricting to seven digits, etc.
+
+(defrule Host
+ ;; Example: media.mit.edu
+ := (Identifier)
+ :build (:form (make-instance 'host :domain-path (list Identifier)))
+ := (Identifier "." Host)
+ :build (:form (make-instance 'host :domain-path (cons Identifier (domain-path Host)))))
+
+(defrule E-Mail-Address
+ ;; Example: lieber at media.mit.edu
+ := (Identifier "@" Host)
+ :build (:form (make-instance 'e-mail-address :person Identifier :host Host)))
+
+
+
+#||
+
+
+(defclass e-mail-address ()
+ ((person :initarg :person :accessor person) (host :initarg :host :accessor host)))
+
+(defclass host () ((domain-path :initarg :domain-path :accessor domain-path)))
+
+(defclass phone-number ()
+ ((area-code :initarg :area-code :accessor area-code) (exchange :initarg :exchange :accessor exchange)
+ (extension :initarg :extension :accessor extension)))
+
+(compile-and-load-grammar "Phone-and-E-Mail") ;; in file Phone-and-E-Mail.zb
+
+
+;; This doesn't work...
+(read-parser
+ "My name is Henry, my address is lieber at media.mit.edu and you can call me at (617) 253-0315"
+ :grammar (find-grammar "Phone-and-E-Mail"))
+
+;; Having trouble with . and @ characters ...
+
+;; But this does...
+(read-parser
+ "My name is Henry, my address is lieber @ media . mit . edu and you can call me at (617) 253-0315"
+ :grammar (find-grammar "Phone-and-E-Mail"))
+
+
+||#
+
+
+
+
\ No newline at end of file
Added: vendor/zebu/test/lr4-21.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/lr4-21.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,46 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: lr4-21.zb
+; Description: grammar (4.21) on page 231 of Dragon
+; Author: Joachim H. Laubsch
+; Created: 20-Mar-91
+; Modified: Thu Oct 2 12:57:09 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "lr4-21"
+ :domain-file "lr4-dom"
+ :package "CL-USER"
+ :grammar "null-grammar"
+ :identifier-start-chars "$-?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars "$-_?.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
+
+(defrule S
+ := (L "=" R)
+ :build (list 'S L "=" R)
+
+ := R
+ :build (list 'S R))
+
+(defrule L
+ := ("*" R)
+ :build (list 'L "*" R)
+
+ := IDENTIFIER)
+
+(defrule R
+ := NUMBER
+ :build (list 'R NUMBER)
+
+ := L
+ :build (list 'R L))
+
+
+
+
\ No newline at end of file
Added: vendor/zebu/test/mini-la.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/mini-la.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,88 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: mini-la.zb
+; Description: Zebu Grammar: Simple Expressions
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "mini-la"
+ :domain-file "minl-dom"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+
+;; Domain definition
+
+Program := [(-stmts kb-sequence)];
+Combination := [(-function) (-args kb-sequence)];
+Tuple := [(-members kb-sequence)];
+Za-Set := [(-members Za-Set-Part)];
+Za-Set-Part := Za-List:[(-arg)(-nextargs)];
+
+;; Rules
+
+Program --> "begin" Stmt+ ";" "end"
+ { Program: [(-stmts Stmt+)] } ;
+
+Stmt --> Identifier | Appl | Program ;
+
+Appl --> Identifier "(" Arg* "," ")"
+ {Combination: [(-function Identifier) (-args Arg*)]};
+
+Arg --> Identifier | Number | Appl | Tuple | Set ;
+
+Tuple --> "<" Arg+ " " ">"
+ { Tuple: [(-members Arg+)] };
+
+Set --> "{" Set-Arg-Seq "}" { Za-Set: [(-members Set-Arg-Seq)]};
+
+Set-Arg-Seq -->
+ List-Arg "," Set-Arg-Seq
+ {Za-Set-Part:[(-arg List-Arg)
+ (-nextargs Set-Arg-Seq)]} |
+ List-Arg
+ {Za-Set-Part:[(-arg List-Arg)]};
+
+List-Arg --> Arg;
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*load-verbose* t))
+ (zb:compile-slr-grammar "mini-la.zb"
+ :output-file (merge-pathnames
+ "binary/mini-la.tab"
+ *ZEBU-test-directory*)))
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames
+ "binary/mini-la.tab" *ZEBU-test-directory*)))
+
+(zebu::print-collection t)
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+(zebu::print-productions)
+(zebu::print-actions "mini-la")
+
+(zb::read-parser "begin A; B ; C end")
+(zb::read-parser "begin A; begin B1; B2 end ; C end")
+(zb::read-parser "begin f() end")
+(zb::read-parser "begin f(a) end")
+(zb::read-parser "begin f(1) end")
+(zb::read-parser "begin A; f(1) end")
+(zb::read-parser "begin f(1,2) end")
+(zb::read-parser "begin f(1,2,g(3,4,5)) end")
+(zb::read-parser "begin f(1); A end")
+(zb::read-parser "begin f(g(a)); A end")
+(zb::read-parser "begin f(g(a)); A; f(1,2,g(3,4,5)) end")
+(zb::read-parser "begin end(begin) end")
+(zb::read-parser "begin end() end")
+(zb::read-parser "begin a(&&) end; ")
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of mini-la.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/mini.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/mini.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,66 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: mini.zb
+; Description: Zebu Grammar: Simple Expressions
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "mini"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-start-chars
+ "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+
+;; Domain definition
+
+Program := [(-stmts kb-sequence)];
+Combination := [(-function) (-arg)];
+
+;; rules
+
+Program --> "begin" Stmt+ " " "end"
+ { Program: [(-stmts Stmt+)] } ;
+
+Stmt --> Identifier | Appl | Program ;
+
+Appl --> Identifier "(" Arg* " " ")"
+ {Combination: [(-function Identifier) (-arg Arg*)]};
+
+Arg --> Identifier | Number | Appl ;
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*load-verbose* t))
+ (compile-slr-grammar "mini.zb"
+ :output-file (merge-pathnames
+ "binary/mini.tab"
+ *ZEBU-test-directory*)))
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames
+ "binary/mini.tab" *ZEBU-test-directory*)))
+
+(zebu::print-collection t)
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+(zebu::print-productions)
+(zebu::print-actions "mini")
+
+(zb::read-parser "begin A end")
+(zb::read-parser "begin A B C end")
+(zb::read-parser "begin A begin B1 B2 end C end")
+(zb::read-parser "begin f() end")
+(zb::read-parser "begin f(a) end")
+(zb::read-parser "begin f(1) end")
+(zb::read-parser "begin A f(1) end")
+(zb::read-parser "begin f(1 2) end")
+(zb::read-parser "begin f(1) A end")
+(zb::read-parser "begin f(g(a)) A end")
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of mini.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/pb.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pb.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,14 @@
+
+(:grammar "null-grammar"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :lex-cats (
+ (node-name "[A-Z]+")
+ ))
+
+(defrule datr-theorem
+ := (node-name ":" identifier ".")
+ :build(:form
+ (list node-name identifier)))
+
+
\ No newline at end of file
Added: vendor/zebu/test/pc.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pc.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,41 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: pc.zb
+; Description: propositional calculus
+; Author: Joachim H. Laubsch
+; Created: 15-Aug-91
+; Modified: Thu Oct 2 12:57:16 1997 (Joachim H. Laubsch)
+; Language: Lisp
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "pc"
+ :domain-file "pc-dom"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
+
+(defrule Formula
+ := Propositional-variable
+ := Boolean-Expr
+ := ( "(" Formula ")" )
+ :build (progn Formula)
+ )
+
+(defrule Propositional-Variable
+ := Identifier)
+
+(defrule Boolean-Expr
+ := (Formula.1 Boolean-Op Formula.2)
+ :build (list Boolean-Op Formula.1 Formula.2)
+ )
+
+(defrule Boolean-Op
+ := "and"
+ := "or"
+ )
+
\ No newline at end of file
Added: vendor/zebu/test/pc1-p.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pc1-p.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,56 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: pc1-p.lisp
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 13-Apr-92
+; Modified: Thu Oct 2 12:57:16 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "CL-USER")
+
+(defun PRINT-PROPOSITIONAL-VARIABLE (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~S"
+ (PROPOSITIONAL-VARIABLE--name ITEM)))
+
+(defun PRINT-BOOLEAN-OR (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~S or ~S"
+ (BOOLEAN-EXPR--RAND1 ITEM)
+ (BOOLEAN-EXPR--RAND2 ITEM)))
+
+(defun PRINT-BOOLEAN-AND (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~S and ~S"
+ (BOOLEAN-EXPR--RAND1 ITEM)
+ (BOOLEAN-EXPR--RAND2 ITEM)))
+
+(defun print-atomic-wff (item stream level)
+ (declare (ignore level))
+ (format stream
+ "~a(~a)"
+ (atomic-wff--predicate item)
+ (atomic-wff--role-argument-pairs item)))
+
+(defun print-role-argument-pair (item stream level)
+ (declare (ignore level))
+ (format stream
+ "~a: ~a"
+ (role-argument-pair--role item)
+ (role-argument-pair--argument item)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; end of pc1-p.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/pc1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pc1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,104 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: pc1.zb
+; Description: propositional calculus
+; Author: Joachim H. Laubsch
+; Created: 15-Aug-91
+; Modified: Thu Oct 2 12:57:17 1997 (Joachim H. Laubsch)
+; Language: Lisp
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "pc1"
+ :domain-file "pc1-dom"
+ :grammar "null-grammar"
+ :package "CL-USER"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain
+ (kb-domain
+ :subtype (Formula
+ :subtype (Propositional-variable
+ :slots (-name))
+ :subtype (P-Formula :slots (-content))
+ :subtype (Boolean-Expr
+ :slots ((-rand1 Formula)
+ (-rand2 Formula))
+ :subtype Boolean-Or
+ :subtype Boolean-And)
+ :subtype (Atomic-Wff :slots
+ (-predicate
+ (-Role-Argument-Pairs KB-sequence))))
+ :subtype (Role-Argument-Pair :slots (-Role -Argument)))
+ )
+
+;; productions
+
+(defrule formula
+ := Propositional-variable
+
+ := Boolean-Expr
+
+ := ( "(" Formula ")" )
+ :build (:form (progn Formula))
+
+ := Atomic-Wff
+ )
+
+(defrule Propositional-Variable
+ := Identifier
+ :build (:type Propositional-variable
+ :map ((Identifier . :-name)))
+ )
+
+(defrule Boolean-Expr
+ := (Formula.1 "and" Formula.2)
+ :build (:type Boolean-And
+ :map ((Formula.1 . :-rand1)
+ (Formula.2 . :-rand2)))
+
+ := (Formula.1 "or" Formula.2)
+ :build (:type Boolean-Or
+ :map ((Formula.1 . :-rand1)
+ (Formula.2 . :-rand2)))
+ )
+
+(defrule Atomic-Wff
+ := (Identifier "(" Role-Argument-Pairs ")")
+ :build (:type Atomic-Wff
+ :map ((Identifier . :-predicate)
+ (Role-Argument-Pairs . :-Role-Argument-Pairs))
+ ))
+
+(defrule Role-Argument-Pairs
+ := ()
+
+ := (Role-Argument-Pair Role-Argument-Pairs)
+ :build (:type KB-Sequence
+ :map ((Role-Argument-Pair . :first)
+ (Role-Argument-Pairs . :rest)))
+ )
+
+(defrule Role-Argument-Pair
+ := (Identifier ":" Term)
+ :build (:type Role-Argument-Pair
+ :map ((Identifier . :-Role)
+ (Term . :-Argument)))
+ )
+
+(defrule Term
+ := Identifier
+ := Number)
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(zebu-compile-file "pc1.zb" :output-file "binary/pc1.tab")
+(zebu-load-file "binary/pc1.tab")
+
+||#
+
\ No newline at end of file
Added: vendor/zebu/test/pc2.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pc2.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,100 @@
+; -*- mode: CL -*- --------------------------------------------------- ;
+; File: pc2.zb
+; Description: Propositional Calculus Grammar with AVM Semantics
+; Author: Joachim H. Laubsch
+; Created: 15-Aug-91
+; Modified: Thu Oct 2 12:57:21 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "pc2"
+ :domain-file "pc2-dom"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain-file "pc2-domain"
+ )
+
+;; Domain definition
+
+Formula := kb-domain: [];
+
+ Propositional-variable := Formula: [ (-name) ];
+ P-Formula := Formula: [ (-content) ];
+ Boolean-Expr := Formula: [ (-rand1 Formula) (-rand2 Formula)];
+ Boolean-Or := Boolean-Expr: [];
+ Boolean-And := Boolean-Expr: [];
+ Atomic-Wff := Formula: [ (-predicate)
+ (-Role-Argument-Pairs
+ kb-sequence) ];
+
+Role-Argument-Pair := kb-domain: [(-Role) (-Argument)];
+
+;; Productions
+
+Formula --> Propositional-variable
+ | Boolean-Expr
+ | "(" Formula ")" { P-Formula:[(-content Formula)] }
+ | Atomic-Wff ;
+
+Propositional-Variable
+ --> Identifier {Propositional-variable: [(-name Identifier)]} ;
+
+Boolean-Expr --> Formula.1 "and" Formula.2
+ {Boolean-And:
+ [(-rand1 Formula.1)
+ (-rand2 Formula.2)]}
+
+ | Formula.1 "or" Formula.2
+ {Boolean-Or:
+ [(-rand1 Formula.1)
+ (-rand2 Formula.2)]};
+
+Atomic-Wff --> Identifier "(" Role-Argument-Pairs ")"
+ { Atomic-Wff:
+ [(-predicate Identifier)
+ (-Role-Argument-Pairs Role-Argument-Pairs)] };
+
+Role-Argument-Pairs -->
+
+ | Role-Argument-Pair Role-Argument-Pairs
+ { KB-sequence:
+ [(first Role-Argument-Pair)
+ (rest Role-Argument-Pairs)] } ;
+
+Role-Argument-Pair --> Identifier ":" Term
+ {Role-Argument-Pair:
+ [(-Role Identifier)
+ (-Argument Term)]};
+
+Term --> Identifier | Number ;
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(zb:compile-slr-grammar "pc2.zb"
+ :output-file (merge-pathnames
+ "binary/pc2.tab"
+ *ZEBU-test-directory*))
+(zb:zebu-load-file (merge-pathnames "binary/pc2.tab" *ZEBU-test-directory*))
+(zebu::print-actions "pc2")
+
+(zb:read-parser "walks(agent: John)" :grammar (zb:find-grammar "pc2"))
+
+(zb:read-parser "walks(agent: John time: 12)" :grammar (zb:find-grammar "pc2"))
+
+(zb:read-parser "(walks(agent: John))" :grammar (zb:find-grammar "pc2"))
+
+(zb:read-parser "walks(agent: John) and talks(agent: John)" :grammar (zb:find-grammar "pc2"))
+
+(zb:read-parser "walks(agent: John) and talks(agent: John) and Q" :grammar (zb:find-grammar "pc2"))
+
+||#
+
\ No newline at end of file
Added: vendor/zebu/test/pc3.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/pc3.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,102 @@
+; -*- mode: CL -*- --------------------------------------------------- ;
+; File: pc3.zb
+; Description: Propositional Calculus Grammar with AVM Semantics
+; Author: Joachim H. Laubsch
+; Created: 15-Aug-91
+; Modified: Thu Oct 2 12:57:22 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "pc3"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :domain-file "pc3-domain"
+ :domain
+ (kb-domain
+ :subtype (Formula
+ :subtype (Propositional-variable
+ :slots (-name))
+ :subtype (P-Formula :slots (-content))
+ :subtype (Boolean-Expr
+ :slots ((-rand1 Formula)
+ (-rand2 Formula))
+ :subtype Boolean-Or
+ :subtype Boolean-And))
+ :subtype (Atomic-Wff :slots (-predicate
+ (-Role-Argument-Pairs KB-Sequence)))
+ :subtype (Role-Argument-Pair :slots (-Role -Argument))
+ )
+ )
+
+Formula --> Propositional-variable
+ | Boolean-Expr
+ | "(" Formula ")" { type: P-Formula
+ [(-content Formula)] }
+ | Atomic-Wff ;
+
+Propositional-Variable
+ --> Identifier { type: Propositional-variable
+ [(-name Identifier)] } ;
+
+Boolean-Expr --> Formula.1 "and" Formula.2
+ { type: Boolean-And
+ [(-rand1 Formula.1)
+ (-rand2 Formula.2)] }
+
+ | Formula.1 "or" Formula.2
+ { type: Boolean-Or
+ [(-rand1 Formula.1)
+ (-rand2 Formula.2)] } ;
+
+Atomic-Wff --> Identifier "(" Role-Argument-Pairs ")"
+ { type: Atomic-Wff
+ [(-predicate Identifier)
+ (-Role-Argument-Pairs Role-Argument-Pairs)] } ;
+
+Role-Argument-Pairs --> Role-Argument-Pair * " " ;
+
+Role-Argument-Pair --> Identifier ":" Term
+ { type: Role-Argument-Pair
+ [(-Role Identifier)
+ (-Argument Term)] } ;
+
+Term --> Identifier | Number ;
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(zb:compile-lalr1-grammar "pc3.zb"
+ :output-file (merge-pathnames
+ "binary/pc3.tab"
+ *ZEBU-test-directory*))
+(zb:zebu-load-file (merge-pathnames "binary/pc3.tab"
+ *ZEBU-test-directory*))
+(zebu::print-actions "pc3")
+(zebu::print-productions)
+
+(zb:read-parser "walks()"
+ :grammar (zb:find-grammar "pc3"))
+
+(zb:read-parser "walks(agent: John)" :grammar (zb:find-grammar "pc3"))
+
+(zb:read-parser "(walks(agent: John))" :grammar (zb:find-grammar "pc3"))
+
+(zb:read-parser "walks(agent: John) and talks(agent: John)"
+ :grammar (zb:find-grammar "pc3"))
+
+(zb:read-parser "walks( time: 12 agent: John)"
+ :grammar (zb:find-grammar "pc3"))
+
+(zb:read-parser "walks(agent: John time: 12) and talks(agent: John time: 13) and Q"
+ :grammar (zb:find-grammar "pc3"))
+
+||#
+
\ No newline at end of file
Added: vendor/zebu/test/regextst.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/test/regextst.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,191 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: regextst.lisp
+; Description: some tests for the regular expression compiler
+; Author: Joachim H. Laubsch
+; Created: 9-Feb-93
+; Modified: Thu Oct 2 12:57:23 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1993, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(setq *regex-debug* nil)
+(defun match-beginning (n)
+ (first (AREF *REGEX-GROUPS* n)))
+
+(defun match-end (n)
+ (second (AREF *REGEX-GROUPS* n)))
+
+(defun regex-test (n pat string result &key invert)
+ (let ((form (regex-compile pat))
+ *print-circle*)
+ (princ ".")
+ (if (eval `(let ((START 0) (END ,(LENGTH STRING)) (STRING ,string))
+ . ,form))
+ (let ((matched-string (subseq string 0 (match-end 0))))
+ (if (string= matched-string result)
+ (if invert
+ (warn "In ~S ~A did not match correctly" n pat)
+ t)
+ (if invert
+ t
+ (warn "In ~S ~A did not match correctly~%Only ~S was matched!"
+ n pat matched-string))))
+ (if invert
+ t
+ (warn "In ~S ~A did not compile correctly" n pat)))))
+
+(regex-test 1 "\\(na\\)x+\\1" "naxna" "naxna")
+(regex-test 2 "\\(na\\)x+\\1" "naxna123" "naxna")
+
+(regex-test 3 "\\(na\\)x+" "naxxos" "naxx")
+(regex-test 4 "\\(na\\)x+" "naxos" "nax")
+(regex-test 5 "\\(na\\)x+" "naos" "na" :invert t)
+
+(regex-test 6 "\\(na\\)x*" "naxxos" "naxx")
+(regex-test 7 "\\(na\\)x*" "naxos" "nax")
+(regex-test 8 "\\(na\\)x*" "naos" "na")
+
+(regex-test 9 "[0-9]+" "123ab" "123")
+(regex-test 10 "[a-zA-Z]+" "aAbb123" "aAbb")
+(regex-test 11 "[0-9a-z]+" "1234&&*" "1234")
+(regex-test 12 "[0-9a-z]+" "1234a&&*" "1234a")
+
+(regex-test 13 "[0-9a-zA-Z]+" "a1234a" "a1234a")
+(regex-test 14 "[0-9a-zA-Z&]+" "aAbb123&&*" "aAbb123&&")
+
+(regex-test 15 "[0-9]+\\.[0-9]*" "0.123cm" "0.123")
+
+(regex-test 16 "{[^}\\n]*}"
+ "{M.D. Harrison and A. Monk (Ed.)} \n\t foo: 2"
+ "{M.D. Harrison and A. Monk (Ed.)}")
+
+(regex-test 17 "{[^}\\n]*}"
+ "{M.D. Harrison and
+A. Monk (Ed.)} \n\t foo: 2"
+ "{M.D. Harrison and A. Monk (Ed.)}" :invert t)
+
+
+(regex-test 18 "{[^}\\n]*}"
+ "{M.D. Harrison and {A. Monk} (Ed.)} \n\t foo: 2"
+ "{M.D. Harrison and {A. Monk} (Ed.)}" :invert t)
+
+(regex-test 19 "ca?r" "car" "car")
+
+(regex-test 20 "ca?r" "cr" "cr")
+
+(regex-test 21 "c[ad]+r" "caaar" "caaar")
+
+(regex-test 22 "c[ad]+r" "caaar aa1" "caaar")
+
+(regex-test 23 "c[ad]+r$" "caaar" "caaar")
+
+(regex-test 24 ".*" "" "")
+
+(regex-test 25 ".*" "aa" "aa")
+
+(regex-test 26 ".*" "aa" "aa")
+
+(regex-test 27 "c[ad]?r" "cr" "cr")
+
+(regex-test 28 "c[ad]?r" "car" "car")
+
+(regex-test 29 "c[ad]?r" "cdr" "cdr")
+
+(regex-test 30 "c[0-9]?r" "cr" "cr")
+
+(regex-test 31 "c[0-9]?r" "c9rxx" "c9r")
+
+(regex-test 32 "c[0-9]?r" "crxx" "cr")
+
+
+;;(regex-test 27 "a\\|b" "a" "a")
+
+(regex-test 33 "ab.yz" "ab yz" "ab yz")
+
+(regex-test 34 "ab.yz" "ab
+yz" "ab" :invert t)
+
+(regex-test 35 "\\(abc\\)\\1" "abcabc" "abcabc")
+
+(regex-test 36 "\\(abc\\)\\1x*\\(def\\)y*\\2" "abcabcxxxxdefyyyyyyydef$%%%%%"
+ "abcabcxxxxdefyyyyyyydef")
+
+;;(regex-test 37 "a|bc*" "a" "a")
+
+(let ((fn (def-regex-parser 'Natural_Number "[0-9]+")))
+ (pprint fn)
+ (compile (eval fn)))
+
+(defun regex-test1 (number fn input output &optional invert)
+ (let* ((match (funcall fn input))
+ (result (subseq input (match-beginning 0) (match-end 0)))
+ (test (and match
+ (> match 0)
+ (= (parse-integer result) output))))
+ (if (if invert (not test) test)
+ (princ ".")
+ (warn "wrong match in ~d: ~a found" number result))
+ (values)))
+
+(regex-test1 40 'Natural_Number "111" 111)
+
+(regex-test1 41 'Natural_Number "111 af" 111)
+
+(regex-test1 42 'Natural_Number "a111z" 0 t)
+
+(let ((fn (def-regex-parser 'Natural_Number* "[0-9]*")))
+ ;; (pprint fn)
+ (eval fn))
+
+(regex-test1 43 'Natural_Number* "111" 111)
+(regex-test1 44 'Natural_Number* "111 af" 111)
+(regex-test1 45 'Natural_Number* "a111z" 0 t)
+
+(unless (equal (Natural_Number "11aab" 0 4) 2)
+ (warn "No match"))
+
+(unless (equal (Natural_Number "11aab" 1 4) 2)
+ (warn "No match"))
+
+(when (equal (Natural_Number "1aab" 1 4) 2)
+ (warn "wrong match"))
+
+(let ((fn (def-regex-parser 'd_seq "d+")))
+ (eval fn))
+
+(let ((fn (def-regex-parser 'd_seq* "d*")))
+ (eval fn))
+
+(eval (def-regex-parser 'Rest_of_line ".+\$"))
+(let* ((s "abcdef") (n (length s)))
+ (unless (equal (REST_OF_LINE s 1 n) n)
+ (warn "Rest_of_line did not compile correctly")))
+
+(eval (def-regex-parser 'Quotation-Rx "'[^']+'"))
+(Quotation-Rx "'System 0x40147bb8 [sys_specs_Mfake]' provides no alternatives for allocating resource 'max_cpu_Rspu'")
+
+(eval (def-regex-parser 'NatNumber "-?[0-9]+[^a-zA-Z/$+_.:]"))
+(eval (def-regex-parser 'NatNumber "-?[0-9]+[^a-zA-Z]"))
+
+(NATNUMBER "32mb_mem_array")
+
+(regex-test 50 "[A-Z]+" "ABCY" "ABCY")
+
+(regex-test 51 "[0-9]+\\.[0-9]*\\(e[+-]?[0-9]+\\)" "12.3e4 k" "12.3e4")
+(regex-test 52 "[0-9]+\\.[0-9]*\\(e[+-]?[0-9]+\\)" "12.3e-4 k" "12.3e-4")
+;;(regex-test 53 "[0-9]+\\.[0-9]*\\(e[+-]?[0-9]+\\)?" "12.3 k" "12.3")
+
+(let ((fn (def-regex-parser 'foo "\\(a\\)\\1")))
+ (pprint fn)
+ (eval fn))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of regextst.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/sample-avm1
==============================================================================
--- (empty file)
+++ vendor/zebu/test/sample-avm1 Wed Oct 17 09:04:46 2007
@@ -0,0 +1,28 @@
+[(s1 v1) (s2 v2)]
+
+foo: [(s1 v1) (s2 %1= v2) (s3 %1)]
+
+[]
+
+[( s1 "foo" )]
+
+foo: [(s1 "foo")
+ (s2 %1= "bar")
+ (s3 %1)]
+
+foo: [(s1 "foo")
+ (s2 %1= "bar")
+ (s3 "baz\"2")]
+
+[( s1 "foo
+bar" )]
+
+[( s1 "foo
+\"
+\\"
+\\\"
+bar
+" )]
+
+[( s1 "h\"atten Sie gerne Umlaute?")]
+
\ No newline at end of file
Added: vendor/zebu/test/sample-ex1
==============================================================================
--- (empty file)
+++ vendor/zebu/test/sample-ex1 Wed Oct 17 09:04:46 2007
@@ -0,0 +1,9 @@
+1 + a
+1/3 1.333
+
+.1 + 1/3
+1 + x * y
+
+(1 +
+ x) * y
+
\ No newline at end of file
Added: vendor/zebu/test/sb-tr.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/sb-tr.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,105 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: sb-tr.zb
+; Description: simple test of sb trace subgrammar
+; Author: Joachim H. Laubsch
+; Created: 3-Sep-93
+; Modified: Thu Oct 2 12:57:28 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: USER
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1993, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "sb-tr"
+ :package "CL-USER"
+ :string-delimiter #\"
+ :identifier-start-chars
+ "_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :identifier-continue-chars
+ "/$-+_.:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ :intern-identifier nil
+ :case-sensitive t
+ :lex-cats ((Hex "0x[0-9a-f]+")
+ (Int "-?[0-9]+")
+ (Quotation-Rx "'[^']+'")
+ (Resource-attr "([0-9]+,[0-9]+,[0-9]+)")
+ ))
+
+;; rules
+
+(defrule Mapping_trace
+ := ("Compute" Identifier.0 "mapping for" Identifier.1 List PCM-Component "...")
+
+ := ("Seed instance:" PCM-Class_Component)
+
+ := PCM-Class_Component
+
+ := (PCM-Class_Component List)
+
+ := Option_instance
+ )
+
+(defrule Option_instance
+ := ("Instance" Hex "of Option [required]")
+
+ := ("Instance" Hex "of Option" "[" Identifier "]")
+ )
+
+(defrule Product_Id
+ := (Token-Seq Hex)
+ := Identifier)
+
+(defrule PCM-Component
+ := ( "[" Identifier Hex "]")
+ )
+
+(defrule PCM-Class_Component
+ := (Product_Id "[" Identifier "]")
+
+ := (Product_Id "{" Token-Seq "}")
+
+ := Product_Id
+ )
+
+(defrule List
+ := ( "(" Token-Seq ")" )
+ )
+
+(defrule Token-Seq
+ := Token
+
+ := (Token Token-Seq)
+ )
+
+(defrule Token
+ := Int
+
+ := Identifier)
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*warn-conflicts* t))
+ (compile-slr-grammar "sb-tr.zb"))
+(zb:zebu-load-file "sb-tr.tab")
+
+(zb:read-parser "dummy_os 0x41167300" :grammar (find-grammar "sb-tr"))
+(zb:read-parser "dummy_os 0x41167300 [Dummy_OS]"
+ :grammar (find-grammar "sb-tr"))
+(zb:read-parser "dummy_os 0x41167300 {Dummy OS}"
+ :grammar (find-grammar "sb-tr"))
+(zb:read-parser "999.0 HP-UX 0x41167398 {HP-UX 9.0} (reference)"
+ :grammar (find-grammar "sb-tr"))
+(let ((*warn-conflicts* t))
+ (compile-lalr1-grammar "sb-tr.zb" :output-file "/tmp/sb-tr-lalr1.tab"))
+(zb:zebu-load-file "/tmp/sb-tr-lalr1.tab")
+
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of sb-tr.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/test/simple.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/simple.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,35 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: simple.zb
+; Description: Zebu Grammar: Simple Expressions
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "simple")
+
+(defrule E := ( Prefix "(" E ")" )
+ := ( "V" Tail ) )
+
+(defrule Prefix := "F"
+ := ())
+
+(defrule Tail := ( "+" E)
+ := ())
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(let ((*load-verbose* t))
+ (compile-slr-grammar "simple.zb"))
+(setq zebu:*current-grammar*
+ (zebu-load-file "simple.tab"))
+(progn (format t "symbols: ") (terpri) (zebu::cruise-symbols-2))
+(zebu::print-collection t)
+(zb::cruise-first-sets)
+(zb::cruise-follow-sets)
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of simple.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
\ No newline at end of file
Added: vendor/zebu/test/tl1.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/tl1.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,38 @@
+; -*- mode: Lisp -*-
+;
+; Zebu grammar describing TL1 syntactic structure.
+;
+
+(:name "tl1" :grammar "zebu-mg")
+
+;;
+;; Domain description...
+;;
+
+command := [(opcode) (param-blocks kb-sequence)];
+parameter-block := [(contents kb-sequence)];
+name-value-pair := [(name) (value)];
+
+command --> opcode parameter-block* ":" ";"
+ { command: [(opcode opcode)
+ (param-blocks parameter-block*)] };
+
+
+;;opcode --> identifier "-" identifier;
+opcode --> identifier;
+
+parameter-block --> parameter-list
+ { parameter-block: [(contents parameter-list)] };
+
+parameter-list --> parameter { kb-sequence: [(first parameter)] }
+ | parameter "," parameter-list
+ { kb-sequence: [(first parameter) (rest parameter-list)] };
+
+parameter --> name { name-value-pair: [(name name)] }
+ | name "=" value { name-value-pair: [(name name) (value value)]};
+
+name --> identifier;
+
+value --> identifier | number | string;
+
+
\ No newline at end of file
Added: vendor/zebu/test/useless.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/test/useless.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,37 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: useless.zb
+; Description: Zebu Grammar Example with useless nonterminals
+; Author: Joachim H. Laubsch
+; Language: CL
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "useless")
+
+(defrule S := A
+ := B)
+
+(defrule A := "a")
+
+(defrule B := (B "b") )
+
+(defrule C := "c")
+
+#||
+(setf (SYSTEM::environment-variable "zebutest") "~/hpnlrw/zebu/test")
+(let ((*load-verbose* t))
+ (compile-slr-grammar
+ (merge-pathnames "useless.zb" *ZEBU-test-directory*)))
+;;; Warning: The following non-terminals where defined but not used: C
+
+(setq zebu:*current-grammar*
+ (zebu-load-file (merge-pathnames "useless.tab"
+ *ZEBU-test-directory*)))
+(progn (format t "symbols: ") (terpri) (zebu::cruise-symbols-2))
+(zebu::print-collection t)
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of useless.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
\ No newline at end of file
Added: vendor/zebu/zebra-debug.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebra-debug.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,73 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebra-debug.lisp
+; Description: Translating KB-Objects into readable lists
+; Author: Karsten Konrad
+; Created: 6-Apr-93
+; Modified: Wed Aug 3 12:48:51 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1993, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; PostScript Graph of the Kb-domain
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; psgraph (from CMU) and Ghostview from FSF are needed
+#+LUCID
+(defun show-kb-hierarchy (&optional (file "/tmp/kb-classes.ps"))
+ (let ((start 'kb-domain))
+ (with-open-file (*standard-output* file :direction :output)
+ (psgraph start
+ #'zb:KB-subtypes
+ #'(lambda (x) (list (string x)))
+ t nil #'eq))
+ (shell (format
+ nil
+ "ghostview -display ~a -notitle -nolabels -nolocator ~a &"
+ (environment-variable "DISPLAY") file))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Als Zugabe eine Funktion, die ein Kb-Objekt in eine vollstaendige
+; Liste uebersetzt; man sieht dann mal, was alles in der Struktur
+; steht. Vor allem zum Debuggen von Transformationen ist das
+; sehr hilfreich.
+
+(require "zebu-kb-domain")
+(require "zebu-tree-attributes")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Translating KB-Objects into readable lists
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun kb-tree2list (kb-object)
+ "translates a kb-object to a list which should contain
+ all relevant information."
+ (cond ((kb-domain-p kb-object)
+ (cons (type-of kb-object) (kb-kids2list kb-object)))
+ ((consp kb-object)
+ (mapcar #'kb-tree2list kb-object))
+ (t kb-object)))
+
+(defun kb-kids2list (kb-object)
+ "conses reader-fn and childs into a description list"
+ (let ((childs nil)
+ (ta (KB-tree-attributes (type-of kb-object))))
+ (when ta
+ (dolist (reader (the list (first ta)))
+ (push (list reader
+ (kb-tree2list (funcall reader kb-object))) childs))
+ (nreverse childs))))
+
+(defun print-readform (kb-object)
+ "prints a kb-object in a readable form"
+ (pprint (kb-tree2list kb-object)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebra-debug.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-actions.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-actions.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,63 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-actions.l
+; Description: Functions used in ZEBU grammar actions
+; Author: Joachim H. Laubsch
+; Created: 11-Jul-91
+; Modified: Thu Mar 7 09:13:39 1996 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1991, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(provide "zebu-actions")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Functions used in ZEBU grammar actions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declaim (inline EMPTY-SEQ SEQ-CONS EMPTY-SET SET-CONS K-4-3))
+
+(defun identity* (&rest x) x)
+
+(defun EMPTY-SEQ () ())
+(defun SEQ-CONS (a seq) (cons a seq))
+
+(defun EMPTY-SET () ())
+(defun SET-CONS (a set) (adjoin a set))
+
+(defun K-4-3 (ignore dummy1 result dummy2)
+ ;; a K (constant) function of 4 arguments that returns the third
+ (declare (ignore ignore dummy1 dummy2))
+ result)
+
+(defun K-2-1 (result dummy)
+ ;; a K (constant) function of 2 arguments that returns the first
+ (declare (ignore dummy))
+ result)
+
+(defun K-2-2 (dummy result)
+ ;; a K (constant) function of 2 arguments that returns the 2nd
+ (declare (ignore dummy))
+ result)
+
+(defun K-3-2 (dummy1 result dummy2)
+ ;; a K (constant) function of 3 arguments that returns the 2nd
+ (declare (ignore dummy1 dummy2))
+ result)
+
+(defun CONS-1-3 (a ignore b)
+ (declare (ignore ignore))
+ (cons a b))
+
+(defun CONS-2-3 (ignore a b)
+ (declare (ignore ignore))
+ (cons a b))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-actions.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-asdf-setup.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-asdf-setup.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,32 @@
+
+(in-package :asdf)
+
+(defclass zebu-source-file (source-file) ())
+
+(defmethod source-file-type ((c zebu-source-file) (s module)) "zb")
+
+(defmethod perform ((operation compile-op) (c zebu-source-file))
+ (zebu:zebu-compile-file (component-pathname c)))
+
+(defmethod perform ((o load-op) (c zebu-source-file))
+ (let* ((co (make-sub-operation o 'compile-op))
+ (output-files (output-files co c)))
+ (setf (component-property c 'last-loaded)
+ (file-write-date (car output-files)))
+ (zb:zebu-load-file (car output-files))))
+
+(defmethod output-files ((operation compile-op) (c zebu-source-file))
+ (list (merge-pathnames (component-pathname c)
+ (make-pathname :type "tab"))
+ ;; FIXME: The following is not always right: the name of the
+ ;; domain file can be given as an option to the grammar. Look
+ ;; at the function zebu::dump-domain-file to find out how the
+ ;; name is constructed in the general case.
+ (merge-pathnames (make-pathname
+ :name (concatenate 'string (pathname-name
+ (component-pathname c))
+ "-domain"))
+ (make-pathname
+ :type (car zebu::*load-binary-pathname-types*)))
+ ))
+
Added: vendor/zebu/zebu-aux.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-aux.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,246 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-aux.lisp
+; Description: Functions and structures common to compiler and driver
+; Author: Joachim H. Laubsch
+; Created: 11-Oct-90
+; Modified: Wed Dec 9 12:22:24 1998 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 7-Apr-92 (Joachim H. Laubsch)
+; many efficiency improvements throughout based on using Lucid's monitor
+; facility.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(provide "zebu-aux")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+#-LUCID (declaim (special *load-source-pathname-types*
+ *load-binary-pathname-types*))
+#+(or MCL Allegro CLISP)
+(setq *load-source-pathname-types* '("lisp" NIL)
+ *load-binary-pathname-types* '("fasl"))
+
+#+(and :SUN :LUCID)
+(setq *load-binary-pathname-types* '("sbin"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Global Variables (shared by runtime system and compiler)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+#-LUCID
+(defvar *KEYWORD-PACKAGE* (find-package "KEYWORD"))
+
+(defvar *generate-domain* t
+ "If true while Zebu compiling a grammar, generate the hierarchy
+otherwise the domain-hierarchy is written by the user.")
+
+(defvar *ZEBU-PACKAGE* (find-package "ZEBU"))
+
+(defvar *open-categories* '("IDENTIFIER" "NUMBER" "STRING"))
+
+(declaim (special *NULL-Grammar*))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Functions common to runtime and compiler
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun list->vector (l)
+ (let* ((len (length l))
+ (v (make-sequence 'vector len)))
+ (declare (vector v))
+ (dotimes (i len v)
+ (setf (svref v i) (pop l)))))
+
+(deftype IDENTIFIER () '(and symbol (not null)))
+
+(defun identifierp (x)
+ (typep x 'IDENTIFIER))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Lexical analysis (regex) Run/Compile time data structures
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Declare the global variables for storing the paren index list.
+;;;
+(defvar *regex-groups* (make-array 10))
+(defvar *regex-groupings* 0)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; External representation
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar *zb-rules*) ; alist of rule-names and zb-rule structs
+
+(defstruct zb-rule
+ -name
+ -productions)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Internal Representation of Productions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; About the internal representation of productions:
+;;; production-index: (0 .. Number of productions - 1)
+;;; lhs: a g-symbol
+;;; rhs: a list of g-symbols
+;;; production-length: the length of rhs
+
+(defstruct (production (:conc-name nil))
+ lhs
+ rhs
+ production-index
+ production-length)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; check the first form of a grammar file
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; this applies to a .zb as well as a .tab file
+
+(declaim (special *compiler-grammar* *identifier-continue-chars*
+ *identifier-start-chars*))
+
+(defun check-grammar-options (options filename compiling
+ &aux g-name compiler?)
+ ;; FILENAME is of type path
+ ;; check the list of options for plausibility
+ ;; on package conflict, Nil is returned to catch point: read-grammar-options
+ ;; we must then read the options again with *package* set correctly
+ (unless (and (listp options) (not (null options)))
+ (error "~S is not a valid Options List for a Zebu grammar!" options))
+ (flet ((wrng-make-grammar-arglist (key)
+ (error "~S is not a defined keyword for make-grammar." key)))
+ (do ((gg options (cddr gg))) ((null gg))
+ (let ((key (car gg)) (val (cadr gg)))
+ (if (keywordp key)
+ (case key
+ (:NAME (setq g-name val))
+ (:PACKAGE
+ (let ((p (find-package val)))
+ (if p
+ (progn
+ (use-package "ZEBU" p)
+ (unless (eq *package* p)
+ (setq *package* p)
+ (throw 'read-grammar-options nil)))
+ (error
+ "Package ~s should be defined before ~:[loading~;compiling~] ~S"
+ val compiling filename))))
+ (:GRAMMAR (let ((g (find-grammar val)))
+ (setq compiler? t)
+ (if g
+ (setq *compiler-grammar* g)
+ (warn "Grammar ~S is not loaded" val))))
+ (:IDENTIFIER-CONTINUE-CHARS
+ (setf *identifier-continue-chars* val))
+ (:IDENTIFIER-START-CHARS
+ (setf *identifier-start-chars* val))
+ ((:STRING-DELIMITER :SYMBOL-DELIMITER :FILE :DOMAIN
+ :LEX-CATS :WHITE-SPACE :DOMAIN-FILE
+ :INTERN-IDENTIFIER :CASE-SENSITIVE))
+ (t (wrng-make-grammar-arglist key)))
+ (wrng-make-grammar-arglist key))))
+ (unless g-name
+ (setq g-name (pathname-name filename)
+ options (list* ':NAME g-name options)))
+ (when (and compiling (not compiler?))
+ (warn "Compiling with :GRAMMAR \"null-grammar\".
+To use the meta grammar use: :GRAMMAR \"zebu-mg\" in options list!")
+ (setq *compiler-grammar* *NULL-Grammar*))
+ (when compiling
+ (setq options (list* ':FILE (namestring filename) options)))
+ options))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; The Root of the Domain Hierarchy
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defstruct (kb-domain (:constructor nil)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Internal representation of the domain hierarchy as a tree
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct (type-tree-node
+ (:print-function
+ (lambda (item stream level)
+ (declare (ignore level))
+ (format stream "[[~s]]"
+ (type-tree-node--label item)))))
+ -label
+ -subtypes
+ -supertype ; back link
+ -slots
+ )
+
+(defvar *domain-type-hierarchy*) ; a backlinked tree
+(defvar *domain-HT* (make-hash-table)) ; a dictionary label --> node
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Map Domain def into Hashtable
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(declaim (special *domain-HT* *open-categories*))
+(defvar *lex-cats* nil)
+;----------------------------------------------------------------------------;
+; prepare-domain
+;---------------
+; convert a domain D (as read from a grammar file) into the tree representation
+;
+(defun prepare-domain (domain)
+ (clrhash *domain-HT*)
+ (let* ((top (new-domain-node ':TOP nil nil)))
+ (setf *domain-type-hierarchy* top
+ (type-tree-node--subtypes top)
+ (list*
+ (new-domain-node 'kb-sequence top '(first rest))
+ (new-domain-node 'kb-domain top '())
+ (nconc (mapcar #'(lambda (s)
+ (new-domain-node (intern s) top nil))
+ *open-categories*)
+ (mapcar #'(lambda (c) (new-domain-node (car c) top nil))
+ *lex-cats*))))
+ (when domain
+ (add-to-domain domain top)
+ domain)))
+
+(defun add-to-domain (node point)
+ (if (consp node)
+ (let* ((label (car node))
+ (slots (cadr (member ':slots node)))
+ (new-point (new-domain-node label point slots)))
+ (push new-point (type-tree-node--subtypes point))
+ (do ((args (cdr node) (cddr args)))
+ ((null args))
+ (when (eq (car args) ':subtype)
+ (add-to-domain (cadr args) new-point))))
+ (let ((new-point (new-domain-node node point nil)))
+ (push new-point (type-tree-node--subtypes point)))))
+
+(defun new-domain-node (label supertype slots)
+ (let ((new (make-type-tree-node
+ :-label label :-supertype supertype :-slots slots)))
+ (setf (gethash label *domain-HT*) new)))
+
+#||
+(prepare-domain '(cl-user::arith-exp
+ :subtype (cl-user::factor :slots (-value))
+ :subtype (cl-user::*-op :slots (-arg1 -arg2))
+ :subtype (cl-user::+-op :slots (-arg1 -arg2))
+ :subtype (cl-user::expression :slots (-value))))
+||#
+
+(defun def-kb-domain-type (type super slots)
+ (let* ((super-nd (or (gethash super *domain-HT*)
+ (new-domain-node
+ super (gethash ':top *domain-HT*) '())))
+ (type-nd (or (gethash type *domain-HT*)
+ (new-domain-node type super-nd slots))))
+ (pushnew type-nd (type-tree-node--subtypes super-nd))
+ type-nd))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-aux.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-closure.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-closure.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,183 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-closure.lisp
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Tue Aug 2 16:11:09 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Calculate the closure of an lr(0) set of items
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(defun closure (I)
+ (declare (type oset I))
+ (let ((eset
+ (make-oset :order-fn #'item-order-function)
+ ))
+ ;; I is an oset of items.
+ ;; This is non-destructive.
+ ;; See Fig. 4.33 of Dragon
+ (labels ((closure-insert-item! (item)
+ ;; Add an item to an oset of items. Add his pals too if he wasn't
+ ;; there already.
+ (when (oset-insert! item eset)
+ (unless (dot-at-right-end? item)
+ (dolist (production
+ (the list
+ (g-symbol-own-productions
+ (symbol-after-dot item)))
+ nil)
+ (let ((new (new-item production)))
+ (closure-insert-item! new)))
+ ))))
+ (dolist (x (oset-item-list I)) (closure-insert-item! x))
+ eset)))
+
+#||
+(defun closure (I)
+ (declare (type oset I))
+ (let ((eset (make-oset :order-fn #'item-order-function)))
+ ;; I is an oset of items.
+ ;; This is non-destructive.
+ ;; See Fig. 4.33 of Dragon
+ (labels ((closure-insert-item! (item)
+ ;; Add an item to an oset of items. Add his pals too if he wasn't
+ ;; there already.
+ (when (oset-insert! item eset)
+ (unless (dot-at-right-end? item)
+ (dolist (production (g-symbol-own-productions
+ (symbol-after-dot item)))
+ (closure-insert-item!
+ (the item (new-item production))))))))
+ (dolist (x (oset-item-list I)) (closure-insert-item! x))
+ eset)))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Calculate the lr(1) closure of a set of lr(1) items.
+;;; Currently, find the closure of a set of one lr(1) item.
+;;;
+;;; An lr(1) item data structure with a set of lookaheads
+;;; actually stands for a set of lr(1) items which are the
+;;; same except for each having one lookahead from the set.
+
+(defun single-item-closure-1 (lr0-item look-ahead)
+ (let ((eset (make-oset :order-fn #'item-order-function)))
+ (closure-1-insert-item! lr0-item look-ahead eset)
+ eset))
+
+
+;;; Destructively take the lr(1) closure of an item set
+;;; (actually an oset of items... not an item-set structure).
+;;; Empty out the set and re-insert the contents with closures.
+
+(defun closure-1! (item-set)
+ (let ((item-list (oset-item-list item-set)))
+ (setf (oset-item-list item-set) nil)
+ (dolist (item item-list)
+ (let ((the-look-aheads (item-look-aheads item)))
+ (setf (item-look-aheads item)
+ (make-oset :order-fn #'g-symbol-order-function))
+ (dolist (look-ahead (oset-item-list the-look-aheads))
+ (closure-1-insert-item! item look-ahead item-set))))))
+
+;----------------------------------------------------------------------------;
+; closure-1-insert-item!
+;-----------------------
+; See Dragon Fig. 4.38
+;
+
+(defun closure-1-insert-item! (lr0-item look-ahead item-set)
+ (declare (type item lr0-item))
+ (labels ((closure-1-insert-item-aux (lr0-item look-ahead)
+ (multiple-value-bind (item-not-there-already the-item)
+ (oset-insert-2! lr0-item item-set)
+ (when (or (oset-insert! look-ahead (item-look-aheads the-item))
+ item-not-there-already)
+ ;; Item wasn't already there with that lookahead
+ ;; so insert his buddies too.
+ (unless (dot-at-right-end? lr0-item)
+ (let* ((prod (item-production lr0-item))
+ (rhs (rhs prod))
+ (after-dot-rhs
+ (nthcdr (the fixnum (item-after-dot lr0-item))
+ (the cons rhs)))
+ (gs-list (oset-item-list
+ (first-seq-1
+ ;; This gets the list corresponding to the
+ ;; part of the item beyond the symbol after
+ ;; the dot.
+ (cdr (the cons after-dot-rhs))
+ look-ahead))))
+ (dolist (prod (g-symbol-own-productions
+ (car (the cons after-dot-rhs))))
+ (dolist (gs gs-list)
+ (let ((new (new-item prod)))
+ (closure-1-insert-item-aux new gs))))))))))
+ (closure-1-insert-item-aux lr0-item look-ahead)))
+
+#|
+(defun closure-1-insert-item! (lr0-item look-ahead item-set)
+ (declare (type item lr0-item))
+ (labels ((closure-1-insert-item-aux (lr0-item look-ahead)
+ (multiple-value-bind (item-not-there-already the-item)
+ (oset-insert-2! lr0-item item-set)
+ (when (or (oset-insert! look-ahead (item-look-aheads the-item))
+ item-not-there-already)
+ ;; Item wasn't already there with that lookahead
+ ;; so insert his buddies too.
+ (unless (dot-at-right-end? lr0-item)
+ (let* ((prod (item-production lr0-item))
+ (rhs (rhs prod))
+ (after-dot-rhs
+ (nthcdr (the fixnum (item-after-dot lr0-item))
+ (the cons rhs)))
+ (gs-list (oset-item-list
+ (first-seq-1
+ ;; This gets the list corresponding to the
+ ;; part of the item beyond the symbol after
+ ;; the dot.
+ (cdr (the cons after-dot-rhs))
+ look-ahead))))
+ (dolist (prod (g-symbol-own-productions
+ (car (the cons after-dot-rhs))))
+ (dolist (gs gs-list)
+ (closure-1-insert-item-aux
+ (new-item prod) gs)))))))))
+ (closure-1-insert-item-aux lr0-item look-ahead)))
+|#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+#||
+(set-working-directory *ZEBU-test-directory*)
+(zb::load-grammar "ex1.zb")
+(zb::compile-slr-grammar "ex1.zb")
+(zebu-load-file "ex1.tab")
+(calculate-empty-string-derivers)
+(calculate-first-sets)
+(setq f-item (new-item (car (reverse *productions*))))
+(setq f-i-set (single-item-closure-1
+ f-item *the-end-g-symbol*))
+(item-list-print (oset-item-list f-i-set))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of closure1.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-compile-mg.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-compile-mg.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,31 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: zebu-compile-mg.lisp
+; Description: Compile and load the metagrammar during load process
+; Author: Rudi Schlatte
+; Created: 2000-03-26
+; Time-stamp: <00/03/26 15:14:11 rschlatt>
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; This is only needed for mk:defsystem (or until I figure out
+; how to compile arbitrary file types with custom compilers
+; in defsystem, which is all that happens here)
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(in-package #:ZEBU)
+
+(eval-when (:compile-toplevel)
+ (ignore-errors
+ (delete-file (merge-pathnames "zebu-mg.tab" *compile-file-truename*))
+ (delete-file (merge-pathnames "zmg-dom.lisp" *compile-file-truename*)))
+ (zebu-compile-file
+ (merge-pathnames "zebu-mg.zb" *compile-file-truename*)))
+
+
+(eval-when (:load-toplevel)
+ (zebu-load-file
+ (merge-pathnames "zebu-mg.tab" *load-truename*)))
Added: vendor/zebu/zebu-compile.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-compile.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,103 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-compile.lisp
+; Description: apply the grammar-compiler
+; Author: Joachim H. Laubsch
+; Created: 6-Nov-90
+; Modified: Tue Aug 2 16:20:04 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 25-Apr-91 (Joachim H. Laubsch)
+; introduced *WARN-CONFLICTS* to shut up warnings
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(in-package "ZEBU")
+
+;; whether warnings about action-conflicts are printed at compile time
+(defvar *warn-conflicts* nil)
+(defvar *compiler-grammar* *null-grammar*
+ "The grammar that the Zebu Compiler uses when reading a grammar.
+By default this is the Null-Grammar.")
+
+(defun zebu-compile-file (grammar-file
+ &key (grammar *null-grammar*)
+ output-file
+ verbose
+ (compile-domain t))
+ "Compiles the LALR(1) grammar in file GRAMMAR-FILE."
+ (assert (probe-file (setq grammar-file
+ (merge-pathnames grammar-file
+ (merge-pathnames
+ (make-pathname :type "zb")))))
+ (grammar-file)
+ "Cannot find grammar file: ~A" grammar-file)
+ (setq output-file
+ (let ((tab (make-pathname :type "tab")))
+ (if output-file
+ (merge-pathnames (pathname output-file) tab)
+ (merge-pathnames tab grammar-file))))
+ (when (probe-file output-file) (delete-file output-file))
+ (format t "~%; Zebu Compiling (Version ~A)~%; ~S to ~S~%"
+ *zebu-version* grammar-file output-file)
+ (let ((*warn-conflicts* verbose))
+ (compile-lalr1-grammar grammar-file
+ :output-file output-file
+ :grammar grammar
+ :verbose verbose
+ :compile-domain compile-domain)))
+
+
+;----------------------------------------------------------------------------;
+; compile-from-command-line
+;--------------------------
+; call zebu-compile-file with a command-line-argument
+;
+#+LUCID
+(defun compile-from-command-line ()
+ (let ((*default-pathname-defaults*
+ (make-pathname :directory
+ (pathname-directory (working-directory))
+ :type "zb"))
+ (ifile (command-line-argument 1))
+ ofile
+ verbose
+ compile-domain)
+ (if (null ifile)
+ (Warn "No input file specified!")
+ (progn
+ (do* ((a 2 (1+ a))
+ (arg (command-line-argument a) (command-line-argument a)))
+ ((null arg))
+ (cond ((equalp arg "-v") (setq verbose t))
+ ((equalp arg "-d") (setq compile-domain t))
+ ((equalp arg "-r") (load (command-line-argument (incf a))))
+ ((= a 2) (setq ofile arg))))
+ (apply #'zebu-compile-file ifile
+ :verbose verbose
+ :compile-domain compile-domain
+ (when ofile
+ `(:output-file ,ofile)))))
+ (terpri)
+ (quit)))
+
+
+;----------------------------------------------------------------------------;
+; zebu-top
+;---------
+; interactive compiler invocation
+
+(defun zebu-compile-top ()
+ (format t "~&Enter the name of a Zebu Grammar file to compile: ")
+ (let ((ifile (read-line t)))
+ (zebu-compile-file ifile)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-compile.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-compiler.asd
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-compiler.asd Wed Oct 17 09:04:46 2007
@@ -0,0 +1,81 @@
+;;; -*- Lisp -*-
+
+;;;(in-package "CL-USER")
+
+(asdf:defsystem #:zebu-compiler
+ ;; Compile time system for LALR(1) parser: Converts a grammar to a
+ ;; parse table
+ :depends-on ("zebu")
+ :components
+ ((:file "zebu-regex")
+ (:file "zebu-oset")
+ (:file "zebu-kb-domain") ; not explicitly in ZEBU-sys.lisp
+ (:file "zebu-g-symbol"
+ :in-order-to ((compile-op (load-op "zebu-oset"))))
+ (:file "zebu-loadgram"
+ :in-order-to ((compile-op (load-op "zebu-g-symbol")
+ (load-op "zebu-oset"))))
+ (:file "zebu-generator"
+ :in-order-to ((compile-op (load-op "zebu-loadgram")
+ (load-op "zebu-kb-domain"))))
+ (:file "zebu-lr0-sets"
+ :in-order-to ((compile-op (load-op "zebu-g-symbol")
+ (load-op "zebu-loadgram"))))
+ (:file "zebu-empty-st"
+ :in-order-to ((compile-op (load-op "zebu-loadgram"))))
+ (:file "zebu-first"
+ :in-order-to ((compile-op (load-op "zebu-loadgram")
+ (load-op "zebu-oset")))
+ ;; :recompile-on "zebu-oset"
+ )
+ (:file "zebu-follow"
+ :in-order-to ((compile-op (load-op "zebu-loadgram")
+ (load-op "zebu-first"))))
+ (:file "zebu-tables"
+ :in-order-to ((compile-op (load-op "zebu-g-symbol")
+ (load-op "zebu-loadgram")
+ (load-op "zebu-lr0-sets"))))
+ (:file "zebu-printers"
+ :in-order-to ((compile-op (load-op "zebu-loadgram")
+ (load-op "zebu-lr0-sets")
+ (load-op "zebu-tables"))))
+ (:file "zebu-slr")
+ (:file "zebu-closure"
+ :in-order-to ((compile-op (load-op "zebu-oset")
+ (load-op "zebu-g-symbol")
+ (load-op "zebu-first"))))
+ (:file "zebu-lalr1"
+ :in-order-to ((compile-op (load-op "zebu-oset")
+ (load-op "zebu-lr0-sets")
+ (load-op "zebu-follow"))))
+ (:file "zebu-dump"
+ :in-order-to ((compile-op (load-op "zebu-loadgram")
+ (load-op "zebu-slr")
+ (load-op "zebu-lalr1"))))
+ (:file "zebu-compile"
+ :in-order-to ((compile-op (load-op "zebu-dump"))))
+ (:file "zebu-compile-mg"
+ :in-order-to ((compile-op (load-op "zebu-compile")
+ (load-op "zebu-dump")
+ (load-op "zebu-empty-st")
+ (load-op "zebu-closure")
+ (load-op "zebu-tables")
+ (load-op "zebu-generator"))
+ ((load-op (compile-op "zebu-compile-mg")
+ (load-op "zebu-compile")
+ (load-op "zebu-dump")
+ (load-op "zebu-empty-st")
+ (load-op "zebu-closure")
+ (load-op "zebu-tables")
+ (load-op "zebu-generator")))))
+ (:file "zmg-dom"
+ :in-order-to ((compile-op (load-op "zebu-compile-mg"))))
+ (:file "zebu-kb-domain"
+ :in-order-to ((compile-op (load-op "zmg-dom"))))
+ ;;; Hook it into asdf
+ (:file "zebu-asdf-setup"
+ :in-order-to ((compile-op (load-op "zebu-kb-domain"))))))
+
+
+
+
Added: vendor/zebu/zebu-compiler.system
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-compiler.system Wed Oct 17 09:04:46 2007
@@ -0,0 +1,52 @@
+;;; -*- Lisp -*-
+
+;;;(in-package "CL-USER")
+
+(mk:defsystem "zebu-compiler"
+ :source-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/"
+ :binary-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/binary/"
+ ;;:package "ZEBU"
+ :depends-on ("zebu")
+ :components
+ ((:file "zebu-regex")
+ (:file "zebu-oset")
+ (:file "zebu-kb-domain") ; not explicitly in ZEBU-sys.lisp
+ (:file "zebu-g-symbol"
+ :depends-on ("zebu-oset"))
+ (:file "zebu-loadgram"
+ :depends-on ("zebu-g-symbol" "zebu-oset"))
+ (:file "zebu-generator"
+ :depends-on ("zebu-loadgram" "zebu-kb-domain"))
+ (:file "zebu-lr0-sets"
+ :depends-on ("zebu-g-symbol" "zebu-loadgram"))
+ (:file "zebu-empty-st"
+ :depends-on ("zebu-loadgram"))
+ (:file "zebu-first"
+ :depends-on ("zebu-loadgram" "zebu-oset"))
+ (:file "zebu-follow"
+ :depends-on ("zebu-loadgram" "zebu-first"))
+ (:file "zebu-tables"
+ :depends-on ("zebu-g-symbol" "zebu-loadgram"
+ "zebu-lr0-sets"))
+ (:file "zebu-printers"
+ :depends-on ("zebu-loadgram" "zebu-lr0-sets"
+ "zebu-tables"))
+ (:file "zebu-slr")
+ (:file "zebu-closure"
+ :depends-on ("zebu-oset" "zebu-g-symbol" "zebu-first"))
+ (:file "zebu-lalr1"
+ :depends-on ("zebu-oset" "zebu-lr0-sets" "zebu-follow"))
+ (:file "zebu-dump"
+ :depends-on ("zebu-loadgram" "zebu-slr" "zebu-lalr1"))
+ (:file "zebu-compile"
+ :depends-on ("zebu-dump"))
+ (:file "zebu-compile-mg"
+ :depends-on ("zebu-compile"))
+ (:file "zmg-dom"
+ :depends-on ("zebu-compile-mg"))
+ (:file "zebu-kb-domain"
+ :depends-on ("zmg-dom"))))
+
+
+
+
Added: vendor/zebu/zebu-driver.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-driver.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,1081 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-driver.lisp
+; Description: Conversion to CL of the original Scheme program (by W. M Wells)
+; Author: Joachim H. Laubsch
+; Created: 10-Oct-90
+; Modified: Thu Oct 2 09:58:20 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 26-Jul-95 (Joachim H. Laubsch)
+; a user defined category, that can also be read as a keyword is
+; only identified if it is longer than a keyword
+; 25-Apr-94 (Joachim H. Laubsch)
+; implemented state-sensitive token look-ahead
+; 17-Aug-93 (Joachim H. Laubsch)
+; read-parser recognizes numbers: integer, ratio and float
+; <digit>* [ "." <digit>+ ]
+; <digit>+ "/" <digit>+
+; the boolean id-allows-start-digit determines for a grammar whether an
+; identifier may start with a digit.
+; 22-Feb-93 (Joachim H. Laubsch)
+; if the grammar's intern-identifier attribute is true (default), an
+; Identifier will be represented as a symbol, otherwise a string
+; 2-Feb-93 (Joachim H. Laubsch)
+; introduce the variable *case-sensitive* to deal with grammars whith
+; case-sensitive keywords
+; 13-Jan-93 (Joachim H. Laubsch)
+; rewrote recognize-token so that (in ALL cases) keys that could start an
+; identifier will not be recognized as keys, but as identifiers.
+; 27-Nov-92 (Joachim H. Laubsch)
+; Added Variable *preserve-case*
+; "If true, the case of an identifier will be preserved (default false)."
+; 29-Sep-92 (Joachim H. Laubsch)
+; a one-character keyword is considered a token iff it is not
+; in identifier-start-chars or if the next character is not in
+; identifier-continue-chars
+; 21-Jul-92 (Joachim H. Laubsch)
+; improved handling of NUMBER and IDENTIFIER in next-token
+; 27-Apr-92 (Joachim H. Laubsch)
+; introduce *COMMENT-START*, a character that causes everything following
+; until the end-of-line to be ignored
+; introduce *COMMENT-BRACKETS*, a list of pairs of strings that designate
+; everything between them as to be ignored
+; 22-Apr-92 (Joachim H. Laubsch)
+; define FILE-PARSER, a function like READ-PARSER that takes input
+; from a file instead of from a string
+; introduced :junk-allowed as argument to READ-PARSER with same meaning
+; as that keyword in READ-FROM-STRING
+; analogously in LIST-PARSER
+; 15-Apr-92 (Joachim H. Laubsch)
+; introduce *IDENTIFIER-START-CHARS*
+; 30-Oct-91 (Joachim H. Laubsch)
+; improved error checking in case a grammar does not use NUMBER, but the
+; parser will be given strings containing NUMBERs
+; 16-Jul-91 (Joachim H. Laubsch)
+; Added a facility to deal with multiple grammars
+; lr-parse takes a third argument, a grammar
+; READ-PARSER and LIST-PARSER take a :grammar keyword argument, defaulting to
+; *current-grammar*
+; 26-Jun-91 (Joachim H. Laubsch)
+; Added a proposal to distinguish String and Symbol-tokens in lexical analysis
+; of read-parser. See comments with section
+; *string-delimiter*, *symbol-delimiter*
+; 25-Apr-91 (Joachim H. Laubsch)
+; fixed bug in read-parser which caused scanner to break if a number was the
+; last constituent of a string
+; 26-Mar-91 (Joachim H. Laubsch)
+; in the case where a keyword is found, but no action defined, we
+; assume it must be an identifier. If there is an action entry for
+; an identifier, that identifier is interned from the keyword string read
+; 26-Mar-91 (Joachim H. Laubsch)
+; make read-parser read these types of numbers: integer, float, rational
+; 1-Mar-91 (Joachim H. Laubsch)
+; made various simple changes, based on monitoring results to speed up
+; READ-PARSER by a factor of 10
+; 30-Jan-91 (Joachim H. Laubsch)
+; introduce variable: *string-delimiter*
+; 17-Jan-91 (Joachim H. Laubsch)
+; introduced String syntax: "Fred Jones" is a nll-constant
+; 11-Dec-90 (Joachim H. Laubsch)
+; introduced the ZEBU package, and imported its exported symbols into USER
+; 7-Dec-90 (Joachim H. Laubsch)
+; if a keyword ending in a symbol-continue-char is followed by a
+; symbol-continue-char a keyword token is NOT recognized (but an identifier)
+; except if there would have been a single character keyword recognizing the
+; same initial substring. E.g. ?u?foo1 is tokenized as ?u?, foo1, because
+; there is the shorter keyword alternative: ?, u?foo1
+; The principle is to give priority to the longest possible keyword.
+; (Note that agt007 or agt?x are recognized as identifiers)
+; 27-Nov-90 (Joachim H. Laubsch)
+; Lexical Analysis (recognize-token) will recognize any keyword of the
+; language. If lr-parse is given a token that is a keyword, it may not have
+; an action for it, but if this same token were regarded as an identifier,
+; there would be one. Instead of reporting an error, lr-parse will now look
+; first for the identifier-action.
+; It would be best, if lr-parse could predict, whether an identifier is legal
+; in the current state and then direct recognize-token appropriately. I should
+; come back to this, and implement that. It would also save time.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Written by William M. Wells. This is an example lr parser driver
+;;; which uses parse table files generated by Zebu.
+
+(in-package "ZEBU")
+
+(provide "zebu-driver")
+(require "zebu-loader")
+;;;
+;;; A rudimentary lr parser driver.
+;;; It has provisions for applying client supplied procedures which are
+;;; associated with productions in the grammar.
+;;;
+;;;
+;;; This code is independent of the parse table generating system,
+;;; and basically stand alone, although
+;;; it needs some macros defined in other files.
+;;;
+(defvar *CURRENT-GRAMMAR* *NULL-Grammar*)
+
+(defvar *terminal-alist-SEQ*)
+
+(defvar *lexer-debug* nil)
+(eval-when (compile)
+ (setq *lexer-debug* nil))
+
+#|
+(setq *lexer-debug* t)
+|#
+
+(defmacro if-debugging-lexer (then &optional else)
+ `,(if *lexer-debug* then else))
+
+(if-debugging
+ (defmacro say-looking-at ()
+ '(format t "~%Looking-at: ~S . ~a {~s}"
+ input-symbol-instantiation
+ (let ((a (svref (grammar-lexicon grammar) input-symbol-index)))
+ (if (symbolp a) (format nil "<~a>" (symbol-name a)) a))
+ input-symbol-index)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; utilities
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; (upcased-subseq string from to) == (string-upcase (subseq string from to))
+;; but avoids a copy
+(defun upcased-subseq (string beg end)
+ (declare (simple-string string) (fixnum beg end))
+ (let* ((size (- end beg))
+ (R (make-sequence 'simple-string size))
+ (stringi beg))
+ (declare (simple-string R) (fixnum stringi))
+ (dotimes (index size)
+ (setf (schar R index) (char-upcase (the character (schar string stringi))))
+ (incf stringi))
+ R))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; The LR parser itself
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; symbol-stack and state-stack are the standard things for an lr parser.
+;;; the client lambdas and stack are used in the following fashion:
+;;;
+;;; When a shift action occurs, the instantiation of the input symbol
+;;; is pushed onto the client stack.
+;;;
+;;; When a reduce action occurs, as many items as are on the lhs
+;;; of the associated production are popped from the client stack
+;;; and the corresponding client lambda is applied to the popped
+;;; items. The result of the application is then pushed onto the
+;;; client stack. One may of course do whatever one wishes by side
+;;; effect.
+
+;;; when junk-allowed, 2 values are returned:
+;;; the object found so far
+;;; the value returned by last-pos-fn
+;;; last-pos-fn should be defined as a function that returns the place
+;;; before the token just returned by next-token-fn
+
+;;; when more-allowed, no "<end of string>" error is issued but
+;;; more-fn is called to extend the token-stream that next-token-fn is
+;;; using.
+
+(defun lr-parse (next-token-fn error-fn grammar
+ &optional junk-allowed last-pos-fn
+ &aux symbol-stack client-stack state-stack
+ action-table-top state-stack-top)
+ (declare #+(or :MCL :ANSI-COMMON-LISP)
+ (dynamic-extent symbol-stack client-stack state-stack)
+ (type (or cons null) symbol-stack client-stack state-stack)
+ (type grammar grammar)
+ (type (function (simple-vector) (values t fixnum)) next-token-fn)
+ (type (function (string) error) error-fn))
+ (let ((start-state (grammar-lr-parser-start-state-index grammar))
+ (production-info (grammar-production-info grammar))
+ (action-table (grammar-action-table grammar))
+ (goto-table (grammar-goto-table grammar))
+ (client-lambdas (grammar-client-lambdas grammar))
+ (end-symbol-index (grammar-end-symbol-index grammar))
+ action-entry)
+ (declare (fixnum end-symbol-index)
+ (simple-vector action-table goto-table))
+ (push start-state state-stack)
+ (setf state-stack-top start-state
+ action-table-top (svref action-table start-state))
+ (multiple-value-bind (input-symbol-instantiation input-symbol-index)
+ (funcall next-token-fn action-table-top)
+ (if-debugging (say-looking-at))
+ (setf action-entry (vec-bs-assoc (the fixnum input-symbol-index)
+ action-table-top))
+ (loop
+ (when (null action-entry)
+ (if (eq input-symbol-index end-symbol-index)
+ (funcall error-fn
+ (undef-action-error input-symbol-instantiation
+ input-symbol-index
+ action-table-top
+ grammar))
+ (unless (and junk-allowed
+ ;; assume that EOF was seen
+ (setq action-entry
+ (vec-bs-assoc
+ end-symbol-index action-table-top)))
+ (or (let ((idx (grammar-identifier-index grammar)))
+ (and (setf action-entry (vec-bs-assoc idx action-table-top))
+ (stringp input-symbol-instantiation)
+ (not (string=
+ (the string input-symbol-instantiation) ""))
+ (identifier-start-char-p
+ (schar input-symbol-instantiation 0))
+ (not (find-if-not #'identifier-continue-char-p
+ input-symbol-instantiation
+ :start 1))
+ (setq input-symbol-instantiation
+ (if (grammar-intern-identifier grammar)
+ (intern
+ (if *preserve-case*
+ (the string input-symbol-instantiation)
+ (string-upcase
+ (the string input-symbol-instantiation))))
+ input-symbol-instantiation)
+ input-symbol-index idx)))
+ (funcall error-fn
+ (undef-action-error input-symbol-instantiation
+ input-symbol-index
+ action-table-top
+ grammar))))))
+ ;; there should always be a non null action-entry !!
+ (let ((ae-cdr (cdr (the cons action-entry))))
+ (case (car (the cons ae-cdr))
+ (:S ; Shift.
+ (setf state-stack-top (cadr ae-cdr) ; new-state
+ action-table-top (svref action-table state-stack-top))
+ (push state-stack-top state-stack)
+ (if-debugging (format t "~%Shift to ~S" state-stack-top))
+ (push input-symbol-index symbol-stack)
+ (push input-symbol-instantiation client-stack)
+ (multiple-value-setq
+ (input-symbol-instantiation input-symbol-index)
+ (funcall next-token-fn action-table-top))
+ (if-debugging (say-looking-at))
+ (setf action-entry (vec-bs-assoc (the fixnum input-symbol-index)
+ action-table-top)))
+ (:R ; Reduce.
+ (let* ((prod-index (cadr ae-cdr))
+ (p (svref production-info prod-index))
+ ;; p = <lhs-symbol-index> . <production-length>
+ (prod-lhs (car (the cons p)))
+ (prod-ln (cdr (the cons p)))
+ (client-lambda (svref client-lambdas prod-index)))
+ (if-debugging (format t "~%Reduce ~S" prod-index))
+ ;; optimize simple cases
+ (case prod-ln
+ (0 ; Apply the client lambda and store the result.
+ (if-debugging (format t "~%; Calling ~S" client-lambda))
+ (push (funcall client-lambda) client-stack)
+ (if-debugging
+ (let ((R (car client-stack)))
+ (format t "~%; -> ~S : ~S" R (type-of R)))))
+ (1 ; Apply the client lambda and store the result.
+ (when client-lambda
+ (if-debugging (format t "~%; Applying ~S to ~S"
+ client-lambda (car client-stack)))
+ (setf (car client-stack)
+ (funcall client-lambda (car client-stack)))
+ (if-debugging
+ (let ((R (car client-stack)))
+ (format t "~%; -> ~S : ~S" R (type-of R)))))
+ (setq symbol-stack (cdr symbol-stack)
+ state-stack (cdr state-stack)
+ ))
+ (2 ; Apply the client lambda and store the result.
+ (if-debugging (format t "~%; Applying ~S to ~{ ~s~}"
+ client-lambda (subseq client-stack 0 2)))
+ (when client-lambda
+ (let* ((arg2 (pop client-stack))
+ (R (funcall client-lambda
+ (car client-stack)
+ arg2)))
+ (setf (car client-stack) R)))
+ (setq symbol-stack (cddr symbol-stack)
+ state-stack (cddr state-stack))
+ (if-debugging
+ (let ((R (car client-stack)))
+ (format t "~%; -> ~S : ~S" R (type-of R)))))
+ (t (let (constituents)
+ (dotimes (i prod-ln)
+ (setq symbol-stack (cdr symbol-stack)
+ state-stack (cdr state-stack))
+ (push (pop client-stack) constituents))
+ ;; Apply the client lambda and store the result.
+ (if-debugging (format t "~%; Applying ~S to ~S"
+ client-lambda constituents))
+ (push (apply client-lambda ; action
+ constituents)
+ client-stack)
+ (if-debugging
+ (let ((R (car client-stack)))
+ (format t "~%; -> ~S : ~S" R (type-of R)))))))
+ (push prod-lhs symbol-stack) ; Push lhs of production.
+ (let ((goto (cdr (the cons
+ (vec-bs-assoc
+ prod-lhs
+ (svref goto-table (car state-stack)))))))
+ (if (null goto)
+ (funcall error-fn "table error? goto not defined!"))
+ (push goto state-stack)
+ (setf state-stack-top goto ; new-state
+ action-table-top (svref action-table state-stack-top)
+ action-entry (vec-bs-assoc
+ (the fixnum input-symbol-index)
+ action-table-top))
+ )))
+ (:A
+ ;; Accept on END symbol.
+ (if-debugging (format t "~%Accepting"))
+ ;; (break "Accept ~s" input-symbol-index)
+ (if junk-allowed
+ (return
+ (values (car client-stack)
+ (when last-pos-fn (funcall last-pos-fn))))
+ (if (= input-symbol-index end-symbol-index)
+ (return
+ (values (car client-stack)
+ (when last-pos-fn (funcall last-pos-fn))))
+ (if (eq input-symbol-instantiation T)
+ (funcall error-fn "Unexpected token")
+ (funcall error-fn "extra input?")))))
+ (T (funcall error-fn
+ (format nil
+ "Bogus action: ~S" (car ae-cdr))))))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Errors
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun possible-tokens (expected lexicon)
+ (if expected
+ (let ((tokenL (map 'list
+ #'(lambda (action)
+ (let ((a (svref lexicon (car action))))
+ (if (symbolp a)
+ (format nil "<~a>" (symbol-name a))
+ (format nil "~s" a))))
+ expected)))
+ (format
+ nil "~%Expected~:[ one of~;~]:~{ ~a~}~%"
+ (= 1 (length tokenL)) tokenL))
+ ""))
+
+(defun unrecognized-token-error (string pos expected grammar)
+ (let ((lexicon (grammar-lexicon grammar)))
+ (concatenate 'string
+ (format nil "Unrecognized Token at: ~s"
+ (subseq string pos))
+ (possible-tokens expected lexicon))))
+
+(defun undef-action-error (token index expected grammar)
+ (let* ((lexicon (grammar-lexicon grammar))
+ (type (if index
+ (let ((e (svref lexicon index)))
+ (if (symbolp e)
+ (format nil "<~a>" (symbol-name e))
+ "KEY")))))
+ (format
+ nil "Syntax error (action not defined for token: ~S~@[ a ~a~])~a"
+ token type (possible-tokens expected lexicon))))
+
+
+;;; A function for looking up table entries using binary search
+;;; the vector elements are the assoc key and should be in increasing order.
+#||
+(defun vec-bs-assoc (num vec)
+ (declare (type fixnum num) (type vector vec))
+ (labels ((vec-bs-assoc-aux (start end)
+ (declare (type fixnum start end))
+ (let ((start-entry (svref vec start)))
+ (declare (type cons start-entry))
+ (cond ((= num (the fixnum (car start-entry))) start-entry)
+ ((= start end) nil)
+ (T (let ((mid (floor (+ start end) 2)))
+ (declare (type fixnum mid))
+ (if (> num (the fixnum (car (svref vec mid))))
+ (vec-bs-assoc-aux (1+ mid) end)
+ (vec-bs-assoc-aux start mid))))))))
+ (let ((last (1- (length (the vector vec)))))
+ (declare (type fixnum last))
+ (if (or (< num (the fixnum (car (svref vec 0))))
+ (> num (the fixnum (car (svref vec last)))))
+ nil
+ (vec-bs-assoc-aux 0 last)))))
+||#
+#-ALLEGRO
+(defun vec-bs-assoc (num vec)
+ (declare (type fixnum num) (type simple-vector vec))
+ (labels ((vec-bs-assoc-aux (start end)
+ (declare (type fixnum start end))
+ (let ((start-entry (svref vec start)))
+ (declare (type cons start-entry))
+ (cond ((= num (the fixnum (car start-entry))) start-entry)
+ ((= start end) nil)
+ (T (let ((mid (floor (+ start end) 2)))
+ (declare (type fixnum mid))
+ (if (> num (the fixnum (car (svref vec mid))))
+ (vec-bs-assoc-aux (1+ mid) end)
+ (vec-bs-assoc-aux start mid))))))))
+ (let ((vln (length vec)))
+ (declare (type fixnum vln))
+ (if (zerop vln)
+ nil
+ (let ((last (1- vln)))
+ (declare (type fixnum last))
+ (if (zerop last)
+ (let ((entry (svref vec last)))
+ (declare (cons entry))
+ (when (= num (the fixnum (car entry)))
+ entry))
+ (vec-bs-assoc-aux 0 last)))))))
+
+#+ALLEGRO
+; konrad at dfki.uni-sb.de writes:
+; man kann den Speicherbedarf von Zebu muehelos um mehr als 40%
+; reduzieren, wenn man in zebu-driver die Definition von vec-bs-aux in
+; folgendes veraendert:
+
+(progn
+ (defparameter *bs-vec* nil)
+ (defparameter *bs-num* nil)
+
+ (defun vec-bs-assoc-aux (start end)
+ (declare (type fixnum start end))
+ (let ((start-entry (svref *bs-vec* start)))
+ (declare (type cons start-entry))
+ (cond ((= *bs-num* (the fixnum (car start-entry))) start-entry)
+ ((= start end) nil)
+ (T (let ((mid (floor (+ start end) 2)))
+ (declare (type fixnum mid))
+ (if (> *bs-num* (the fixnum (car (svref *bs-vec* mid))))
+ (vec-bs-assoc-aux (1+ mid) end)
+ (vec-bs-assoc-aux start mid)))))))
+
+ (defun vec-bs-assoc (num vec)
+ (declare (type fixnum num) (type simple-vector vec))
+ (setq *bs-vec* vec *bs-num* num)
+ (vec-bs-assoc-aux 0 (1- (length vec))))
+ )
+
+
+;;; Figure out to which element of the lexicon a token corresponds.
+;;; This gets a little complicated for terminal symbols which can
+;;; vary at parsing time, for example, identifiers and numbers. The way
+;;; these "preterminals" are handled in this driver is as follows:
+;;; If a token passes the CL test PARSE-NUMBER, and the argument number-index
+;;; isn't false, then number-index is treated as representing its category.
+;;; Otherwise, if the token appears exactly in the lexicon, then it is
+;;; given the category of the lexicon item. Otherwise it is assumed
+;;; to be an instance of the terminal IDENTIFIER, whose presence in the
+;;; lexicon is indicated by a non false value for the id-index argument.
+;;; If the token isn't explicitly in the lexicon, and id-index is false,
+;;; then an error is signalled.
+;;;
+
+
+;;; number-index should be the index of the grammar symbol which stands
+;;; for numbers, otherwise it should be false if numbers don't appear
+;;; in the grammar.
+;;;
+;;; id-index should be the index of the grammar symbol which stands
+;;; for identifiers, otherwise it should be false if identifiers don't
+;;; appear in the grammar.
+
+
+(defun categorize (token grammar)
+ (let ((category
+ (if (numberp token)
+ (progn (if-debugging
+ (assert (grammar-number-index grammar) ()
+ "A number was seen in the token stream"))
+ (grammar-number-index grammar))
+ (let ((terminal-associations
+ (elt (grammar-terminal-alist-SEQ grammar)
+ (char-code (let ((c (schar (string token) 0)))
+ (declare (character c))
+ (if (grammar-case-sensitive grammar)
+ c
+ (char-downcase c)))))))
+ (if terminal-associations
+ (let ((terminal-association (assoc token terminal-associations
+ :test #'equal)))
+ (if terminal-association
+ (cdr terminal-association)
+ (grammar-identifier-index grammar)))
+ (grammar-identifier-index grammar))))))
+ (values token category)))
+
+(declaim (inline end-of-tokens-category))
+(defun end-of-tokens-category (grammar)
+ (values Nil (grammar-end-symbol-index grammar)))
+
+(declaim (inline unrecognized-token-category))
+(defun unrecognized-token-category (grammar)
+ (values T (grammar-end-symbol-index grammar)))
+
+;;; This implements a parser which gets its tokens from the supplied list.
+;;; It uses the parsing engine lr-parse which is defined above. It also
+;;; uses the function categorize to classify tokens according to the
+;;; lexicon.
+
+(defun list-parser (token-list &key (grammar *current-grammar*) junk-allowed)
+ (let ((last-position token-list)
+ token1 category)
+ (flet ((list-parser-error (string)
+ (error "~a~% Remaining tokens: ~S~{ ~S~}"
+ string token1 token-list)))
+ (check-type token-list list)
+ (lr-parse
+ ;; This lambda is the tokenizer supplied to the parsing engine:
+ #'(lambda (&optional ignore)
+ (declare (ignore ignore))
+ (if (null token-list)
+ (end-of-tokens-category grammar)
+ (progn
+ (setq last-position token-list)
+ (multiple-value-setq (token1 category)
+ (categorize (pop token-list) grammar))
+ (if (null category)
+ (if junk-allowed
+ (unrecognized-token-category grammar)
+ (list-parser-error
+ (format nil "Unrecognized Token ~s" token1)))
+ (values token1 category)))))
+ ;; This is the error function supplied to the parsing engine:
+ #'list-parser-error
+ grammar
+ junk-allowed
+ ;; Function that returns the remaining unparsed token-list
+ #'(lambda () last-position)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; read-parser
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This implements a parser which gets its tokens from the Lisp function
+;;; read.
+;;; It uses the parsing engine lr-parse which is defined above. It also
+;;; uses the function categorize to classify tokens according to the
+;;; lexicon. It will signal the end of input to the parser when it
+;;; if it reads the end of file.
+
+(defun read-parser (string &key
+ (error-fn #'(lambda (msg) (error "~a" msg)))
+ (print-parse-errors t)
+ (grammar *current-grammar*)
+ (start 0)
+ junk-allowed
+ more-allowed
+ more-fn)
+ (declare (string string))
+ (check-type string string)
+ (check-type grammar grammar)
+ (let ((number-index (grammar-number-index grammar))
+ (identifier-index (grammar-identifier-index grammar))
+ (string-index (grammar-string-index grammar))
+ (string-ln (length (the string string)))
+ (last-pos 0)
+ (pos start)
+ (end-symbol-index (grammar-end-symbol-index grammar))
+ (*identifier-start-chars-V* (grammar-identifier-start-chars-V grammar))
+ (id-allows-start-digit (grammar-id-allows-start-digit grammar))
+ (*identifier-continue-chars-V* (grammar-identifier-continue-chars-V grammar))
+ (*terminal-alist-SEQ* (grammar-terminal-alist-SEQ grammar))
+ (intern-identifier (grammar-intern-identifier grammar))
+ (white-space (grammar-white-space grammar))
+ (string-delimiter (grammar-string-delimiter grammar))
+ (symbol-delimiter (grammar-symbol-delimiter grammar))
+ (lex-cat-map (grammar-lex-cat-map grammar))
+ (*case-sensitive* (grammar-case-sensitive grammar))
+ token find-id? find-string?)
+ (declare (fixnum string-ln pos last-pos)
+ (special *identifier-continue-chars-V*
+ *identifier-start-chars-V*))
+ (flet ((white-space-p (char)
+ (member (the character char) white-space
+ :test #'char=))
+ (digit-seq? (dec end)
+ (and dec
+ (or (>= end string-ln)
+ (and (not id-allows-start-digit)
+ (not (identifier-continue-char-p
+ (schar string end)))))))
+ (new-fraction (num den places)
+ (values (float (+ num (/ den (expt 10 places))))
+ number-index))
+ )
+ ;; The tokenizer supplied to the parsing engine:
+ (flet
+ ((next-token (actionv)
+ (block next-token
+ (if-debugging
+ (format t "~%~a"
+ (possible-tokens actionv (grammar-lexicon grammar))))
+ (loop
+ ;; skip initial blanks
+ (setq last-pos pos
+ pos (or (position-if-not #'white-space-p string
+ :start pos)
+ string-ln))
+ ;; end of string?
+ (when (< pos string-ln) (return nil))
+ (unless (and more-allowed more-fn) (return nil))
+ (setq string
+ (funcall
+ more-fn
+ #'(lambda ()
+ (if (find end-symbol-index actionv
+ :key #'car)
+ (return-from next-token
+ (values nil end-symbol-index))
+ (return-from read-parser
+ (funcall
+ error-fn
+ (unrecognized-token-error
+ "<end of string>" 0 actionv grammar))))))
+ string-ln (length string)
+ pos 0
+ last-pos 0))
+ (when (>= pos string-ln)
+ (if (find end-symbol-index actionv
+ :key #'car)
+ (return-from next-token
+ (values nil end-symbol-index))
+ (return-from read-parser
+ (funcall
+ error-fn
+ (unrecognized-token-error
+ "<end of string>" 0 actionv grammar)))))
+
+ ;; is an IDENTIFIER also expected
+ (setf find-id? (and identifier-index
+ (find identifier-index actionv
+ :key #'car)))
+ ;; scan lexical categories (regular expressions) first
+ (dolist (lex-cat-pair lex-cat-map)
+ (let ((lex-cat (car lex-cat-pair)))
+ (when (find lex-cat actionv :key #'car)
+ (let ((new-pos (funcall (the function (cdr lex-cat-pair))
+ string pos string-ln)))
+ (if-debugging-lexer
+ (format t "~% calling ~s" (cdr lex-cat-pair)))
+ (when
+ (and
+ new-pos
+ ;; a match is found,
+ ;; and it could NOT be a possibly longer identifier
+ ;; and not possibly a longer keyword
+ (or
+ (not find-id?)
+ (not
+ (and (< new-pos string-ln)
+ ;; if a identifier-continue-char doesn't
+ ;; follow, we also accept
+ (identifier-continue-char-p
+ (schar string new-pos))
+ ;; the token starts with
+ ;; an identifier-start-char
+ (identifier-start-char-p
+ (schar string pos))
+ ;; all of the remaining chars
+ ;; continue an identifier
+ (let ((p1 (1+ pos)))
+ (declare (fixnum p1))
+ (or (= p1 new-pos)
+ (not (find-if-not
+ #'identifier-continue-char-p
+ string
+ :start p1 :end new-pos)))))))
+ ;; no possibly longer grammar keyword
+ (multiple-value-bind (token-association token-length)
+ (recognize-kwd string pos string-ln actionv find-id?)
+ (if (and token-association
+ (>= new-pos (+ pos token-length)))
+ (progn
+ ;; token recognized
+ (setq pos (+ pos token-length)
+ token (car token-association))
+ (return-from next-token
+ (values token (cdr token-association)))
+ )
+ t)))
+ (let ((instance (subseq string pos new-pos)))
+ (setq pos new-pos)
+ (if-debugging
+ (format t "~%LexToken: ~s : ~s ~s < ~s" instance (car lex-cat-pair) new-pos string-ln))
+ (return-from next-token
+ (values instance lex-cat))))))))
+
+ ;; read symbol, string, or number
+ ;; foo : symbol, 'foo' : symbol, "foo" : string, 3/4 : number
+ ;; recognize a number: <digit>* [ "." <digit>+ ]
+ ;; <digit>+ "/" <digit>+
+ (when (and number-index (find number-index actionv :key #'car))
+ (multiple-value-bind (number end)
+ (parse-integer string :start pos :junk-allowed t)
+ (if (not number)
+ ;; the case .<integer>
+ (when (and (eql (schar string pos) '#\.)
+ (DIGIT-CHAR-P (schar string (1+ pos))))
+ (multiple-value-bind (dec end)
+ (parse-integer string
+ :start (1+ pos) :junk-allowed t)
+ (when (digit-seq? dec end)
+ (let ((places (- end (1+ pos))))
+ (setq pos end)
+ (return-from next-token
+ (new-fraction 0 dec places))))))
+ (progn
+ (when (>= end string-ln)
+ (setq pos end)
+ (return-from next-token (values number number-index)))
+ (let ((c (schar string end)) (p (1+ end)))
+ (case c
+ (#\/ (multiple-value-bind (denom end)
+ (parse-integer string
+ :start p :junk-allowed t)
+ (when denom
+ (setq pos end)
+ (return-from next-token
+ (values (/ number denom) number-index))))
+ (setq pos end)
+ (return-from next-token
+ (values number number-index)))
+ (#\. (multiple-value-bind (dec end)
+ (parse-integer string
+ :start p :junk-allowed t)
+ (when dec
+ (let ((places (- end p)))
+ (setq pos end)
+ (return-from next-token
+ (new-fraction number dec places)))))
+ (setq pos p)
+ (return-from next-token
+ (values number number-index)))
+ (t (when (or (not id-allows-start-digit)
+ (not (identifier-continue-char-p c)))
+ (setq pos end)
+ (return-from next-token
+ (values number number-index))))))))))
+ ;; recognize a grammar keyword
+ (multiple-value-bind (token-association token-length)
+ (recognize-kwd string pos string-ln actionv find-id?)
+ (when token-association
+ ;; token recognized
+ (setq pos (+ pos token-length)
+ token (car token-association))
+ (return-from next-token
+ (values token (cdr token-association)))))
+ ;; recognize an identifier or string
+ (setf find-string? (and string-index
+ (find string-index actionv
+ :key #'car)))
+ (when (or find-id? find-string?)
+ (let ((char (schar string pos)) (c #\space))
+ (declare (character char c))
+ (flet
+ ((parse-delimited-id (delimiter symb?)
+ (block parse-delimited-id
+ ;; when successful set token and pos!!
+ (flet ((eof-error ()
+ (return-from read-parser
+ (funcall
+ error-fn
+ (format
+ nil "Closing ~:[String~;Symbol~] delimiter ~S expected"
+ symb? delimiter)))))
+ (when (char= char delimiter)
+ (do ((p (incf pos) (1+ p))
+ (escaped? nil (char= c #\\)))
+ (nil)
+ (declare (fixnum p))
+ (when (= p string-ln)
+ (if more-fn
+ (setq string
+ (concatenate
+ 'string
+ string (string #\Newline)
+ (funcall more-fn #'eof-error))
+ string-ln (length string))
+ (eof-error)))
+ (setq c (schar string p))
+ (when (and (char= c delimiter)
+ (not escaped?))
+ (setq token (subseq string pos p)
+ pos (1+ p))
+ (return-from parse-delimited-id t))))))))
+ (and find-id?
+ (parse-delimited-id symbol-delimiter t)
+ (return-from next-token
+ (values (intern token) identifier-index)))
+ (and find-string?
+ (parse-delimited-id string-delimiter nil)
+ (return-from next-token
+ (values token string-index))))
+
+ ;; Does char start an identifier?
+ (unless find-id? (funcall error-fn (unrecognized-token-error
+ string pos actionv grammar)))
+ (flet ((parse-id ()
+ ;; Any char not in *identifier-continue-chars* terminates
+ (do ((p (1+ pos) (1+ p)))
+ ((or (= p string-ln)
+ (not (identifier-continue-char-p (schar string p))))
+ (prog1 (if *preserve-case*
+ (subseq string pos p)
+ (upcased-subseq string pos p))
+ (setq pos p)))
+ (declare (fixnum p)))))
+ (let ((Id-String
+ (block Identifier
+ (when (identifier-start-char-p char)
+ (let ((id1 (parse-id)))
+ (when (or (= pos string-ln)
+ (char/= (schar string pos) #\:)
+ *disallow-packages*)
+ (return-from Identifier id1))
+ ;; more chars follow the ":" ?
+ (let ((package (find-package id1)))
+ (unless package
+ (return-from Identifier id1))
+ ;; <package-symbol>: ...
+ (let* ((p (1+ pos))
+ (next (schar string p)))
+ (when (char= next #\:)
+ (setq next (schar string (incf p))))
+ (unless (identifier-start-char-p next)
+ (return-from Identifier id1))
+ (setq pos p)
+ (return-from next-token
+ (values
+ (intern (the simple-string (parse-id)) package)
+ identifier-index)
+ )))))
+ ;; Symbol in keyword package ?
+ (when (and (char= char #\:)
+ (identifier-start-char-p
+ (schar string (incf pos))))
+ (return-from next-token
+ (values (intern (the simple-string
+ (parse-id))
+ *keyword-package*)
+ identifier-index))))))
+ (when Id-String
+ (return-from next-token
+ (values (if intern-identifier
+ (intern Id-String) Id-String)
+ identifier-index)))))))
+ (if (and junk-allowed
+ (find end-symbol-index actionv :key #'car))
+ (return-from next-token (values nil end-symbol-index))
+ ;; none of the symbols that we are looking for found
+ (funcall error-fn (unrecognized-token-error
+ string pos actionv grammar))))))
+ (lr-parse
+ (if-debugging-lexer ; for testing
+ #'(lambda (a)
+ (multiple-value-bind (token id)
+ (next-token a)
+ (format t "~%New Token: ~S . ~S Pos: ~S"
+ token id pos)
+ (values token id)))
+ #'next-token)
+ ;; This is the error function supplied to the parsing engine:
+ #'(lambda (msg)
+ (when print-parse-errors
+ (format t "~%Last token read: ~S~%Remaining: ~A~@[~A ...~]~%"
+ token
+ (subseq string pos)
+ (when more-allowed (funcall more-fn))))
+ (funcall error-fn msg))
+ grammar
+ junk-allowed
+ #'(lambda () last-pos))))))
+
+;----------------------------------------------------------------------------;
+; recognize-kwd
+;--------------
+;
+(defun recognize-kwd (string pos string-length actionv find-id?)
+ ;; Does any of the terminal symbols of the grammar start STRING at POS?
+ ;; In case it does, it must be the longest one
+ ;; the ordering of terminal-alist makes sure we find the longest keyword
+ ;; first
+ (declare (string string) (fixnum string-length))
+ (let ((max-token-length (- string-length (the integer pos))))
+ (declare (fixnum max-token-length))
+ (flet ((recognize-kwd-aux (ta)
+ (do ((ta-rest ta (cdr (the cons ta-rest))))
+ ((null ta-rest) nil)
+ ;; (break "recognize-kwd: ~s ~%~s" actionv ta-rest)
+ (let ((token-association (car (the cons ta-rest))))
+ (when (find (cdr token-association) actionv :key #'car)
+ ;; search only for a legitimite keyword
+ (let* ((terminal-token (car token-association))
+ (token-length (length (the string terminal-token))))
+ (declare (fixnum token-length) (string terminal-token))
+ (and (>= max-token-length token-length)
+ (let ((string-end (+ pos token-length)))
+ (declare (fixnum string-end))
+ ;; (break "recognize-kwd 2: ~s ~%~s" terminal-token string)
+ (and (if *case-sensitive*
+ (string= terminal-token string
+ :start2 pos :end2 string-end)
+ (string-equal terminal-token string
+ :start2 pos :end2 string-end))
+ ;;
+ ;; If we recognize a keyword, that could start
+ ;; an identifier, the following char must
+ ;; not also be a symbol-continue-char.
+ ;; If it is (e.g. "agent1") and there exists
+ ;; no shorter key that would accept this,
+ ;; then we will not recognize the key ("agent")
+ ;; but this leads us to recognize in "?u?x" the
+ ;; token "?u?" instead of "?"
+
+ ;; if we are at the end of the string,
+ ;; we accept
+ (or (not find-id?)
+ (not (< string-end string-length))
+ ;; if a identifier-continue-char doesn't
+ ;; follow, we also accept
+ (not (identifier-continue-char-p
+ (schar string string-end)))
+ ;; if the key does not start with
+ ;; an identifier-start-char we accept
+ (not (identifier-start-char-p
+ (schar terminal-token 0)))
+ ;; if any of the remaining chars of the key
+ ;; is not a identifier-continue-char,
+ ;; we also accept
+ (find-if-not #'identifier-continue-char-p
+ terminal-token
+ :start 1))))
+ (return (values token-association token-length)))))))))
+ (recognize-kwd-aux
+ (svref *terminal-alist-SEQ*
+ (char-code
+ (if *case-sensitive*
+ (the character (schar string pos))
+ (char-downcase (the character (schar string pos))))))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; file-parser
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; parse expressions in GRAMMAR reading from FILE
+;; returns: a list of the parse-results, i.e. what would have been
+;; returned by read-parser
+
+(defvar *comment-brackets* '(("#|" . "|#")) )
+(defvar *comment-start* #\; )
+
+(defun file-parser (file &key
+ (error-fn #'error)
+ (print-parse-errors t)
+ (grammar *current-grammar*)
+ (verbose *load-verbose*))
+ (with-open-file (s (merge-pathnames file) :direction :input)
+ (file-parser-aux s error-fn print-parse-errors grammar verbose)))
+
+(defun file-parser-aux (stream error-fn print-parse-errors grammar verbose
+ &aux R (eof (cons nil nil)))
+ (labels ((skip-lines (stream end)
+ ;; ignore lines until end is found
+ (let ((l (read-line stream nil eof)))
+ (if (stringp l)
+ (let ((p (search end l)))
+ (if p
+ (let ((l-rest (string-left-trim
+ '(#\Space #\Tab)
+ (subseq l (+ p (length end))))))
+ (if (string= l-rest "")
+ (next-line stream)
+ l-rest))
+ (skip-lines stream end)))
+ l)))
+ (next-line (stream) ; ignore comments
+ (let ((l (read-line stream nil eof)))
+ (when verbose (terpri) (princ l))
+ (if (stringp l)
+ (let ((l-length (length (setq l (string-left-trim
+ '(#\Space #\Tab) l)))))
+ (if (zerop l-length)
+ (next-line stream)
+ (if (char= *comment-start* (schar l 0))
+ (next-line stream)
+ ;; does this line start a comment
+ (dolist (comment *comment-brackets* l)
+ (let* ((start (car comment))
+ (start-length (length start)))
+ (when (and
+ (>= l-length start-length)
+ (string= l start :end1 start-length))
+ ;; a comment found
+ (return
+ (setq l (skip-lines
+ stream
+ (cdr comment))))))))))
+ l))))
+ (do ((line (next-line stream)))
+ ((eq line eof) (nreverse R))
+ (multiple-value-bind (expr rest)
+ (read-parser line
+ :error-fn error-fn
+ :print-parse-errors print-parse-errors
+ :grammar grammar
+ :junk-allowed t
+ :more-allowed t
+ :more-fn #'(lambda (&optional error-fn)
+ (setq line (next-line stream))
+ (if (eq line eof)
+ (if error-fn
+ (funcall error-fn)
+ (error "Reached end of file ~S while parsing"
+ stream))
+ line)))
+ ;; (when verbose (let ((*print-structure* t)) (print expr)))
+ (push expr R)
+ (when (eq line eof) (return (nreverse R)))
+ (setq line (if rest
+ (subseq line rest)
+ (next-line stream)))))))
+
+;----------------------------------------------------------------------------;
+; debug-parser
+;-------------
+;
+;
+(defun debug-parser (&key (grammar t) (lexer nil))
+ (setq *grammar-debug* grammar
+ *lexer-debug* lexer)
+ (let ((*default-pathname-defaults*
+ (if (or grammar lexer)
+ (merge-pathnames
+ *ZEBU-directory*
+ (make-pathname :type (first *load-source-pathname-types*)))
+ (merge-pathnames
+ (make-pathname
+ :type (first *load-binary-pathname-types*))
+ *ZEBU-binary-directory*))))
+ ;; "zebu-loader" needs only to be loaded if the compiler
+ ;; in-line codes slot accessors and does not keep the function
+ ;; definitions
+ #+ALLEGRO (load "zebu-loader")
+ (load "zebu-driver")))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-driver.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-dump.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-dump.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,194 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: dump.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Fri Mar 8 14:46:38 1996 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 16-Jul-91 (Joachim H. Laubsch)
+; to deal with multiple-grammars, begin a ".tab" file with *GRAMMAR-OPTIONS*
+; a keyworded arglist that can be passed to MAKE-GRAMMAR
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+;;;
+;;; Dump parsing tables and associated stuff into a file.
+;;;
+;;; The follwing stuff is dumped in parenthesized lists which a lisp reader
+;;; should be able to read:
+;;;
+;;; A keyword argument list for the MAKE-GRAMMAR function.
+;;; An ordered (by grammar symbol index) lexicon.
+;;; A list of the indices of terminal grammar symbols.
+;;; A list of production info, ordered by production index, of lists
+;;; containing the index of the lhs grammar symbol and the length
+;;; of the rhs of the production.
+;;; A sparse list of lists representation of the action function
+;;; (eyball one and you'll get the idea...).
+;;; A similar representation of the goto function.
+;;; The index of the start state.
+;;; The index of the end symbol.
+;;; A list of the client lambda forms.
+
+(in-package "ZEBU")
+(declaim (special *ACTION-ARRAY* *GOTO-ARRAY* *LR0-START-STATE-INDEX*))
+
+(defun dump-tables (grammar-file output-file)
+ (macrolet ((delete! (item sequence)
+ `(delete ,item ,sequence :test #'equal)))
+ (let ((*print-structure* t)
+ *print-pretty* *print-length* *print-level* *print-circle*
+ (filename (if output-file
+ (pathname output-file)
+ (merge-pathnames
+ (make-pathname :type "tab")
+ grammar-file))))
+ (format t "~%Dumping parse tables to ~A~%" filename)
+ (with-open-file (port filename :if-does-not-exist :create
+ :if-exists :supersede
+ :direction :output)
+ ;; 1: Dump options
+ (format port "~%~S" *grammar-options*)
+ ;; 2: Dump out an ordered lexicon.
+ (let ((ln (length *g-symbol-alist*)))
+ (format port "~%#~S(" ln)
+ (dolist (pair (reverse *g-symbol-alist*))
+ (format port "~S " (car pair)))
+ (format port ")~%~%"))
+ ;; 3: Dump a list of the indices of terminal grammar symbols
+ ;; deal with some special cases... .
+ (let ((gs-list (delete
+ '()
+ (delete!
+ *empty-string-g-symbol*
+ (delete!
+ *augmented-start-g-symbol*
+ (delete!
+ *the-end-g-symbol*
+ (mapcar #'(lambda (gs)
+ (unless (g-symbol-non-terminal? gs) gs))
+ (reverse *symbols*))))))))
+ (format port "~%#~S(" (length gs-list))
+ (dolist (gs gs-list)
+ (format port "~S " (g-symbol-index gs)))
+ (format port ")~%~%"))
+ ;; 4: productions
+ ;; For the lr parser, dump a list of info on the productions.
+ ;; The order of the list follows the productions indices in
+ ;; the parse tables. Each element is a list of the index of
+ ;; the lhs grammar symbol and the length of the rhs of the production.
+ (format port "#~S(" (length *productions*))
+ (dolist (prod (reverse *productions*))
+ (format port "(~S . ~S)"
+ (g-symbol-index (lhs prod))
+ (production-length prod)))
+ (format port ")~%")
+
+ ;; 5: Dump out a representation of the action function.
+ (let ((aa-len (length (the vector *action-array*))))
+ (format port "~%#~S(" aa-len)
+ (dotimes (i aa-len)
+ (format port "~%~S" (oset-item-list (svref *action-array* i))))
+ (format port ")~%"))
+
+ ;; 6: Dump out a representation of the goto function for non-terminals
+ (let ((ga-len (length (the vector *action-array*))))
+ (format port "~%#~S(" ga-len)
+ (dotimes (i (length *goto-array*))
+ (format port "~%(")
+ (dolist (item (oset-item-list (svref *goto-array* i)))
+ (format port "~S" item))
+ (format port ")"))
+ (format port ")"))
+
+ ;; 7: Dump the index of the start state.
+ (print *lr0-start-state-index* port)
+ (terpri port)
+
+ ;; 8: Dump the index of the end symbol.
+ (print (g-symbol-index *the-end-g-symbol*) port)
+ (terpri port)
+
+ ;; 9: Dump out a vector of the client lambdas
+ (let (*print-pretty*)
+ (format port "~%#~S(~{~S~%~})"
+ (length *zb-rules*)
+ (setq *zb-rules* (nreverse *zb-rules*))))
+ )
+ filename)))
+
+;; Set up some convenient ways to process grammars.
+
+(defun compile-slr-grammar (grammar-file &rest args)
+ (apply #'compile-zebu-grammar-aux
+ grammar-file
+ #'slr-tables-from-grammar
+ args))
+
+(defun compile-lalr1-grammar (grammar-file &rest args)
+ (apply #'compile-zebu-grammar-aux
+ grammar-file
+ #'lalr1-tables-from-grammar
+ args))
+
+(declaim (special *compiler-grammar*))
+(defun compile-zebu-grammar-aux
+ (grammar-file compiler
+ &key
+ (output-file (merge-pathnames
+ (make-pathname :type "tab")
+ grammar-file))
+ (grammar *null-grammar*)
+ verbose
+ (compile-domain t))
+ (let ((*compiler-grammar* grammar)
+ (*package* *package*))
+ (setq grammar-file (funcall compiler grammar-file :verbose verbose))
+ (when (get-grammar-options-key ':PACKAGE)
+ (setq *package* (find-package (get-grammar-options-key ':PACKAGE))))
+ (let ((domain-file (dump-domain-file grammar-file verbose)))
+ (when (and compile-domain domain-file)
+ (compile-file
+ domain-file
+ :output-file (merge-pathnames
+ (make-pathname
+ :host (pathname-host domain-file) ;; Added by Henry
+ :name (pathname-name domain-file)
+ :directory (pathname-directory output-file)
+ :type (car *load-binary-pathname-types*)))
+ )))
+ (dump-tables grammar-file output-file)))
+
+;;;;;;;;;;;;;
+;;; test:
+#||
+(set-working-directory *ZEBU-test-directory*)
+(compile-slr-grammar "ex1.zb")
+(compile-slr-grammar "ex2.zb")
+
+;; fails : not slr
+(compile-slr-grammar "ex3.zb")
+;;(compile-slr-grammar "ex4.zb")
+
+;; fails : not slr
+(compile-slr-grammar "ex6-2.zb")
+(compile-lalr1-grammar "ex1.zb")
+(compile-lalr1-grammar "ex2.zb")
+(compile-lalr1-grammar "ex3.zb")
+(compile-lalr1-grammar "ex4.zb")
+(compile-lalr1-grammar "ex6-2.zb")
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of dump.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-empty-st.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-empty-st.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,52 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: empty-st.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Tue Jan 26 09:20:23 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Cruise the productions and figure out which ones derive the empty string.
+
+(defun calculate-empty-string-derivers ()
+ (labels ((string-vanishes (gslist)
+ (cond ((null gslist) t)
+ ((not (g-symbol-derives-empty-string (car gslist))) nil)
+ (T (string-vanishes (cdr gslist)))))
+ (process-symbol-which-derives-empty-string (gs)
+ (unless (g-symbol-derives-empty-string gs)
+ (let (*print-circle*)
+ (format t "~S derives the empty string~%" gs))
+ (setf (g-symbol-derives-empty-string gs) t)
+ (dolist (prod (g-symbol-rhs-productions gs))
+ (if (string-vanishes (rhs prod))
+ (process-symbol-which-derives-empty-string (lhs prod)))))))
+ (dolist (prod *productions*)
+ (unless (rhs prod)
+ (process-symbol-which-derives-empty-string (lhs prod))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+#||
+(load-grammar (merge-pathnames "ex3.zb" *ZEBU-test-directory*))
+(calculate-empty-string-derivers)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of empty-st.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-first.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-first.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,144 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-first.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Thu Apr 29 10:42:53 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 27-Mar-92 (Joachim H. Laubsch)
+; modified empty string handling to not propagate to dependers
+; see Fischer LeBlanc, pp 104-106, Grammar G0
+; 25-Mar-92 (Joachim H. Laubsch)
+; included warning for non-terminals that do not derive a terminal string
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Calculate the first sets of the grammar symbols.
+;;; Basic design from John Bear :
+;;; University of Texas at Austin Tech Report GRG 220
+;;; "A Breadth-First Syntactic Component"
+;;; I added empty string handling: Sandy Wells.
+
+(defun calculate-first-sets ()
+ (labels ((calculate-first-sets-aux (prod-lhs prod-rhs)
+ (declare (cons prod-rhs))
+ (let ((rhs-first (car prod-rhs)))
+ (if (g-symbol-non-terminal? rhs-first)
+ ;; must be non terminal
+ ;; X -> Y1 Y2 ... Yn
+ ;; place a in first-sets(X) if for some i a is in first-sets(Yi)
+ ;; and for all j<i empty is in first-sets(Yj)
+ (progn (first-set-add-depender! prod-lhs rhs-first)
+ (if (g-symbol-derives-empty-string rhs-first)
+ (let ((rhs-rest (cdr prod-rhs)))
+ (when rhs-rest
+ (calculate-first-sets-aux prod-lhs rhs-rest)))))
+ ;; check for terminal symbol
+ (first-set-insert! rhs-first prod-lhs)))))
+ ;; The start set of a terminal symbol is the symbol itself.
+ (dolist (gs *symbols*)
+ (if (g-symbol-non-terminal? gs)
+ (when (g-symbol-derives-empty-string gs)
+ ;; insert without any propagation to dependers
+ (oset-insert! *empty-string-g-symbol* (g-symbol-first-set gs)))
+ (oset-insert! gs (g-symbol-first-set gs))))
+ (dolist (prod *productions*)
+ (let ((rhs (rhs prod)))
+ (if rhs
+ (calculate-first-sets-aux (lhs prod) rhs))))
+ (dolist (gs *symbols*)
+ (when (g-symbol-non-terminal? gs)
+ (let ((x (g-symbol-first-set gs)))
+ (unless (oset-item-list x)
+ (warn "The non-terminal ~A derives no terminal string."
+ (g-symbol-name gs))))))))
+
+
+;;; Add a symbol to the first set of another symbol.
+;;; If it isn't the empty string, and wasn't there already,
+;;; add it to the first sets of the guys who's first sets contain this guys.
+;;; (the dependers)
+
+(defun first-set-insert! (to-insert insertee)
+ (labels ((first-set-insert-aux! (insertee)
+ (when (oset-insert! to-insert (g-symbol-first-set insertee))
+ (dolist (depender (oset-item-list
+ (g-symbol-first-set-dependers insertee)))
+ (first-set-insert-aux! depender)))))
+ (first-set-insert-aux! insertee)))
+
+(defun first-set-add-depender! (new-depender gs)
+ (if (oset-insert! new-depender (g-symbol-first-set-dependers gs))
+ (dolist (sym (oset-item-list (g-symbol-first-set gs)))
+ (unless (eq *empty-string-g-symbol* sym)
+ (first-set-insert! sym new-depender)))))
+
+(defun cruise-first-sets ()
+ (dolist (sym *symbols*)
+ (format t "~%~A : ~A~%--------------------"
+ (g-symbol-name sym)
+ (with-output-to-string (names)
+ (oset-for-each
+ #'(lambda (ee)
+ (format names "~A " (g-symbol-name ee)))
+ (g-symbol-first-set sym))))))
+
+;;; first-seq (sequence of symbols) returns {s | seq =*=> s...}
+
+(defun first-seq (seq)
+ (declare (type list seq))
+ (if (null seq)
+ (make-oset :order-fn #'g-symbol-order-function)
+ (let* ((seq1 (car (the cons seq)))
+ (firsts (g-symbol-first-set seq1)))
+ (declare (type g-symbol seq1))
+ (if (g-symbol-derives-empty-string seq1)
+ (oset-union
+ (oset-delete *empty-string-g-symbol* firsts)
+ (first-seq (cdr seq)))
+ firsts))))
+
+;; a specialization to a sequence SEQ, followed by an element SEQ1
+(defun first-seq-1 (seq seq1)
+ (declare (type list seq) (type g-symbol seq1))
+ (labels ((first-seq-aux (seq)
+ (if (null seq)
+ (let ((firsts (g-symbol-first-set seq1)))
+ (if (g-symbol-derives-empty-string seq1)
+ (oset-delete *empty-string-g-symbol* firsts)
+ firsts))
+ (let* ((seq1 (car (the cons seq)))
+ (firsts (g-symbol-first-set seq1)))
+ (declare (type g-symbol seq1))
+ (if (g-symbol-derives-empty-string seq1)
+ (oset-union
+ (oset-delete *empty-string-g-symbol* firsts)
+ (first-seq-aux (cdr seq)))
+ firsts)))))
+ (first-seq-aux seq)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test
+#||
+(set-working-directory *ZEBU-test-directory*)
+(load-grammar "ex2.zb")
+(calculate-empty-string-derivers)
+(calculate-first-sets)
+(cruise-first-sets)
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-first.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-follow.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-follow.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,92 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-follow.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Tue Jan 26 09:21:04 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 20-Mar-91 (Joachim H. Laubsch)
+; Improved grammar debugging
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Compute follow on a grammar symbol.
+
+(defun calculate-follow-sets ()
+ (compute-follow-dependers)
+ (follow-insert-first-sets))
+
+
+;;; Called initially on a production with prod being the production and
+;;; prod-rhs being the rhs of the production.
+;;; Returns true only if the prod-rhs derives the empty string, or is the
+;;; empty string. Fills in follow set dependencies by side effect.
+
+(defun compute-follow-dependers (&aux prod)
+ (labels ((compute-follow-dependers-aux (prod-rhs)
+ (if prod-rhs
+ (let ((rhs-first (car prod-rhs)))
+ (when (compute-follow-dependers-aux (cdr prod-rhs))
+ (oset-insert! rhs-first
+ (g-symbol-follow-dependers (lhs prod)))
+ ;; Return indication of whether tail derives empty string.
+ (g-symbol-derives-empty-string rhs-first)))
+ t)))
+ (do ((prods *productions* (cdr prods)))
+ ((null prods))
+ (setq prod (car (the cons prods)))
+ (compute-follow-dependers-aux (rhs prod)))))
+
+(defun follow-insert-first-sets ()
+ (labels ((follow-insert-symbol (symbol-to-insert whose-follow-set)
+ ;; Both arguments are g-symbols.
+ (if (oset-insert! symbol-to-insert
+ (g-symbol-follow-set whose-follow-set))
+ ;; Do it to his dependers too..
+ (dolist (depender (oset-item-list (g-symbol-follow-dependers
+ whose-follow-set)))
+ (follow-insert-symbol symbol-to-insert depender))))
+ (follow-insert-first-sets-aux (prod-rest)
+ ;; Called on successive tails of the rhs of each production.
+ (when prod-rest
+ (let ((prod-rest2 (cdr prod-rest)))
+ (when prod-rest2
+ ;; prod-rest has at least two items
+ (dolist (symbol (oset-item-list (first-seq prod-rest2)))
+ (unless (eq symbol *empty-string-g-symbol*)
+ (follow-insert-symbol symbol (car prod-rest))))
+ (follow-insert-first-sets-aux prod-rest2))))))
+ (follow-insert-symbol *the-end-g-symbol* *start-symbol*)
+ (dolist (prod *productions*)
+ (follow-insert-first-sets-aux (rhs prod)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+
+#||
+(set-working-directory *ZEBU-test-directory*)
+(load-grammar "ex2.zb")
+(compile-slr-grammar "ex2.zb")
+(ZEBU-LOAD-FILE "ex2.tab")
+(calculate-empty-string-derivers)
+(calculate-first-sets)
+(calculate-follow-sets)
+(cruise-follow-sets)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-follow.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-g-symbol.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-g-symbol.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,107 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-g-symbol.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 10-Oct-90
+; Modified: Thu Apr 29 10:49:59 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+(in-package "ZEBU")
+;;; Grammar symbols are represented by g-symbol structs.
+;;;
+;;;
+;;; print-name is a string.
+;;;
+;;; index is a unique integer associated with the symbol.
+;;;
+;;; own-productions is a list of the productions that the symbol
+;;; appears on the left side of.
+;;; rhs-productions is a list of the productions the symbol appears
+;;; on the right side of.
+;;;
+;;; first-set is the set of terminal grammar symbols which can
+;;; legally start a string derived from the symbol.
+;;;
+;;; first-set-dependers is used in the computation of the first-set.
+;;;
+;;; derives-empty-string is a quick way of telling if the empty
+;;; string is in the first-set of the symbol.
+;;;
+;;; follow-set is the set of terminal symbols which may appear after
+;;; the symbol in strings of the language.
+;;;
+;;; follow-dependers is the set of grammar symbols whose follow sets
+;;; must contain this guys follow set.
+;;; sets will be represented by o-sets.
+;;;
+;;; A hack -- a g-symbol is non-terminal if its own-productions is NOT '().
+
+(defstruct (g-symbol (:print-function
+ (lambda (g-symbol stream depth)
+ (declare (ignore depth))
+ (let ((name (g-symbol-name g-symbol)))
+ (if (g-symbol-non-terminal? g-symbol)
+ (format stream "[<~A>]" name)
+ (format stream "<~A>" name))))))
+ name
+ index
+ (own-productions '())
+ (rhs-productions '())
+ (first-set (make-oset :order-fn #'g-symbol-order-function))
+ (first-set-dependers (make-oset :order-fn #'g-symbol-order-function))
+ (derives-empty-string '())
+ (follow-set (make-oset :order-fn #'g-symbol-order-function))
+ (follow-dependers (make-oset :order-fn #'g-symbol-order-function)))
+
+
+(declaim (inline g-symbol-non-terminal?))
+(defun g-symbol-non-terminal? (sym)
+ (not (null (g-symbol-own-productions sym))))
+
+(defmacro new-g-symbol (name index)
+ `(make-g-symbol :name ,name
+ :index ,index))
+
+(declaim (inline g-symbol-order-function))
+(defun g-symbol-order-function (sa sb)
+ (declare (type g-symbol sa sb))
+ (let ((sai (g-symbol-index sa)) (sbi (g-symbol-index sb)))
+ (declare (fixnum sai sbi))
+ (if (<= sai sbi)
+ (if (< sai sbi)
+ 'correct-order
+ 'equal)
+ 'wrong-order)))
+
+(declaim (inline g-symbol-add-production))
+(defun g-symbol-add-production (g-symbol production)
+ (setf (g-symbol-own-productions g-symbol)
+ (cons production (g-symbol-own-productions g-symbol))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test
+#||
+(load "g-symbol")
+(defvar g1 (new-g-symbol "foo" 3))
+(defvar g2 (new-g-symbol "goo" 5))
+(g-symbol-order-function g1 g2)
+(g-symbol-non-terminal? g1)
+(print g1)
+
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-g-symbol.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-generator.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-generator.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,1053 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-generator.lisp
+; Description: Generate Domain and Print-Functions for the grammar
+; Author: Joachim H. Laubsch
+; Created: 25-Feb-92
+; Modified: Wed Jan 13 10:16:30 1999 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(IN-PACKAGE "ZEBU")
+
+(declaim (special
+ *identifier-continue-chars*
+ *identifier-start-chars*
+ *domain-structs*
+ *domain-types*
+ *grammar-options*
+ *lex-cats*
+ ))
+
+;----------------------------------------------------------------------------;
+; generate-domain-file
+;---------------------
+; Generate the DEFSTRUCT calls to define the domain & dump to FILE
+; When using the meta-grammar, printers will be compiled too.
+
+; file is open when generate-domain-file is called.
+; return true if anything was written.
+
+; If DEFSTRUCT is used in the grammar file -- *domain-structs* is not
+; () -- the domain does not need to be generated.
+
+(defun generate-domain-file (file port &aux domain printers)
+ (unless *domain-structs*
+ (when (setq domain
+ (prepare-domain
+ (or (get-grammar-options-key ':DOMAIN)
+ ;; set the domain keyword, s.t. at load time
+ ;; the domain definition is present
+ (let ((d (process-domain-definition)))
+ (when d
+ (nconc *grammar-options*
+ (list ':DOMAIN d)))
+ d)))) ; sets *domain-type-hierarchy*
+ (when (string= (grammar-name *compiler-grammar*)
+ "zebu-mg")
+ (format t "~%Generating Print-functions ..")
+ (setq printers (gen-printers)))))
+ (format t "~%Writing domain to ~a~%" file)
+ ;; Dump out hierarchy
+ (let* ((structs (or (reverse *domain-structs*)
+ (generate-domain domain printers)))
+ (CL-pkg #-LUCID (find-package "COMMON-LISP")
+ #+LUCID (find-package "LUCID-COMMON-LISP"))
+ (Lisp-pkgs
+ (cons CL-pkg (package-use-list CL-pkg))))
+ (dolist (f structs)
+ (let ((struct-name (defstruct-name f)))
+ (when (member (symbol-package struct-name)
+ Lisp-pkgs)
+ (warn "~s was chosen as the name of domain type, ~%but the symbol is already defined in the ~s"
+ struct-name (symbol-package struct-name)))
+ (pprint f port)
+ (terpri port)
+ ;; build the kb-hierarchy even if defstructs are used
+ (when *domain-structs*
+ (format port "(ZB::DEF-KB-DOMAIN-TYPE '~s '~s '~s)~%"
+ struct-name
+ (defstruct-super f)
+ (defstruct-slots f)))
+ ))
+ structs))
+
+(defun defstruct-name (x)
+ (let ((n (cadr x)))
+ (if (listp n) (car n) n)))
+
+(defun defstruct-super (x)
+ (let ((n (cadr x)))
+ (when (listp n)
+ (let ((include (assoc ':include (cdr n))))
+ (when include (second include))))))
+
+(defun defstruct-slots (x)
+ (mapcar #'(lambda (sd) (if (listp sd) (car sd) sd))
+ (cddr x)))
+
+;----------------------------------------------------------------------------;
+; generate-domain
+;----------------
+; Given domain D and an alist PRINTERS with pairs (<type> . <print-function>)
+; return a list of DEFSTRUCT calls
+
+(defun generate-domain (d printers &aux code)
+ (flet ((parse-slots (l)
+ (mapcar #'(lambda (s)
+ (if (atom s)
+ s
+ `(,(car s) nil :type (or null ,(cadr s)))))
+ l)))
+ (flet ((slots (x)
+ (do ((xrest x (cddr xrest)))
+ ((null xrest) nil)
+ (if (eq (car xrest) ':slots)
+ (return (parse-slots (cadr xrest))))))
+ (make-struct (name include slots constructor?)
+ `(defstruct (,name
+ (:include ,include)
+ ,@(let ((fn (assoc name printers)))
+ (when fn
+ `((:print-function ,(cdr fn)))))
+ ,@(unless constructor?
+ (list '(:constructor nil)))
+ )
+ , at slots)))
+ (labels ((generate-domain-aux (sub super args constructor?)
+ (unless (eq sub super)
+ (push (make-struct sub super (slots args) constructor?)
+ code))
+ (do ((xrest args (cddr xrest))) ((null xrest))
+ (when (eq (car xrest) ':subtype)
+ (let ((newsub (cadr xrest)))
+ (if (atom newsub)
+ (push (make-struct newsub sub nil t) code)
+ (generate-domain-aux
+ (car newsub) sub (cdr newsub) t)))))))
+ (when d
+ (generate-domain-aux (car d) 'kb-domain (rest d) nil)
+ (nreverse code))))))
+
+
+;----------------------------------------------------------------------------;
+; process-domain-definition
+;--------------------------
+; Transform the list of DOMAIN-TYPEs into the hierarchical structure
+; with root KB-DOMAIN, and :SUBTYPE, :SLOTS arcs
+(defun process-domain-definition (&aux (R (list 'KB-domain)))
+ (labels ((find-super (node supertype)
+ ;; node is the list form of the domain def
+ (if (null node)
+ 'Nil
+ (if (eq (car node) supertype)
+ node
+ (do ((n (cdr node) (cddr n)))
+ ((null n) nil)
+ (when (eq (car n) ':subtype)
+ (let ((r (find-super (cadr n) supertype)))
+ (when r (return r)))))))))
+ (when (null *domain-types*)
+ (return-from process-domain-definition nil))
+ ;; if there is a supertype in *domain-types* that is
+ ;; undefined, define it as a subtype of KB-domain
+ (dolist (node *domain-types*)
+ (let ((supertype (domain-type--supertype node)))
+ (unless (or (eq supertype 'KB-domain)
+ (find supertype *domain-types*
+ :key #'domain-type--type))
+ (push (make-domain-type
+ :-supertype 'KB-domain
+ :-type supertype)
+ *domain-types*))))
+ ;; transform the sorted list to the external :DOMAIN notation
+ (let ((domain-types (copy-list *domain-types*)))
+ (loop (or domain-types (return R))
+ (do ((nodes domain-types (cdr nodes)))
+ ((null nodes))
+ (let* ((node (first nodes))
+ (supertype (domain-type--supertype node))
+ (type (domain-type--type node))
+ (slots (domain-type--slots node))
+ (super (find-super R supertype)))
+ (when super
+ (nconc super `(:subtype
+ (,type
+ ,@(if slots `(:slots ,slots)))))
+ (setq domain-types (delete node domain-types)))))))
+ ;; (pprint R)
+ R))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Generate the print-functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;----------------------------------------------------------------------------;
+; Non-terminal-p
+;---------------
+;
+(defun Non-terminal-p (constituent)
+ (and (symbolp constituent) (not (assoc constituent *lex-cats*))))
+
+;----------------------------------------------------------------------------;
+; 1-constituent-production-p
+;---------------------------
+;
+;
+(defun 1-constituent-production-p (syntax)
+ (= 1 (count-if #'Non-terminal-p syntax))
+ )
+
+(defun first-nt-constituent (syntax)
+ (find-if #'Non-terminal-p syntax)
+ )
+
+;; collect for each type the lhs and production-rhs in the alist
+;; type-prod-AL ( (<type> . %1=( %2=(<lhs> . <production-rhs>) .. )) ..)
+;; type-print-fn-AL ( (<type> . (lambda ..)) ..)
+;; Return type-print-fn-AL
+
+(defun gen-printers (&aux type-prod-AL type-print-fn-AL user-def-types
+ KB-sequence-print-fn-AL KB-sequence-prods
+ (print-fn-argl (mapcar #'intern
+ '("ITEM" "STREAM" "LEVEL"))))
+ (flet ((memo (type val)
+ (let ((bdg (assoc type type-prod-AL)))
+ (if (null bdg)
+ (push (cons type (list val)) type-prod-AL)
+ (push val (cdr bdg))))))
+ (maphash #'(lambda (key val) (declare (ignore val))
+ (unless (or (member key '(:TOP KB-DOMAIN KB-SEQUENCE))
+ (member (symbol-name key)
+ *open-categories*
+ :test #'string=)
+ (assoc key *lex-cats*))
+ (push key user-def-types)))
+ *domain-ht*)
+ ;; for each type, gather a set of productions that produce it
+ ;; also check that the type and its slots are defined
+ (dolist (zb-rule *zb-rules*)
+ (let ((lhs (car zb-rule)))
+ (dolist (prod (zb-rule--productions (cdr zb-rule)))
+ (let ((semantics (production-rhs--semantics prod)))
+ (if (null semantics)
+ (let ((syntax (production-rhs--syntax prod)))
+ (when (1-constituent-production-p syntax)
+ (let ((nt (first-nt-constituent syntax)))
+ (when (eq (car (infer-type-disj-of-expr nt))
+ 'kb-sequence)
+ (memo 'kb-sequence (cons lhs nt))))))
+ (when (and semantics (feat-term-p semantics))
+ (let* ((type (feat-term--type semantics))
+ (type-node (gethash type *domain-HT*))
+ (slots (feat-term--slots semantics)))
+ ;; warn about inconsistent use of the types
+ (if (null type-node)
+ (warn "Type: ~S is not defined in this domain" type)
+ (dolist (slot slots)
+ (let ((slot-label (label-value-pair--label slot))
+ (slot-value (label-value-pair--value slot)))
+ (if (KB-legal-slot-p type slot-label)
+ (let ((slot-type (KB-slot-type
+ type slot-label)))
+ (unless (eq slot-type ':TOP)
+ (unless (every
+ #'(lambda (sub)
+ (is-subtype-of sub slot-type))
+ (infer-type-disj-of-expr slot-value))
+ (warn "~S type restriction of ~S violated by ~S"
+ slot-type slot-label slot-value)
+ ;;(break "~%> ~S" prod)
+ )))
+ (warn "Slot: ~S is not defined for ~S"
+ slot-label type)))))
+ (memo type (cons lhs prod))
+ (for-each-supertype
+ #'(lambda (node)
+ (setq user-def-types
+ (delete (type-tree-node--label node)
+ user-def-types)))
+ type)))))))))
+ (when user-def-types
+ (warn "Types:~{ ~S~}~% were defined but not used." user-def-types))
+
+ ;; generate print-function for nonterminals which produce a kb-sequence
+ (when (setf KB-sequence-prods (assoc 'KB-sequence type-prod-AL))
+ (setf type-prod-AL (delete KB-sequence-prods type-prod-AL)
+ KB-sequence-print-fn-AL
+ (gen-KB-sequence-printers (cdr KB-sequence-prods))))
+ ;; (break "KB-sequence-print-fn-AL ~%~S:" KB-sequence-print-fn-AL)
+ ;; now generate the print-function for each type
+ ;; unless one has been predefined (via the << foo >> Syntax)
+ (dolist (e type-prod-AL type-print-fn-AL)
+ (let* ((type (car e))
+ (domain-type (find type *domain-types*
+ :key #'domain-type--type))
+ (fun (when domain-type
+ (domain-type-print-function domain-type))))
+ ;; (break "domain-type: ~s" domain-type)
+ (when (and domain-type (not fun))
+ (let ((%1 (cdr e)) ; ((<lhs> . <prod-rhs>)..)
+ clauses good-bdgs unused-bdgs)
+ (dolist (%2 %1) ; (<lhs> . <prod-rhs>)
+ (push (gen-print-case %2) clauses))
+ ;; <clause> = (short-lambda-list syntax binding-list)
+ (multiple-value-bind (cond-clauses bindings)
+ (gen-clauses clauses KB-sequence-print-fn-AL)
+ ;; split bindings in good ones and unused ones
+ (dolist (b bindings)
+ (if (null (cdr b))
+ (pushnew b unused-bdgs)
+ (pushnew b good-bdgs)))
+ (setf fun `(lambda (, at print-fn-argl
+ ,@(when good-bdgs `(&aux .,good-bdgs)))
+ (declare (ignore
+ , at unused-bdgs
+ .,(if (not good-bdgs)
+ print-fn-argl
+ (cddr print-fn-argl))))
+ ,(if (cdr cond-clauses)
+ (progn
+ ;; last cond-clause has antecedent T
+ (setf (caar (last cond-clauses)) t)
+ `(cond ,@(simplify-cond-clauses cond-clauses)))
+ ;; the condition must be true
+ (cadar cond-clauses)))))))
+ (push (cons type fun) type-print-fn-AL))))
+
+;;------------------------------------------------------------------------;;
+;; gen-KB-sequence-printers
+;;-------------------------
+;; generate in-line format forms for KB-sequence first:
+;; KB-sequence-print-fn-AL: ((Constituent . <form(lhs)>)..);
+
+(defun gen-KB-sequence-printers (prods &aux Alist separator)
+ (dolist (prod prods Alist)
+ ;; prod = (<lhs> . <prod-rhs>) | (<lhs> . <symbol>)
+ (let ((lhs (car prod)) (rhs (cdr prod)))
+ ;; (format t "~%~%Prod: ~s ::= ~s" lhs (if (symbolp rhs) rhs (production-rhs--syntax rhs)))
+ (setq separator (decode-separator (if (symbolp rhs) rhs lhs))
+ Alist (add-print-fn
+ lhs
+ (if separator
+ `(let ((*kb-sequence-separator* ,separator))
+ (declare (special *kb-sequence-separator*))
+ (KB-SEQUENCE-print ,lhs nil nil))
+ `(KB-SEQUENCE-print ,lhs nil nil))
+ Alist))
+ ;; (format t "~%Separator: ~s" separator)
+ )))
+
+(defun decode-separator (name)
+ ;; return NIL for the default separator
+ (let* ((s (symbol-name name))
+ (s-length (length s))
+ (last-char-pos (1- s-length)))
+ (when (char= (schar s last-char-pos) #\$)
+ (let ((sep-ln-char (schar s (1- last-char-pos))))
+ (when (digit-char-p sep-ln-char)
+ (let ((sep-length (- (char-int sep-ln-char) (char-int #\0))))
+ (subseq s
+ (- s-length sep-length 2)
+ (- last-char-pos 1))))))))
+
+;----------------------------------------------------------------------------;
+; add-print-fn
+;-------------
+; add the print-function FN for the non-terminal CONSTITUENT to ALIST
+;
+(defun add-print-fn (CONSTITUENT FN ALIST)
+ (let ((bdg (assoc CONSTITUENT ALIST)))
+ (if (null bdg)
+ (acons CONSTITUENT FN ALIST)
+ (progn (setf (cdr bdg)
+ `(if (null ,CONSTITUENT)
+ ""
+ ,(if (equal FN "")
+ (cdr bdg)
+ FN)))
+ ALIST))))
+
+;----------------------------------------------------------------------------;
+; clause
+;-------
+; <lambda-list syntax binding-list semantics>
+;
+(defstruct (clause)
+ ll syntax bl semantics
+ )
+
+;----------------------------------------------------------------------------;
+; gen-print-case
+;---------------
+; given: (<lhs> . <prod-rhs>)
+; return: lambda-list of constituents in lhs
+; syntax of rhs
+; for each var in the lambda-list a path of accessors
+
+(defun gen-print-case (lhs-rhs-pair)
+ (let* ((prod (cdr lhs-rhs-pair))
+ (syntax (production-rhs--syntax prod))
+ (semantics (production-rhs--semantics prod))
+ (ll (mapcan #'(lambda (constituent)
+ (unless (stringp constituent) (list constituent)))
+ syntax))
+ (binding-list
+ (mapcar
+ #'(lambda (var)
+ (let ((p (find-path var semantics)))
+ (if (null p)
+ (progn
+ (warn "~:[Lexical Category~; Non-Terminal~] ~S not used in semantics ~% of ~S."
+ (Non-terminal-p var) var (car lhs-rhs-pair))
+ (list var)
+ )
+ (cons var p))))
+ ll)))
+ (make-clause
+ :ll ll :syntax syntax :bl binding-list :semantics semantics)))
+
+;----------------------------------------------------------------------------;
+; gen-clauses
+;------------
+; Given clauses of the form:
+; <clause> = <short-lambda-list syntax binding-list semantics>
+; where binding-list = ((<non-terminal-symbol> . <path to access from ITEM>) ..)
+; return: (1) ((<test for print-case> <format stmt derived from syntax>) ..)
+; (2) a lambda-list binding the %u .. variables used to accessors
+; derived from the paths.
+(defconstant *vars-to-use* '("%R" "%S" "%T" "%U" "%V" "%W" "%X" "%Y" "%Z"))
+
+(defun gen-clauses (clauses KB-sequence-print-fn-AL
+ &aux (vars-to-use (mapcar #'intern *vars-to-use*))
+ ;; a set of sets with the same print syntax
+ (partitioning (partition-set #'same-print-syntax clauses))
+ alist cond-clauses)
+ (labels ((memo-path (path)
+ (let ((bdg (assoc path alist :test #'equal)))
+ (if bdg
+ (cdr bdg)
+ (let ((R (pop vars-to-use)))
+ (push (cons path R) alist)
+ R))))
+ (make-format (syntax bdgs)
+ (when syntax
+ (let ((R `(format ,(intern "STREAM")
+ ,(apply #'concatenate 'string
+ (make-format-string-list syntax))
+ ,@(mapcan
+ #'(lambda (const)
+ (unless (stringp const)
+ (let ((seq-fn-bdg
+ (assoc
+ const
+ KB-sequence-print-fn-AL))
+ (var (let ((bdg (cdr (assoc const bdgs))))
+ (when bdg (memo-path bdg)))))
+ (list
+ (if seq-fn-bdg
+ `(let ((,const ,var))
+ ,(cdr seq-fn-bdg))
+ (or var
+ (warn "Can't unparse ~s~%~s is unbound in semantics"
+ syntax const)))))))
+ syntax))))
+ ;; (format t "~%format: ~s ~a -->~% " syntax bdgs) (pprint R) (break "gen-clauses")
+ R))))
+ (dolist (eq-print-set partitioning)
+ (let (ante (proto (first eq-print-set)))
+ (dolist (eq-print eq-print-set)
+ (let ((ll (clause-ll eq-print))
+ (bdgs (clause-bl eq-print)))
+ (pushnew
+ (if (null ll)
+ (progn
+ ;; (break "sem: ~s" (clause-semantics eq-print))
+ `(equal ,(intern "ITEM") ,(cons-avm
+ (clause-semantics eq-print))))
+ (let* (type-list ; type-preds that have to hold
+ (ll-map ; ((<lvar> . <%var>) ..)
+ (mapcar #'(lambda (var)
+ (push (infer-type-predicate var)
+ type-list)
+ (cons var
+ (memo-path
+ (cdr (assoc var bdgs)))))
+ ll))
+ (conjuncts
+ (mapcan #'(lambda (lvar type)
+ (if (consp type)
+ `((typep ,(cdr lvar) ',type))
+ (if (eq type 'T)
+ ;; delete the variables for which
+ ;; we could not infer a type
+ ()
+ `((,type ,(cdr lvar))))))
+ ll-map (nreverse type-list))))
+ (if (cdr conjuncts)
+ `(AND . ,conjuncts)
+ (car conjuncts))))
+ ante :test #'equal)))
+ (setq ante (if (cdr ante) (cons 'OR ante) (car ante)))
+ (setq cond-clauses
+ (insert-clause `(,ante
+ ,(make-format (clause-syntax proto)
+ (clause-bl proto)))
+ cond-clauses))))
+ (values cond-clauses
+ (mapcar #'(lambda (pair) ; (<path> . <%var>)
+ (list (cdr pair)
+ (path-to-form (car pair) (intern "ITEM"))))
+ alist))))
+
+(defun path-to-form (path target)
+ (reduce #'(lambda (a b) (list b a))
+ path
+ :initial-value target))
+;----------------------------------------------------------------------------;
+; insert-clause
+;--------------
+; insert stronger clause at front
+;
+(defun insert-clause (clause clauses)
+ (flet ((conjunction? (x) (and (consp x) (eq (car x) 'AND)))
+ (conjuncts (x) (rest x))
+ (typed-var? (x) (and (consp x) (eq (car x) 'TYPEP)))
+ (typed-var-nm (x) (cadr x))
+ (typed-var-type (x) (cadr (caddr x)))
+ (ante (x) (car x)))
+ (flet ((weaker-typed? (ante1 ante2)
+ (and (typed-var? ante1)
+ (typed-var? ante2)
+ (eq (typed-var-nm ante1) (typed-var-nm ante2))
+ (kb-subtypep (typed-var-type ante2)
+ (typed-var-type ante1)))))
+ (if (null clauses)
+ (list clause)
+ (let ((ante1 (ante clause)))
+ ;; (format t "~%a1: ~S~%a2s: ~{~A~%~}" (ante clause) (mapcar #'ante clauses))
+ (if (member ante1 clauses :test #'equal :key #'ante)
+ ;; the antecedent is already in the clauses
+ ;; this indicate a many-to-one surface-to-abstract syntax
+ clauses
+ (let* ((clause2 (first clauses)) (ante2 (ante clause2)))
+ (if (conjunction? ante2)
+ (if (conjunction? ante1)
+ (if (subsetp ante1 ante2 :test #'weaker-typed?)
+ (cons clause2 (insert-clause clause (rest clauses)))
+ (cons clause clauses))
+ (if (typed-var? ante1)
+ (if (find-if #'(lambda (a) (weaker-typed? ante1 a))
+ (conjuncts ante2))
+ (cons clause2 (insert-clause clause (rest clauses)))
+ (cons clause clauses))
+ (cons clause2 (insert-clause clause (rest clauses)))))
+ (if (conjunction? ante1)
+ ;; ((and p q) ..) : p --> ((and p q) p ..)
+ (if (typed-var? ante2)
+ (if (find-if #'(lambda (a) (weaker-typed? a ante2))
+ (conjuncts ante1))
+ (cons clause clauses)
+ (cons clause2 (insert-clause clause (rest clauses))))
+ ;; ante2 is not typed, eg. (IDENTIFIERP %U)
+ (if (member ante2 (conjuncts ante1) :test #'equal)
+ (cons clause clauses)
+ (cons clause2 (insert-clause clause (rest clauses)))))
+ ;; both are simple
+ (if (weaker-typed? ante1 ante2)
+ (cons clause2 (insert-clause clause (rest clauses)))
+ (cons clause clauses)))))))))))
+
+;----------------------------------------------------------------------------;
+; same-print-syntax
+;------------------
+; Given clauses rhs A and B
+; where <clause> = short-lambda-list syntax binding-list
+; return true iff
+; the syntax's constants are the same and its variables have the same bdg
+(defun same-print-syntax (a b)
+ (let ((a-syntax (clause-syntax a)) (b-syntax (clause-syntax b)))
+ (and (equal (length a-syntax) (length b-syntax))
+ (every #'(lambda (constituent1 constituent2)
+ (or (and (symbolp constituent1) (symbolp constituent2))
+ (and (stringp constituent1)
+ (stringp constituent2)
+ (string= constituent1 constituent2))))
+ a-syntax b-syntax)
+ ;; syntax is the same
+ (let ((a-bdgs (clause-bl a)) (b-bdgs (clause-bl b)))
+ ;; do all variables of the lambda-list have the same path?
+ (every #'(lambda (u v)
+ (equal (cdr (assoc u a-bdgs))
+ (cdr (assoc v b-bdgs))))
+ (clause-ll a)
+ (clause-ll b))))))
+
+;----------------------------------------------------------------------------;
+; make-format-string-list
+;------------------------
+; This converts a rhs of a grammar rule (SYNTAX) to a format string.
+; It tries to infer when spaces should be inserted based on the
+; parameter *identifier-continue-chars*
+; As a "rule of style" if a token has a space to its left (right) it should
+; also have one to its right (left), unless the token is the last in syntax.
+(defun make-format-string-list (syntax)
+ (let ((sep-sq (insert-seperator? syntax))
+ (a-tok "~a")
+ (s-tok "~s")
+ (blank " ")
+ pre-sep?)
+ ;; const1 const2 ... constn
+ ;; sep1 sep1 ... sep1
+ ;; enforce the rule of style that a grammar keyword has
+ ;; blanks on both sides if it has one on either
+ ;; this algorithm is too cautious, since it does not hurt to
+ ;; introduce a blank!
+ (do ((syn-tl syntax (cdr syn-tl))
+ (sep-tl sep-sq (cdr sep-tl))
+ Acc ; accumulated result
+ )
+ ((null syn-tl) (nreverse Acc))
+ (let ((const (car syn-tl))
+ (sep? (car sep-tl))
+ (preceding-blank? (and Acc (eql (first Acc) blank))))
+ (if (stringp const)
+ (progn
+ ;;(break "constituent= ~s" const)
+ (when (and pre-sep?
+ (not preceding-blank?)
+ (insert-seperator-before? const))
+ (setq preceding-blank? t) (push blank Acc))
+ (push (escape-tilde const) Acc)
+ (when (or sep?
+ ;; there is a preceding blank, and not at end
+ (and (cdr syn-tl)
+ preceding-blank?
+ (parse-id/number? (second syn-tl))))
+ (push blank Acc)))
+ (let ((firsts (first-terminal (constituent-name const))))
+ (if (and (null (rest firsts))
+ (string= "STRING" (first firsts)))
+ (push s-tok Acc)
+ (push a-tok Acc))
+ (when (or sep?
+ ;; there is a preceding blank, and not at end
+ (and (cdr syn-tl)
+ preceding-blank?
+ (parse-id/number? (second syn-tl))))
+ (push blank Acc))))
+ (setq pre-sep? sep?)
+ ;; (format t "~%Acc: |~{~a~}|" (reverse Acc))
+ ))))
+
+(defun escape-tilde (string)
+ ;; precede each ~ by ~
+ (declare (string string))
+ (let* ((R "")
+ (tilde #\~)
+ (p0 0)
+ (p1 (position tilde string :test #'eql)))
+ (declare (fixnum p0))
+ (if p1
+ (loop (setq R (concatenate
+ 'string R (subseq string p0 p1) "~~"))
+ (setq p0 (1+ p1))
+ (unless (setq p1 (position tilde string
+ :start p0 :test #'eql))
+ (return-from escape-tilde
+ (concatenate 'string R (subseq string p0)))))
+ string)))
+
+(defun parse-id/number? (const)
+ (when (stringp const)
+ (let* ((s const) (n (length s)) state)
+ (declare (string s))
+ (or ; number
+ (dotimes (i n t)
+ (let ((c (schar s i)))
+ (if (null state)
+ (if (digit-char-p c)
+ nil
+ (if (eql c #\.)
+ (setq state t)
+ (return nil)))
+ (if (digit-char-p c)
+ nil
+ (return nil)))))
+ ; id
+ (setq state nil)
+ (dotimes (i n t)
+ (let ((c (schar s i)))
+ (if (null state)
+ (if (find c *identifier-start-chars*)
+ (setq state t)
+ (return nil))
+ (if (find c *identifier-continue-chars*)
+ nil
+ (return nil)))))))))
+
+(defun continues-token? (e)
+ (declare (string e))
+ (or (zerop (length e))
+ (let ((c (schar e 0)))
+ (declare (character c))
+ (if (find c *identifier-continue-chars*)
+ t
+ (or (digit-char-p c)
+ (eql c #\.))))))
+
+(defun insert-seperator? (s)
+ ;; -> seq of T/Nil depending on whether the element in s should
+ ;; be followed by a seperator
+ (declare (list s))
+ (maplist #'(lambda (s-tl)
+ (let ((e1 (first s-tl)))
+ (if (null (rest s-tl))
+ ;; e1 is the last element
+ ;; by default no seperator after the last const
+ nil
+ ;; compare e1 to next element, e2
+ (let ((e2 (second s-tl)))
+ (if (symbolp e1)
+ (if (symbolp e2)
+ t
+ ;; the following string e2 could continue
+ ;; the id e1
+ (continues-token? (the string e2)))
+ (let ((ln1 (length e1)))
+ (if (= 0 ln1)
+ nil
+ (if (symbolp e2)
+ ;; e1 is a string
+ ;; follow it by space if
+ ;; it ends neither in white-space
+ ;; nor in a char not in *identifier-continue-chars*
+ ;; nor a digit
+ (insert-seperator-after? e1)
+ ;; both e1 and e2 are strings
+ ;; could they parse as a number or an id?
+ (and (parse-id/number? e1)
+ (continues-token? (the string e2)))))))))))
+ s))
+
+(defun white-space-p (char)
+ (let ((w (or (get-grammar-options-key ':white-space)
+ '(#\Space #\Newline #\Tab))))
+ (member (the character char) w :test #'char=)))
+
+(defun insert-seperator-before? (const)
+ (or (symbolp const)
+ (let ((ln (length const)))
+ (or (zerop ln)
+ (let ((c0 (schar const 0)))
+ (if (find c0 *identifier-continue-chars*)
+ T
+ (or (digit-char-p c0)
+ (white-space-p c0))))))))
+
+(defun insert-seperator-after? (const)
+ (or (symbolp const)
+ (let ((ln (length const)))
+ (or (zerop ln)
+ (let ((last-char (schar const (1- ln))))
+ (if (white-space-p last-char)
+ nil
+ (if (find last-char *identifier-continue-chars*)
+ T
+ (digit-char-p last-char))))))))
+
+;----------------------------------------------------------------------------;
+; simplify-cond-clauses
+;----------------------
+; ((and a1 b1) c1)
+; ((and a1 b2) c2 ..) ..
+; (cond (a1 (cond (b1 c1) (b2 c2))) ..
+
+(defun simplify-cond-clauses (clauses)
+ (flet ((conj1 (cl) (second cl))
+ (conj2 (cl) (third cl))
+ (and? (cl) (and (consp cl) (eq (car cl) 'AND))))
+ (let* ((cl1 (first clauses))
+ (ante1 (car cl1))
+ (rest1 (cdr cl1)))
+ (if (and (and? ante1) (rest clauses))
+ (let* ((cl2 (second clauses))
+ (ante2 (car cl2))
+ (rest2 (cdr cl2)))
+ (if (and (and? ante2) (equal (conj1 ante1) (conj1 ante2)))
+ `((,(conj1 ante1) (cond (,(conj2 ante1) .,rest1)
+ (,(conj2 ante2) .,rest2)))
+ .,(cddr clauses))
+ clauses))
+ clauses))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Type Inference for Non-Terminals
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun type->predicate (type)
+ (case type
+ (NUMBER 'numberp)
+ (IDENTIFIER 'identifierp)
+ (STRING 'stringp)
+ (t (intern (concatenate 'string (symbol-name type) "-P")
+ (symbol-package type)))))
+
+(defun infer-type-predicate (var &aux (v (constituent-name var)))
+ (case v
+ (NUMBER 'numberp)
+ (IDENTIFIER 'identifierp)
+ (STRING 'stringp)
+ (t (let ((type (infer-type v)))
+ (if (eq type ':TOP)
+ (let ((domain-top (car (type-tree-node--subtypes
+ *domain-type-hierarchy*))))
+ `(OR
+ ,(type-tree-node--label domain-top)
+ NUMBER SYMBOL STRING))
+ (if (consp type)
+ (if (null (rest type))
+ (type->predicate (first type))
+ (cons 'OR type))
+ (if (null type)
+ 'T
+ (type->predicate type))))))))
+
+
+(defun infer-type (v)
+ (if (member v '(NUMBER IDENTIFIER STRING))
+ v
+ (let ((disj (infer-type-disj v)))
+ (if (null disj)
+ (warn "Could not infer type for ~S" v)
+ disj))))
+
+;----------------------------------------------------------------------------;
+; is-subtype-of
+;--------------
+;
+;
+(defun is-subtype-of (a b)
+ (or (eq a b)
+ (let ((type-nd (gethash a *domain-HT*)))
+ (when type-nd
+ (let ((sup (type-tree-node--supertype type-nd)))
+ (and sup
+ (is-subtype-of (type-tree-node--label sup) b)))))))
+
+;----------------------------------------------------------------------------;
+; kb-subtypep
+;------------
+; disjunctive and conjunctive types are allowed
+;
+(defun kb-subtypep (a b)
+ (if (consp a)
+ (case (first a)
+ (OR (every #'(lambda (junct) (kb-subtypep junct b))
+ (rest a)))
+ (AND (some #'(lambda (junct) (kb-subtypep junct b))
+ (rest a)))
+ (T nil))
+ (if (consp b)
+ (case (first b)
+ (OR (some #'(lambda (junct) (kb-subtypep junct a))
+ (rest b)))
+ (AND (every #'(lambda (junct) (kb-subtypep junct a))
+ (rest b)))
+ (T nil))
+ (is-subtype-of a b))))
+
+(defun check-domain-type (type node)
+ (unless type
+ (error "~S is not a defined domain type." node)))
+
+(defun infer-type-disj (v &aux (nts (list v)))
+ ;; return a list of the possible types for a non-terminal V
+ (labels ((infer-type-aux (v disjuncts)
+ (if (or (member v '(NUMBER IDENTIFIER STRING))
+ (assoc v *lex-cats*))
+ (adjoin v disjuncts)
+ (let ((zb-rule (assoc v *zb-rules*))
+ (types disjuncts))
+ (unless zb-rule
+ (error "No Rule/Non-terminal named ~s found" v))
+ (dolist (prod (zb-rule--productions (cdr zb-rule)) types)
+ (let ((s (production-rhs--semantics prod)))
+ (if s
+ (if (feat-term-p s)
+ (setq types (adjoin-type-disj
+ (feat-term--type s) types))
+ (dolist (type (infer-type s))
+ (setq types (adjoin-type-disj type types))))
+ (let ((nt (find-if #'symbolp
+ (production-rhs--syntax prod))))
+ (unless (or (null nt) (member nt nts))
+ (push nt nts)
+ (setq types
+ (infer-type-aux nt types)))))))))))
+ (infer-type-aux v nil)))
+
+(defun adjoin-type-disj (type disj)
+ (if (find type disj :test #'is-subtype-of)
+ disj
+ (cons type (delete-if #'(lambda (a) (is-subtype-of a type))
+ disj))))
+
+
+(defun infer-type-disj-of-expr (x)
+ (typecase x
+ (number '(number))
+ (string '(string))
+ (symbol (infer-type-disj (constituent-name x)))))
+
+;----------------------------------------------------------------------------;
+; find-path
+;----------
+; Given a typed feature-structure feat-term, and a variable V occuring
+; somewhere as a value of a slot, return a path to it
+; return: (1) if you are there ()
+; (2) if there is no path to v: :FAIL
+; (3) if there is some path: the first one found
+
+(defun find-path (v feat-term)
+ (labels ((find-path-aux (avl)
+ (if (atom avl)
+ (if (feat-term-p avl)
+ (find-path-list (feat-term--slots avl)
+ (feat-term--type avl))
+ (if (eq v avl)
+ t
+ :FAIL))
+ :FAIL))
+ (find-path-list (avl type)
+ (dolist (lv-pair avl)
+ (let ((p (find-path-aux (label-value-pair--value lv-pair))))
+ (unless (eq p :FAIL)
+ (return
+ (cons (intern
+ (concatenate
+ 'string
+ (symbol-name type) "-"
+ (symbol-name (label-value-pair--label lv-pair)))
+ (symbol-package type))
+ (if (eq p 't) nil p))))))))
+ (find-path-aux feat-term)))
+
+;----------------------------------------------------------------------------;
+; partition-set
+;--------------
+; partition SET according to EQUIV-FN
+; for equiv-fn holds (equiv-fn x y) = (equiv-fn y x)
+
+(defun partition-set (equiv-fn set &aux alist)
+ (do ((x-set set (cdr x-set))) ((null x-set))
+ (let ((x (car x-set)))
+ (push (list x) alist)
+ (do ((y-set (cdr x-set) (cdr y-set))) ((null y-set))
+ (let ((y (car y-set)))
+ (if (funcall equiv-fn x y)
+ (let ((found-association (assoc x alist)))
+ (push y (cdr found-association))))))))
+ (labels ((partition-set-aux (alist)
+ (if (null alist)
+ '()
+ (let* ((pair1 (car alist))
+ (set1 (reduce #'union
+ (mapcar
+ #'(lambda (p)
+ (let ((found (find-if
+ #'(lambda (p1)
+ (member p1 p))
+ pair1)))
+ (when found
+ (setf alist (delete p alist))
+ p)))
+ (cdr alist))
+ :initial-value pair1)))
+ (cons set1
+ (partition-set-aux (cdr alist)))))))
+ (partition-set-aux alist)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; tests
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+#||
+
+(GEN-PRINTERS (find-grammar "ex1a"))
+(infer-type 'cl-user::ee)
+(infer-type 'cl-user::f)
+(infer-type 'cl-user::tt)
+(infer-type-predicate 'IDENTIFIER)
+(infer-type-predicate 'cl-user::ee)
+
+(PARTITION-SET #'(lambda (x y)
+ (eql (schar (string x) 0)
+ (schar (string y) 0)))
+ '(a aa aaa b bbb bb c cccc))
+
+(PARTITION-SET #'(lambda (x y)
+ (eql (schar (string x) 0)
+ (schar (string y) 0)))
+ '(a b c))
+
+;----------------------------------------------------------------------------;
+; partition-set-by-selection-fn
+;------------------------------
+;;; partition set according to selection-fn
+
+(defun partition-set-by-selection-fn (selection-fn set &aux alist)
+ (dolist (item set)
+ (let* ((key (funcall selection-fn item))
+ (found-association (assoc key alist :test #'eql)))
+ (if found-association
+ (nconc (cdr found-association) (list item))
+ (push (cons key (list item)) alist))))
+ (dolist (pair alist)
+ (setf (car pair) (cadr pair)
+ (cdr pair) (cddr pair)))
+ alist)
+
+
+(partition-set-by-selection-fn #'evenp '(1 2 3 4 5 6 7 8))
+
+ ==> ((2 4 6 8) (1 3 5 7))
+||#
+
+#||
+;----------------------------------------------------------------------------;
+; follow-terminal
+;----------------
+; given the name of a grammar-symbol, return the
+; list of possibly following strings
+(defun follow-terminal (name)
+ (mapcar #'g-symbol-name
+ (oset-item-list (g-symbol-follow-set (g-symbol-intern name))))
+ )
+||#
+
+(defun first-terminal (name)
+ (mapcan #'(lambda (item)
+ (unless (eq item *empty-string-g-symbol*)
+ (list (g-symbol-name item))))
+ (oset-item-list (g-symbol-first-set (g-symbol-intern name)))))
+
+#||
+(follow-terminal 'user::ARG)
+(first-terminal 'user::ARG*448)
+(follow-terminal 'user::ARG*)
+(first-terminal 'user::Name)
+(first-terminal 'Identifier)
+
+(intersection (follow-terminal 'user::ARG) (first-terminal 'user::ARG*438))
+(intersection (follow-terminal 'user::stmt) (first-terminal 'user::stmt+))
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-generator.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-kb-domain.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-kb-domain.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,155 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-kb-domain.lisp
+; Description:
+; Author: Joachim H. Laubsch
+; Created: 19-Mar-93
+; Modified: Wed Aug 4 20:43:54 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1993, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(IN-PACKAGE "ZEBU")
+(require "zebu-aux")
+(provide "zebu-kb-domain")
+;----------------------------------------------------------------------------;
+; for-each-supertype
+;-------------------
+; Iterate fn over all supertypes of type. Type is the label of a
+; type-tree-node in *domain-HT*
+; Note that every type is its own supertype.
+
+(defun for-each-supertype (fn type &optional errorp)
+ (let ((node (gethash type *domain-HT*)))
+ (labels ((doit (node)
+ (when (type-tree-node-p node)
+ (funcall fn node)
+ (doit (type-tree-node--supertype node)))))
+ (if node
+ (doit node)
+ (when errorp
+ (KB-type-error type))))))
+
+;----------------------------------------------------------------------------;
+; KB-legal-slot-p
+;----------------
+; Is slot-label a legal name of a slot of a type named TYPE?
+; EXPORTED
+(defun KB-legal-slot-p (type slot-label)
+ (for-each-supertype #'(lambda (node)
+ (dolist (slot (type-tree-node--slots node))
+ (when (eq (if (consp slot)
+ (car slot)
+ slot)
+ slot-label)
+ (return-from KB-legal-slot-p t))))
+ type
+ t))
+
+;----------------------------------------------------------------------------;
+; KB-slot-type
+;-------------
+; slot-label is a KB-legal-slot-p type
+; if slot-label has a type restriction (<slot-label> <type-restriction>)
+; this restriction will be returned
+; else :TOP wil be returned
+; EXPORTED
+(defun KB-slot-type (type slot-label)
+ (for-each-supertype
+ #'(lambda (node)
+ (dolist (slot (type-tree-node--slots node))
+ (if (consp slot)
+ (when (eq (car slot) slot-label)
+ (return-from KB-slot-type (cadr slot)))
+ (when (eq slot slot-label)
+ (return-from KB-slot-type :TOP)))))
+ type
+ t)
+ (error "~a is not a slot of ~a" slot-label type)
+ )
+
+;----------------------------------------------------------------------------;
+; kb-slots
+;---------
+; given a type name, return its slots
+; a slot may be a list (<slot-name> <type-name>)
+; EXPORTED
+(defun kb-slots (type &aux slots)
+ (for-each-supertype
+ #'(lambda (n)
+ (setq slots (append (type-tree-node--slots n) slots)))
+ type
+ t)
+ slots)
+
+;----------------------------------------------------------------------------;
+; kb-supertype
+;-------------
+; given a type name, return its supertype
+; the top type is named :TOP and its supertype is :TOP
+; EXPORTED
+(defun kb-supertype (type)
+ (let ((node (gethash type *domain-HT*)))
+ (if node
+ (if (eq *domain-type-hierarchy* node)
+ ':TOP
+ (type-tree-node--label
+ (type-tree-node--supertype node)))
+ (KB-type-error type))))
+
+;----------------------------------------------------------------------------;
+; kb-subtypes
+;------------
+; given a type name, return a list of its subtypes
+; EXPORTED
+(defun kb-subtypes (type)
+ (let ((node (gethash type *domain-HT*)))
+ (if node
+ (mapcar #'type-tree-node--label
+ (type-tree-node--subtypes node))
+ (KB-type-error type))))
+
+(defun KB-type-error (type)
+ (error "~a is not a KB-type" type))
+
+(defun KB-type-name-p (item)
+ ;; if ITEM is the name of a subtype of KB-domain
+ (not (null (gethash item *domain-HT*))))
+
+#|| test
+(zb:compile-slr-grammar (merge-pathnames "arith-exp.zb"
+ user::*ZEBU-test-directory*)
+ :output-file (merge-pathnames
+ "binary/arith-exp.tab"
+ user::*ZEBU-test-directory*)
+ :grammar (find-grammar "zebu-mg"))
+(zb:zebu-load-file (merge-pathnames "binary/arith-exp.tab"
+ user::*ZEBU-test-directory*))
+(ds:load-system 'user::Zebu-rr)
+(KB-slot-type 'user::Mult-op 'user::-arg1)
+(kb-slots 'user::Plus-op)
+(kb-slots 'user::Factor)
+(kb-supertype 'user::Factor)
+(kb-supertype 'user::ARITH-EXP)
+(kb-supertype 'KB-DOMAIN)
+(kb-supertype 'KB-SEQUENCE)
+(kb-supertype ':TOP)
+
+(kb-subtypes ':TOP)
+(KB-type-name-p 'IDENTIFIER)
+(KB-type-name-p 'KB-DOMAIN)
+(KB-subtypes 'KB-DOMAIN)
+(kb-subtypes 'user::ARITH-EXP)
+(kb-subtypes 'user::+-OP)
+(kb-slots 'user::+-OP)
+
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-kb-domain.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-lalr1.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-lalr1.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,288 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-lalr1.l
+; Description: Calculation of LALR(1) sets
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Fri Mar 8 14:48:03 1996 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Propagate lookaheads
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This is used when we discover that lookaheads propagate from one
+;;; lr(0) item set to another during the calculation of lalr(1) sets
+;;; of items. Add a link to the dependency digraph and propagate the
+;;; lookaheads we already know about.
+
+(declaim (inline lalr1-add-depender lalr1-add-lookahead))
+
+;;; This is used when we discover a lookhead for an lr(0) item set during
+;;; the calculation of lalr(1) sets. If the lookahead wasn't already there,
+;;; add it, and also add it to the "dependers": those item sets to whom
+;;; lookaheads propagate from the item in question.
+
+(defun lalr1-add-lookahead (symbol item)
+ (declare (type item item))
+ (labels ((lalr1-add-lookahead-aux (item)
+ (when (oset-insert! symbol (item-look-aheads item))
+ ;; Wasn't already there.
+ (dolist (depender
+ (the list (oset-item-list
+ (the oset
+ (item-look-ahead-dependers item)))))
+ (lalr1-add-lookahead-aux depender)))))
+ (lalr1-add-lookahead-aux item)))
+
+(defun lalr1-add-depender (propagate-to propagate-from)
+ (if (oset-insert! propagate-to (item-look-ahead-dependers propagate-from))
+ (dolist (gs (the list (oset-item-list
+ (the oset (item-look-aheads propagate-from)))))
+ (lalr1-add-lookahead gs propagate-to))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Discover and propagate lalr(1) look-aheads among members of lr(0)
+;;; collection.
+
+;;; This algorithm for propagating lalr(1) lookaheads is a straightforward
+;;; recursive version of the algorithm sketched in section 6.9 of the (older)
+;;; dragon book "Principles of Compiler Design" by A.V. Aho and J.D Ullman.
+;;; The major drawback of this algorithm is that it may be somewhat wasteful
+;;; of space. With modern address spaces who cares?
+;;; Basically, it crawls around on the lr(0) item sets and as it goes,
+;;; it discovers both lookaheads which are "spontaneously" generated for
+;;; an item set, and item sets to whom lookaheads propagate. The doubly
+;;; recursive way of implementing this is similar to the method used
+;;; in calculating first sets in first.l
+
+;;; (New) the names are getting a bit confusing here. This function transforms
+;;; the data structure *lr0-item-sets* from being the lr(0) collection to
+;;; the lalr(1) collection.
+
+;; the following is heavily optimized in the inner loop, and therefore hardly
+;; intelligible. For reference look at the original Scheme program at the
+;; end of this file.
+
+(declaim (special *LR0-START-STATE-INDEX*))
+
+(defun lalr1-do-lookaheads ()
+ ;; Introduce a "dummy" terminal symbol which is used as a hack in
+ ;; lookahead calculations.
+ (let ((dummy-g-symbol (new-g-symbol "dummy" -1))
+ (lr0-item-sets-item-list (oset-item-list (the oset *lr0-item-sets*)))
+ (sad-list (list nil))) ; efficiency hack
+ ;; The dummy symbol is terminal and must be in its own first set.
+ (oset-insert! dummy-g-symbol (g-symbol-first-set dummy-g-symbol))
+ ;; Map over all the kernel items.
+ (dolist (item-set lr0-item-sets-item-list)
+ (declare (type item-set item-set))
+ (let* ((kernel (item-set-kernel item-set))
+ (index (item-set-index item-set))
+ (item-set-goto-map (item-set-goto-map item-set))
+ (goto-map-odf (oset-order-fn item-set-goto-map))
+ (goto-map-item-list (oset-item-list item-set-goto-map)))
+ (declare (fixnum index))
+ (dolist (kernel-item (the list (oset-item-list (the oset kernel))))
+ ;; Special case: the end symbol is a lookahead for the start
+ ;; production.
+ (if (= *lr0-start-state-index* index)
+ ;; There had better only be one item in this set!
+ (lalr1-add-lookahead *the-end-g-symbol* kernel-item))
+ ;; Here we use the hack in dragon 6.9 (fig 6.20) of using lr(1)
+ ;; closure with a dummy grammar symbol to discover propagated
+ ;; and spontaneous lookaheads for a lr(0) kernel item. The
+ ;; funny-closure-items are in J' of the figure.
+ (dolist (funny-closure-item
+ ;; The set of "funny" closure items. J'.
+ (the list (oset-item-list
+ (the oset (single-item-closure-1
+ (copy-lr0-item kernel-item)
+ dummy-g-symbol)))))
+ (declare (type item funny-closure-item))
+ (block funny-closure-item
+ (let ((funny-closure-item-look-aheads
+ (item-look-aheads funny-closure-item)))
+ (when (oset-empty? funny-closure-item-look-aheads)
+ (return-from funny-closure-item nil))
+ (let* ((production (item-production funny-closure-item))
+ (production-length (production-length production))
+ (item-after-dot (item-after-dot funny-closure-item)))
+ (declare (fixnum production-length item-after-dot)
+ (type production production))
+ (when (= production-length item-after-dot)
+ (return-from funny-closure-item nil))
+ (let* ((goto-item-proto (make-item
+ :production production
+ :after-dot (1+ item-after-dot)))
+ (set (item-set-kernel
+ (cdr (or (progn
+ ;; instead of CONSing we reuse SAD-LIST
+ (setf (car (the CONS sad-list))
+ (nth item-after-dot
+ (the list (rhs production))))
+ (dolist (item goto-map-item-list)
+ (when (eq 'equal
+ (funcall goto-map-odf
+ sad-list item))
+ (return item))))
+ (error "Failed to find the goto set")))))
+ (odf (oset-order-fn set))
+ ;; Here we go to some expense to locate the goto set
+ ;; for an item.
+ ;; These should be pre-computed and cached instead.
+ (goto-item
+ (dolist (item (oset-item-list set)
+ (error "Failed to find goto item"))
+ (when (eq 'equal
+ (funcall odf goto-item-proto item))
+ (return item)))))
+ (dolist (lookahead
+ (oset-item-list
+ (the oset funny-closure-item-look-aheads)))
+ (if (eq lookahead dummy-g-symbol)
+ ;; Discovered lookahead propagation.
+ (lalr1-add-depender goto-item kernel-item)
+ ;; Discovered lookahead.
+ (lalr1-add-lookahead lookahead goto-item))))))))))
+ (princ "."))
+ ;; NEW STUFF HERE: 1-27-88
+ (terpri)
+ (dolist (item-set lr0-item-sets-item-list)
+ (declare (type item-set item-set))
+ (closure-1! (item-set-closure item-set))
+ (princ "."))))
+
+
+;;; This should be primitive, and not insert if not there.
+;;; Third arg is error msg
+;;; result is eq to member of the set.
+
+(defun oset-find (element set)
+ (let ((odf (oset-order-fn set)))
+ (dolist (item (oset-item-list set))
+ (when (eq 'equal (funcall odf element item))
+ (return item)))))
+
+(defun copy-lr0-item (i)
+ (make-item :production (item-production i)
+ :after-dot (item-after-dot i)))
+
+;;; Do all needed to generate parse tables starting with a lisp syntax
+;;; grammar. (doesn't write out a table file)
+
+(defun lalr1-tables-from-grammar (file-name &rest args)
+ (apply #'load-grammar file-name args)
+ (calculate-empty-string-derivers)
+ (calculate-first-sets)
+ (calculate-follow-sets)
+ (make-lr0-collection)
+ (lalr1-do-lookaheads)
+ (build-parse-tables t)
+ file-name)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Original Scheme Algorithm
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#||
+(define (lalr1-do-lookaheads)
+ ;; Introduce a "dummy" terminal symbol which is used as a hack in
+ ;; lookahead calculations.
+ (let ((dummy-g-symbol (new-g-symbol "dummy" -1)))
+ ;; The dummy symbol is terminal and must be in its own first set.
+ (oset-insert! dummy-g-symbol (g-symbol-first-set dummy-g-symbol))
+ ;; Map over all the kernel items.
+ (oset-for-each
+ (lambda (item-set)
+ (oset-for-each
+ (lambda (kernel-item)
+ ;; Special case: the end symbol is a lookahead for the start
+ ;; production.
+ (if (equal? lr0-start-state-index (item-set-index item-set))
+ ;; There had better only be one item in this set!
+ (lalr1-add-lookahead the-end-g-symbol kernel-item))
+
+ ;; Here we use the hack in dragon 6.9 (fig 6.20) of using lr(1)
+ ;; closure with a dummy grammar symbol to discover propagated
+ ;; and spontaneous lookaheads for a lr(0) kernel item. The
+ ;; funny-closure-items are in J' of the figure.
+
+ (oset-for-each
+ (lambda (funny-closure-item)
+ (if
+ (not (oset-empty? (item-look-aheads funny-closure-item)))
+ (begin
+ (let ((goto-item-proto (advance-dot funny-closure-item)))
+ (if goto-item-proto
+ (begin
+ ;; Here we go to some expense to locate the goto set
+ ;; for an item.
+ ;; These should be pre-computed and cached instead.
+ (let ((goto-item
+ (oset-find
+ goto-item-proto
+ (item-set-kernel
+ (find-goto-set
+ item-set
+ (symbol-after-dot funny-closure-item)))
+ "internal error - failed to find goto item")))
+ (oset-for-each
+ (lambda (lookahead)
+ (if (eq? lookahead dummy-g-symbol)
+ ;; Discovered lookahead propagation.
+ (lalr1-add-depender goto-item kernel-item)
+ ;; Discovered lookahead.
+ (lalr1-add-lookahead lookahead goto-item)))
+ (item-look-aheads funny-closure-item)))))))))
+ ;; The set of "funny" closure items. J'.
+ (single-item-closure-1 (copy-lr0-item kernel-item)
+ dummy-g-symbol)))
+ (item-set-kernel item-set))
+ (display "."))
+ lr0-item-sets))
+
+ ;; NEW STUFF HERE: 1-27-88
+ (newline)
+ (oset-for-each
+ (lambda (item-set)
+ (closure-1! (item-set-closure item-set))
+ (display "."))
+ lr0-item-sets
+ ))
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test
+#||
+(set-working-direct *ZEBU-test-directory*)
+(lalr1-tables-from-grammar "ex6_2.zb")
+
+(progn
+ (lalr1-tables-from-grammar "ex4.zb")
+ (princ "symbols: ") (terpri)
+ (cruise-symbols-2)
+ (princ "productions: ") (terpri)
+ (print-productions)
+ (princ "lr0 item sets: ") (terpri)
+ (print-collection nil)
+ (princ "lalr(1) tables: ") (terpri)
+ (cruise-parse-tables)
+ )
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-lalr1.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-loader.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-loader.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,502 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-loader.l
+; Description: load a ZEBU grammar table
+; Author: Joachim H. Laubsch
+; Created: 6-Nov-90
+; Modified: Thu Oct 2 12:00:10 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 13-Jan-93 (Joachim H. Laubsch)
+; implemented terminal-alist access via the vector terminal-alist-SEQ
+; 5-Nov-91 (Joachim H. Laubsch)
+; removed dependency on LUCID in the use of backquoted expressions
+; in semantic actions
+; 16-Jul-91 (Joachim H. Laubsch)
+; Added a facility to deal with multiple grammars
+; lr-parse takes a third argument, a grammar
+; READ-PARSER and LIST-PARSER take a :grammar keyword argument, defaulting to
+; *current-grammar*
+; in order to use several grammars we need several
+; *IDENTIFIER-CONTINUE-CHARS*, *IDENTIFIER-START-CHARS*
+;
+; 1-Mar-91 (Joachim H. Laubsch)
+; did monitoring, found that 75% of the time is in the lexer.
+; rewrote ZEBU::RECOGNIZE-TOKEN to use a hashtable of terminal-tokens
+; this sped up this function by a factor of 35. Speed-up of READ-PARSER: 3.5
+; 11-Dec-90 (Joachim H. Laubsch)
+; Introduce the ZEBU package
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(provide "zebu-loader")
+
+;;; The following data structures are loaded from a parse table file by the
+;;; function which follows.
+;;;
+;;; lexicon is a vector of strings or lisp symbols , indexed by the
+;;; "grammar symbol indices", which are the instantiations of
+;;; the grammar symbols.
+;;;
+;;; terminal-indices is a list of the grammar symbol indices indicating
+;;; which among them are terminal symbols.
+;;;
+;;; production-info is a vector, indexed by the production indices.
+;;; Each item is a cons: the cars index the symbols
+;;; which are the lhs of the productions, the cdrs indicate the
+;;; lengths of the productions.
+;;;
+;;; action-table is a vector indexed by the state indices.
+;;; Each state's entry is a vector whose elements represent
+;;; defined entries in the action parsing function. These entries are 3 element
+;;; lists whose first elements are the indices of the grammar symbol argument
+;;; to the action parsing function. The second elements in the lists are an
+;;; encoding of the action function: 's for shift, 'r for reduce, 'a for
+;;; accept. The third elements are production or next state indices as
+;;; approprite. The three element lists appear in their surrounding
+;;; vectors sorted on their cars.
+;;;
+;;; goto-table is arranged similar to action-table but has two element
+;;; lists instead of three. The second element of each list are the
+;;; index of the state to goto.
+;;;
+;;; end-symbol-index holds the index of the end symbol.
+;;;
+;;; terminal-alist associates terminal symbol instantiations with
+;;; their indices.
+;;;
+;;; client-lambdas are a vector of procedures, indexed by production index,
+;;; which correspond to productions in the grammar. The client lambdas are
+;;; what the parser calls to do syntax directed something by side effect.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Zebu Grammar Struct
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; helps define the function that computes whether a character can continue
+;; a symbol
+
+(defvar *identifier-continue-chars*
+ "$-_*.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890?"
+ "Characters that may occur in an identifier. Set this before calling zebu-load-file.")
+
+(defvar *identifier-start-chars* "$-*?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "Characters that may start an identifier.")
+
+;----------------------------------------------------------------------------;
+; *string-delimiter*, *symbol-delimiter*
+;---------------------------------------
+;; An NLL-constant can now be a string or a symbol. A string is surrounded
+;; by double-quotes (#\"), as in: P(arg1: \"|Jon Doe's Deli|\")
+;; A symbol is surrounded by single-quotes (#\'), as in:
+;; P(arg1: 'Jon Doe')
+;; or P(arg1: '|Jon Doe|')
+;; By default, the single-quotes may be omitted at parsing in case the
+;; symbol contains only characters which are in
+;; (grammar-identifier-continue-chars *current-grammar*)
+;; as in P(arg1: Jon_Doe)
+;; Either set these variables before the grammar is loaded
+;; or supply the initial values explicitely in the .grm file
+;; e.g. (:name "nll" :string-delimiter #\" :symbol-delimiter #\')
+(defvar *string-delimiter* #\"
+ "Delimits a lexical token, considered as a STRING.")
+
+(defvar *symbol-delimiter* #\'
+ "Delimits a lexical token, considered as a SYMBOL.")
+
+(defvar *preserve-case* nil
+ "If true, the case of an identifier will be preserved (default false).")
+
+(defvar *case-sensitive* nil
+ "If true, the case of a keyword matters otherwise case is ignored when \
+looking for the next token (default false).")
+
+(defvar *disallow-packages* nil
+ "If false, Zebu parses identifiers as symbols possibly qualified by a package")
+
+;----------------------------------------------------------------------------;
+; grammar
+;--------
+;
+(defstruct (grammar (:print-function print-grammar))
+ name
+ lexicon
+ terminal-indices
+ production-info
+ action-table
+ goto-table
+ lr-parser-start-state-index
+ end-symbol-index
+ client-lambdas
+ identifier-index
+ string-index
+ (number-index nil)
+ (identifier-continue-chars *identifier-continue-chars* :type string)
+ (identifier-continue-chars-V (make-array char-code-limit :element-type 'bit
+ :initial-element 0))
+ (identifier-start-chars *identifier-start-chars* :type string)
+ (identifier-start-chars-V (make-array char-code-limit :element-type 'bit
+ :initial-element 0))
+ ;; a vector to be indexed by the char-code of the first character of a key
+ ;; each element contains an alist of pairs: (,terminal-token . ,index)
+ (terminal-alist-SEQ (make-sequence 'vector
+ char-code-limit
+ :initial-element nil))
+ (case-sensitive *case-sensitive*)
+ (string-delimiter *string-delimiter* :type character)
+ (symbol-delimiter *symbol-delimiter* :type character)
+ file
+ (package *package*)
+ grammar ; the grammar used to parse the
+ ; grammar being defined
+ ; defaults to the null-grammar
+ ; but you can use the meta-grammar
+ (zb-rules ())
+ (domain ())
+ domain-file
+ (lex-cats ()) ; an alist of cateory name and
+ ; regular expressions
+ (lex-cat-map ()) ; an alist of index and reg-ex function
+ (white-space '(#\Space #\Newline #\Tab))
+ (intern-identifier t) ; Identifier is represented as symbol
+ (id-allows-start-digit nil) ; An Identifier may start with a digit
+ )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Null Grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar *NULL-Grammar* (make-grammar :name "null-grammar"))
+
+(defun print-grammar (item stream level)
+ (declare (ignore level))
+ (format stream "<Zebu Grammar: ~A>" (grammar-name item)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; register a grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar *all-grammars*
+ (list (cons (grammar-name *NULL-Grammar*) *NULL-Grammar*)))
+
+(defun find-grammar (name)
+ (cdr (assoc (string name) *all-grammars* :test #'equal)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Lexical Analysis Info
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar *identifier-continue-chars-V*)
+(declaim (inline identifier-continue-char-p))
+(defun identifier-continue-char-p (char)
+ (declare (character char))
+ (= 1 (sbit *identifier-continue-chars-V* (char-code char))))
+
+(defvar *identifier-start-chars-V*)
+(declaim (inline identifier-start-char-p))
+(defun identifier-start-char-p (char)
+ (declare (character char))
+ (= 1 (sbit *identifier-start-chars-V* (char-code char))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Lex-Cats
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declaim (inline add-to-lex-cat-map))
+;; preserve the order of the definition
+
+;; from marc at rose.de
+;; the (index . (symbol-function terminal-token)) will be inserted
+;; according to the order in *lex-cats* = (grammar-lex-cats grammar)
+
+(defun add-to-lex-cat-map (index terminal-token grammar
+ &aux (lower (cdr (member terminal-token
+ (grammar-lex-cats grammar)
+ :key #'car))))
+ (setf (grammar-lex-cat-map grammar)
+ (merge 'list (list (cons index (symbol-function terminal-token)))
+ (grammar-lex-cat-map grammar)
+ #'(lambda (&rest r)
+ (not (member (car r) lower
+ :key #'(lambda (x)
+ (symbol-function (car x))))))
+ :key #'cdr)))
+
+;(defun add-to-lex-cat-map (index terminal-token grammar)
+; (setf (grammar-lex-cat-map grammar)
+; (nconc (grammar-lex-cat-map grammar)
+; (list (cons index (symbol-function terminal-token))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Debugging
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar *grammar-debug* nil
+ "If TRUE at compile or load time, the parser emits traces, else not.")
+
+(defmacro if-debugging (&rest x)
+ `(progn . ,(if *grammar-debug*
+ x
+ 'nil)))
+
+(eval-when (compile)
+ (setq *grammar-debug* nil))
+
+#||
+(eval-when (eval)
+ (setq *grammar-debug* T))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Read in a set of parse tables as written by (dump-tables) .
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun zebu-load-file (filename &key (verbose t)
+ &aux lexicon terminal-indices (*package* *package*))
+ ;; returns a grammar and registers this grammar on *all-grammars*
+ (let ((path (probe-file (merge-pathnames
+ filename
+ (merge-pathnames (make-pathname :type "tab")))))
+ (*load-verbose* verbose))
+ (if path
+ (when verbose
+ (format t "~%Loading ~s" (namestring path)))
+ (error "File not found: ~S" filename))
+ (unless (equalp (pathname-type path) "tab")
+ (let ((name (pathname-name path)))
+ (cerror "~S is now compiled."
+ "~S is not a Zebu output!~%;;; Compile ~S first!"
+ name filename name)
+ (setf path (merge-pathnames (make-pathname :type "tab") path)
+ filename (namestring path))))
+ (with-open-file (port path :direction :input)
+ (let ((options ; 1: read grammar-options
+ (catch 'read-grammar-options
+ (check-grammar-options (read port) path nil))))
+ (unless options
+ (close port)
+ (setq port (open path :direction :input))
+ (setq options
+ (catch 'read-grammar-options
+ (check-grammar-options (read port) path nil))))
+ (let* ((g (apply #'make-grammar options))
+ (terminal-alist-SEQ (grammar-terminal-alist-SEQ g)))
+ (declare (type grammar g))
+ (prepare-domain (grammar-domain g))
+ ;; 1a: load the domain file
+ (let ((grammar-domain-file (grammar-domain-file g)))
+ (when grammar-domain-file
+ (let ((grammar-domain-file-name
+ (pathname-name (pathname grammar-domain-file))))
+ (or (block find-domain-file
+ (dolist (type (append *load-binary-pathname-types*
+ *load-source-pathname-types*))
+ (dolist (domain-path (list path (grammar-file g)))
+ (let ((domain-file
+ (merge-pathnames
+ (make-pathname
+ :name grammar-domain-file-name
+ :type type)
+ domain-path)))
+ (when (probe-file domain-file)
+ (when *load-verbose*
+ (format t "~%Loading domain file ~s"
+ (namestring domain-file)))
+ (return-from find-domain-file
+ (load domain-file)))))))
+ (warn "No domain file found")))))
+
+ ;; 2: read grammar-lexicon
+ (setf (grammar-lexicon g) (setf lexicon (read port))
+ ;; 3: read grammar-terminal-indices
+ (grammar-terminal-indices g) (setf terminal-indices (read port))
+ ;; 4: read grammar-production-info
+ (grammar-production-info g) (read port))
+ (let ((old-grammar (assoc (grammar-name g) *all-grammars*
+ :test #'string=)))
+ (if old-grammar
+ (setf (cdr old-grammar) g)
+ (setf *all-grammars* (acons (grammar-name g) g *all-grammars*))))
+
+ ;; 5: read grammar-action-table
+ (setf (grammar-action-table g)
+ (vectorize-vector-of-lists (read port)))
+
+ ;; 6: read grammar-goto-table
+ (setf (grammar-goto-table g) (vectorize-vector-of-lists (read port))
+ ;; 7: read grammar-lr-parser-start-state-index
+ (grammar-lr-parser-start-state-index g) (read port)
+ ;; 8: read grammar-end-symbol-index
+ (grammar-end-symbol-index g) (read port)
+ ;; 9: read grammar-client-lambdas
+ (grammar-client-lambdas g) (read-parser-actions port g))
+
+ ;; IDENTIFIER-START-CHARS
+ (let ((identifier-start-chars-V
+ (grammar-identifier-start-chars-V g))
+ (identifier-start-chars (grammar-identifier-start-chars g)))
+ (dotimes (i (length identifier-start-chars))
+ (let ((c (schar identifier-start-chars i)))
+ (declare (character c))
+ (setf (sbit identifier-start-chars-V (char-code c))
+ 1)
+ (when (digit-char-p c)
+ (setf (grammar-id-allows-start-digit g) t)))))
+
+ ;; IDENTIFIER-CONTINUE-CHARS
+ (let ((identifier-continue-chars-V
+ (grammar-identifier-continue-chars-V g))
+ (identifier-continue-chars
+ (grammar-identifier-continue-chars g)))
+ (dotimes (i (length identifier-continue-chars))
+ (setf (sbit identifier-continue-chars-V
+ (char-code
+ (the character
+ (schar identifier-continue-chars i))))
+ 1)))
+
+ ;; sort the terminal-alist so that terminals with the same
+ ;; initial string are sorted by decreasing length
+ ;; i.e. if "?" and "?u?" are both terminals, then "?u?"
+ ;; should be found first.
+ ;; This can simply be achieved by sorting according to
+ ;; ascending key length.
+ (dotimes (i (length (the simple-vector terminal-indices)))
+ (let* ((index (svref terminal-indices i))
+ (terminal-token (svref lexicon index)))
+ (declare (type (or symbol string) terminal-token))
+ (typecase terminal-token
+ (string
+ (let ((char1-code
+ (char-code (let ((c (schar terminal-token 0)))
+ (declare (character c))
+ (if (grammar-case-sensitive g)
+ c
+ (char-downcase c)))))
+ (token-association `(,terminal-token . ,index)))
+ ;; keep a table indexed by char-code of first-char
+ ;; of the terminal tokens
+ (let ((bucket (elt terminal-alist-SEQ char1-code)))
+ (setf (elt terminal-alist-SEQ char1-code)
+ (if bucket
+ (sort (cons token-association bucket)
+ #'(lambda (a b) (declare (string a b))
+ (> (length a) (length b)))
+ :key #'car)
+ (list token-association))))))
+ (symbol
+ (let ((terminal-token-name (symbol-name terminal-token)))
+ (declare (string terminal-token-name))
+ (cond ((string= terminal-token-name "IDENTIFIER")
+ (setf (grammar-identifier-index g) index))
+ ((string= terminal-token-name "STRING")
+ (setf (grammar-string-index g) index))
+ ((string= terminal-token-name "NUMBER")
+ (setf (grammar-number-index g) index))
+ ;; for lexical categories: remember index
+ ((assoc terminal-token (grammar-lex-cats g))
+ (add-to-lex-cat-map index terminal-token g))
+ (t (warn "If ~S is a terminal it should be a string, not a symbol.~%If it's a non-terminal it's undefined."
+ terminal-token))))))))
+ g)))))
+
+(defun read-parser-actions (port grammar)
+ ;; zb-rules = [(<NT> . <zb-rule>) ...]
+ (let ((zb-rules (read port))
+ (actions (make-sequence
+ 'vector
+ (length (grammar-production-info grammar))))
+ (actions-idx 1))
+ (setf (svref actions 0) :PLACE-HOLDER)
+ (dotimes (i (length zb-rules))
+ (let ((pair (svref zb-rules i)))
+ (let ((zb-rule (cdr pair)))
+ (dolist (prod (zb-rule--productions zb-rule))
+ (let ((action (production-rhs--build-fn prod)))
+ (setf (svref actions actions-idx)
+ (if (symbolp action)
+ (if (or (eq action 'identity) (null action))
+ nil
+ (if (fboundp action)
+ (symbol-function action)
+ (progn
+ (warn "At parse time, ~S should be defined."
+ action)
+ action)))
+ action
+ ;; (if (fboundp 'compile)
+ ;; (compile nil action)
+ ;; (eval `(function ,action)))
+ ))
+ (incf actions-idx))))))
+ (setf (grammar-zb-rules grammar) zb-rules)
+ actions))
+
+(defun vectorize-vector-of-lists (V &aux alist)
+ (declare (simple-vector V) (dynamic-extent alist))
+ (dotimes (i (length V) V)
+ (let* ((sublist (svref V i))
+ (pair (assoc sublist alist :test #'equal)))
+ (if pair
+ (setf (svref v i) (cdr pair))
+ (let ((subV (list->vector sublist)))
+ (setf (svref v i) subV)
+ (push (cons sublist subV) alist))))))
+
+
+;----------------------------------------------------------------------------;
+; load-from-command-line (for UNIX)
+;----------------------------------
+; Load a compiled grammar from a command line argument:
+; Zebu-Parser ex1.tab
+; Zebu-Parser <comiled-grammar> -l <file to load before grammar>
+; -e "<form to be evaluated>"
+; -quit
+#+LUCID
+(defun load-from-command-line ()
+ (let ((*default-pathname-defaults*
+ (make-pathname :directory
+ (pathname-directory (working-directory))))
+ (help "Zebu-Parser [-zb] <compiled-grammar> [-l <file>]*
+ [-e <form to eval>]* [-quit]"))
+ (handler-case
+ (do* ((i 1 (1+ i))
+ (arg (command-line-argument i) (command-line-argument i))
+ (val (command-line-argument (1+ i))
+ (command-line-argument (1+ i))))
+ ((null arg)
+ (when (= i 1)
+ (progn (warn "~a" help) (quit))))
+ ;;(format t "~%arg: ~s val: ~s" arg val)
+ (cond ((equal arg "-l")
+ (incf i) (load val))
+ ((equal arg "-e")
+ (incf i) (eval (read-from-string val)))
+ ((equal arg "-quit") (quit))
+ ((equal arg "-h")
+ (format t "~%~a" help))
+ ((equal arg "-zb")
+ (incf i) (zebu-load-file val :verbose t))
+ (t (if (probe-file arg)
+ (zebu-load-file arg :verbose t)
+ (progn
+ (warn "Unrecognized argument ~S~%~a" arg help)
+ (quit))))))
+ (error (c)
+ (format t "~&Zebu-Parser failed: ~A~%" c)
+ (quit)))))
+
+;----------------------------------------------------------------------------;
+; zebu-load-top
+;--------------
+; interactive loader invocation
+;
+(defun zebu-load-top ()
+ (format t "~&Enter the name of a Zebu .tab file to load: ")
+ (let ((ifile (read-line t)))
+ (zebu-load-file ifile)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-loader.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-loadgram.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-loadgram.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,778 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-loadgram.l
+; Description: Load a grammar file (type: .zb) so that it can be compiled
+; Author: Joachim H. Laubsch
+; Created: 10-Oct-90
+; Modified: Thu Oct 2 16:31:15 1997 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 26-Jul-94 (Joachim H. Laubsch)
+; Fixed Bug with "." as separator (ambiguous constituent names were made)
+; 12-Mar-93 (Joachim H. Laubsch)
+; Bind a Kleene* Variable
+; 9-Mar-93 (Joachim H. Laubsch)
+; allow a print-function specification in a domain definition rule
+; 8-Feb-93 (Joachim H. Laubsch)
+; allow defstruct forms for domain definition among the rules
+; 31-Jul-92 (Joachim H. Laubsch)
+; Introduced Kleene * and +
+; 24-Apr-92 (Joachim H. Laubsch)
+; Introduced a meta-grammar for reading a user grammar
+; The meta-grammar is compiled using the null-grammar
+; 25-Mar-92 (Joachim H. Laubsch)
+; Warn about unused non-terminals
+; 16-Jul-91 (Joachim H. Laubsch)
+; to deal with multiple-grammars, first find in a grammar file: *GRAMMAR-OPTIONS*
+; a keyworded arglist that can be passed to MAKE-GRAMMAR
+; 20-Mar-91 (Joachim H. Laubsch)
+; Introduced error checking during loading of grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+(IN-PACKAGE "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar *Kleene+-rules* ()
+ "A list of rules that are generated as a consequence of the Kleene notation")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Read in a File Containing a Grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; RULES
+;;; About the representations of grammars in files:
+;;; non terminals are represented by lisp symbols,
+;;; terminals by symbols (IDENTIFIER NUMBER STRING), or strings
+;;; for example then BNF rule:
+;;; A ::= B | C | "foo" | "c" | <the-empty-string>
+;;;
+;;; would be encoded -- using the NULL Grammar -- as:
+
+;;; (defrule A := B
+;;; :build (f1 B)
+;;;
+;;; := C
+;;; :build (f2 C)
+;;;
+;;; := "foo"
+;;; ; ommitting the build clause has the
+;;; := "c" ; effect of calling the identity function
+;;; := () )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Format for a grammar file
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#||
+A grammar file has a filename of type "zb".
+
+The file consists of:
+
+1. A keyword agument-list for MAKE-GRAMMAR.
+ Example:
+ (:name "pc2"
+ :package "CL-USER"
+ :grammar "zebu-mg"
+ :identifier-continue-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+2. If parsing with the NULL-Grammar
+ ( the default, if no :grammar keyword is given in 1.)
+ one or more defrule forms as above
+ If parsing with the META-Grammar
+ one or more rules using the syntax of the Meta-grammar
+ The start symbol of the grammar will be the lhs of the first
+ production encountered.
+
+The symbol AUGMENTED-START is reserved and will automatically appear in
+a production deriving the start symbol.
+The symbol THE-EMPTY-STRING is also reserved.
+
+Use load-grammar to internalize a grammar in the above syntax.
+ *productions* holds a list of all the productions.
+ *lambdas* holds a list of all of the associated lambdas (in reverse order)
+ *non-terminals* holds a list of all the non-terminals.
+Each non-terminal symbol has a list of the productions it
+appears in the left hand side of under its own-productions
+property.
+*g-symbol-alist* holds an alist whose cars are the string or symbol
+ which is read from the grammar, and whose cdrs hold corresponding
+ g-symbol structures; the order is in the reverse sense of *symbol-array*.
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Global variables
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar *symbols*) ; a list of the grammar symbols
+(defvar *symbol-array*) ; indexed by the symbol's index, of g-symbols
+(defvar *productions*)
+(defvar *production-count*)
+(defvar *g-symbol-count*)
+(defvar *g-symbol-alist*)
+(defvar *start-symbol*)
+(defvar *empty-string-g-symbol*)
+(defvar *augmented-start-g-symbol*)
+(defvar *the-end-g-symbol*)
+
+(defvar *grammar-options*)
+
+(declaim (special
+ *identifier-continue-chars*
+ *identifier-start-chars*
+ *null-grammar*
+ *compiler-grammar*
+ *domain-type-hierarchy*
+ *domain-types*
+ *domain-structs*
+ *lex-cats*))
+
+;; new rule format
+(defvar *ignore* '("DUMMY" "DUMMY1" "DUMMY2" "DUMMY3" "DUMMY4"
+ "DUMMY5" "DUMMY6" "DUMMY7" "DUMMY8"))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; macros
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defmacro post-inc (x)
+ `(let ((old ,x))
+ (setq ,x (1+ ,x))
+ old))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Initialisation
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun initialize-grammar ()
+ (setq *symbols* '()
+ *productions* '()
+ *production-count* 0
+ *g-symbol-count* 0
+ *g-symbol-alist* '()
+ *start-symbol* '()
+ *zb-rules* '()
+ *lex-cats* '()
+ *domain-types* '()
+ *domain-structs* '()
+ *domain-type-hierarchy* '()
+ *empty-string-g-symbol* (g-symbol-intern 'the-empty-string)
+ *augmented-start-g-symbol* (g-symbol-intern 'augmented-start)
+ *the-end-g-symbol* (g-symbol-intern 'the-end-g-symbol))
+ )
+
+;----------------------------------------------------------------------------;
+; g-symbol-intern
+;----------------
+; This is sort of like interning. returns a g-symbol.
+; if (equal (string x) (string y)) the g-symbols are eq
+
+(defun g-symbol-intern (string-or-symbol)
+ (check-type string-or-symbol (or string symbol)
+ "a string or symbol, in order to be a well-formed Zebu grammar rule.")
+ (let ((pair (assoc string-or-symbol *g-symbol-alist*
+ :test #'equal)))
+ (if pair
+ (cdr pair)
+ (let ((symbol (new-g-symbol
+ (string string-or-symbol)
+ (post-inc *g-symbol-count*))))
+ (push (cons string-or-symbol symbol) *g-symbol-alist*)
+ (push symbol *symbols*)
+ symbol))))
+
+;;; Do various things, fixing up global data structures and
+;;; fields of grammar symbols. A bit sleazy: *start-symbol* being NIL
+;;; is used to detect the first production.
+
+(defun process-production (lhs rhs &optional internal-use?)
+ (let ((lhs-symbol (g-symbol-intern lhs))
+ ;; intern constituent as a G-SYMBOL
+ (rhs-symbols (mapcar #'g-symbol-intern rhs)))
+ (unless *start-symbol*
+ (setq *start-symbol* lhs-symbol)
+ (format t "~%Start symbols is: ~A~%"
+ (g-symbol-name *start-symbol*))
+ (process-production 'AUGMENTED-START (list lhs) t))
+ (let ((production
+ (make-production :lhs lhs-symbol
+ :rhs rhs-symbols
+ :production-index (post-inc *production-count*)
+ :production-length (length rhs-symbols))))
+ (when (and (eq lhs-symbol *augmented-start-g-symbol*)
+ (not internal-use?))
+ (error "AUGMENTED-START is a reserved grammar symbol"))
+ (push production *productions*)
+ (g-symbol-add-production lhs-symbol production)
+ (let ((rhs-symbol-set (make-oset :order-fn #'g-symbol-order-function)))
+ (dolist (gs rhs-symbols)
+ (oset-insert! gs rhs-symbol-set))
+ (dolist (gs (oset-item-list rhs-symbol-set))
+ (push production (g-symbol-rhs-productions gs)))))))
+
+;----------------------------------------------------------------------------;
+; pre-process-rules
+;------------------
+; Given a function to produce the next rule, process it
+; and warn about:
+; - redefinition of lhs symbol
+; - repeated equal rhs
+; - unused lhs symbols
+; - undefined non-terminals
+; - duplicate constituents
+
+(defun pre-process-rules (next-rule-fn do-semantics? &aux non-terminals)
+ (do ((zb-rule (funcall next-rule-fn) (funcall next-rule-fn)))
+ ((null zb-rule))
+ (let ((lhs (zb-rule--name zb-rule)))
+ (when (assoc lhs *zb-rules*)
+ (warn "Non-terminal ~S is defined again" lhs)
+ ;; (break "Rule: ~S" zb-rule)
+ )
+ (push (cons lhs zb-rule) *zb-rules*)
+ (do ((prods (zb-rule--productions zb-rule) (cdr prods)))
+ ((null prods))
+ (let* ((production-rhs (car prods))
+ (syntax (production-rhs--syntax production-rhs)))
+ (when (member syntax (rest prods)
+ :test #'equal :key #'production-rhs--syntax)
+ (warn "Multiply defined rhs of rule for ~S: ~S" lhs syntax))
+ (when (member "" syntax :test #'equal)
+ (warn "Empty keyword ignored in rhs of ~s:~{ ~s~}" lhs syntax)
+ (setf syntax
+ (setf (production-rhs--syntax production-rhs)
+ (delete "" syntax :test #'equal))))
+ (expand-Kleene-constituent production-rhs)))
+ (do ((prods (zb-rule--productions zb-rule) (cdr prods)))
+ ((null prods))
+ (let* ((production-rhs (car prods))
+ (syntax (production-rhs--syntax production-rhs))
+ syntax1) ; the <NT>.<digit> notation is removed
+ ;; remove the <NT>.<digit> notation from the rhs
+ (do ((rhs-tail syntax (cdr rhs-tail))) ((null rhs-tail))
+ (let ((constituent (car rhs-tail)))
+ (typecase constituent
+ (symbol
+ (when (and (production-rhs--semantics production-rhs)
+ (member constituent (cdr rhs-tail)))
+ (warn "Duplicate constituent in RHS of ~S~% ~S~% Use <NT>.<digit>"
+ lhs syntax))
+ (let ((cname (constituent-name constituent)))
+ (push cname syntax1)
+ (pushnew cname non-terminals)))
+ (T (push constituent syntax1)))))
+ (when do-semantics? (process-semantics production-rhs))
+ (process-production lhs (nreverse syntax1))))))
+ (let* ((lhs-non-terminals (nreverse (mapcar #'car *zb-rules*)))
+ (lexical-categories (mapcar #'(lambda (c)
+ (symbol-name (car c)))
+ *lex-cats*))
+ (rhs-non-terminals
+ (set-difference non-terminals
+ (union *open-categories* lexical-categories)
+ :test #'string-equal :key #'string))
+ (undefined-non-terminals (set-difference rhs-non-terminals
+ lhs-non-terminals))
+ (unused-non-terminals (set-difference (cdr lhs-non-terminals)
+ ;; the start symbol does not
+ ;; have to occur on any rhs
+ rhs-non-terminals))
+ (unused-lex-cats
+ (set-difference lexical-categories non-terminals
+ :test #'string= :key #'string))
+ (overused-lex-cats
+ (intersection lhs-non-terminals lexical-categories
+ :test #'string= :key #'string)))
+ (when undefined-non-terminals
+ (warn "The following non-terminals had no definition:~% ~{~a ~}"
+ undefined-non-terminals))
+ (when unused-non-terminals
+ (warn "The following non-terminals where defined but not used:~% ~{~a ~}"
+ unused-non-terminals))
+ (when unused-lex-cats
+ (warn "The following lexical categories where defined but not used:~% ~{~a ~}"
+ unused-lex-cats))
+ (when overused-lex-cats
+ (warn "The following lexical categories where also defined as non-terminals:~% ~{~a ~}"
+ overused-lex-cats))))
+
+;----------------------------------------------------------------------------;
+; expand-Kleene-constituent
+;--------------------------
+; handle Kleene * and +: adds to *Kleene+-rules*
+;; * case will expand:
+;; (defrule <X>*
+;; ::= ()
+;; ::= <x> <X>*-rest)
+;; (defrule <X>*-rest
+;; ::= ()
+;; ::= <Sep> <x> <X>*-rest)
+;; in case of default seperator " ":
+;; (defrule <X>*
+;; ::= ()
+;; ::= <x> <X>*)
+;; + case will expand:
+;; (defrule <X>+
+;; ::= <x> :build (make-kb-sequence :first <x>)
+;; ::= <x> <Sep> <x>+
+;; :build (make-kb-sequence :first <x> :rest <x>+))
+(defun expand-Kleene-constituent (production-rhs)
+ (flet ((new-kb-seq (pairs)
+ (let ((slots (mapcar
+ #'(lambda (pair)
+ (make-LABEL-VALUE-PAIR
+ :-LABEL (first pair) :-VALUE (second pair)))
+ pairs)))
+ (make-feat-term :-type 'kb-sequence
+ :-slots slots)))
+ (memo (item) (push item *Kleene+-rules*)))
+ (dolist (constituent (production-rhs--syntax production-rhs))
+ (when (Kleene-p constituent)
+ (let* ((Kleene-const (Kleene--constituent constituent))
+ (Kleene-Sep (Kleene--Separator constituent))
+ (Kleene+ (encode-separator Kleene-const
+ (Kleene*-p constituent)
+ Kleene-Sep)))
+ (declare (symbol Kleene+))
+ ;; replace the Kleene-expr by a new non-terminal: Kleene+
+ (setf (production-rhs--syntax production-rhs)
+ (substitute Kleene+ constituent
+ (production-rhs--syntax production-rhs)))
+ (let ((semantics (production-rhs--semantics production-rhs)))
+ (when (and (feat-term-p semantics)
+ (not (default-separator? Kleene-Sep)))
+ (feat-term-substitute
+ Kleene+ (decode-kleene-name Kleene+) semantics)))
+ ;; (break "constituent: ~S" constituent)
+ (unless (find Kleene+ *Kleene+-rules* :key #'zb-rule--name)
+ ;; only if a rule of that name has not been defined yet!
+ (let ((KR-sem (new-kb-seq `((first ,Kleene-const)
+ (rest ,Kleene+)))))
+ (if (Kleene*-p constituent) ; * case
+ (if (default-separator? Kleene-Sep)
+ (memo (make-zb-rule
+ :-name Kleene+
+ :-productions
+ `(,(make-Production-Rhs)
+ ,(make-Production-Rhs
+ :-syntax `(,Kleene-const ,Kleene+)
+ :-semantics KR-sem))))
+ (let ((X*-rest (intern
+ (format nil "Rest-~a"
+ (symbol-name Kleene+)))))
+ (setq KR-sem
+ (new-kb-seq `((first ,Kleene-const)
+ (rest ,X*-rest))))
+ (memo (make-zb-rule
+ :-name Kleene+
+ :-productions
+ `(,(make-Production-Rhs)
+ ,(make-Production-Rhs
+ :-syntax `(,Kleene-const ,X*-rest)
+ :-semantics KR-sem))))
+ (memo (make-zb-rule
+ :-name X*-rest
+ :-productions
+ `(,(make-Production-Rhs)
+ ,(make-Production-Rhs
+ :-syntax
+ `(,Kleene-Sep ,Kleene-const ,X*-rest)
+ :-semantics KR-sem))))))
+ (progn
+ ;; (break "constituent: ~S" constituent)
+ (memo (make-zb-rule
+ :-name Kleene+
+ :-productions
+ `(,(make-Production-Rhs
+ :-syntax (list Kleene-const)
+ :-semantics (new-kb-seq `((first ,Kleene-const))))
+ ,(make-Production-Rhs
+ :-syntax `(,Kleene-const
+ ,@(unless (default-separator? Kleene-Sep)
+ (list Kleene-Sep))
+ ,Kleene+)
+ :-semantics KR-sem)))))))))))
+ ;; (format t "~%*Kleene+-rules*: ~{~s ~}" (mapcar #'ZB-RULE--name *Kleene+-rules*))
+ ))
+
+(defun default-separator? (Kleene-Sep)
+ (member Kleene-Sep '(" " "") :test #'string=))
+
+(defun encode-separator (name k* Sep)
+ ;; k* = true iff Kleene operator is *
+ ;; k* = false iff Kleene operator is +
+ (intern (if (default-separator? Sep)
+ (format nil "~S~:[+~;*~]" name k*)
+ (format nil "~S~:[+~;*~]~A~D$"
+ name
+ k*
+ Sep
+ (length Sep)))))
+
+(defun decode-kleene-name (name)
+ (let* ((s (symbol-name name))
+ (s-length (length s))
+ (n (schar s (- s-length 2)))
+ (sep-length (- (char-int n) (char-int #\0))))
+ (intern (subseq s 0 (- s-length sep-length 2)))))
+
+(defun constituent-name (constituent)
+ ;; constituent:symbol
+ ;; strip off .<N> from constituent symbol, unless it ends in $
+ (let* ((n (symbol-name constituent))
+ (last-char-pos (1- (length n))))
+ (if (char= (schar n last-char-pos) #\$)
+ constituent
+ (let ((p (position-if #'(lambda (c) (char= c #\.)) n
+ :from-end t)))
+ (if (and p
+ (let ((p+1 (1+ p)))
+ (and (= p+1 last-char-pos)
+ (digit-char-p (schar n p+1)))))
+ (intern (subseq n 0 p) (symbol-package constituent))
+ constituent)))))
+
+(defun feat-term-substitute (new old ft)
+ (dolist (slot (feat-term--slots ft))
+ (let ((val (label-value-pair--value slot)))
+ (if (eq val old)
+ (setf (label-value-pair--value slot) new)
+ (when (feat-term-p val)
+ (feat-term-substitute new old val))))))
+
+(defun parse-defrule (rule &aux name)
+ (unless (and (consp rule)
+ (symbolp (car rule))
+ (string= (string (car rule)) "DEFRULE")
+ (consp (cdr rule))
+ (symbolp (setq name (cadr rule))))
+ (error "Illegal rule ~S" rule))
+ (let ((args (cddr rule)) rhs)
+ (flet ((parse-build (&key form type map)
+ (cond ((and (not form) type)
+ (if (symbolp type)
+ (setf form (generate-form type map))
+ (error "Symbol expected as value of :type ~S in ~S"
+ type rhs))))
+ (multiple-value-bind (ll dummies)
+ (make-lambda-list rhs)
+ (setq dummies
+ (nconc dummies
+ (mapcan #'(lambda (l)
+ (unless (member l dummies)
+ (unless (search-list l form)
+ (list l))))
+ ll)))
+ ;; now generate the functions from the actions
+ `(lambda ,ll
+ ,@(when dummies `((declare (ignore .,dummies))))
+ ,form)
+ )))
+ (let ((R (make-zb-rule :-name name)) action rest)
+ (do ((args args rest))
+ ((null args)
+ (setf (zb-rule--productions r) (nreverse (zb-rule--productions r)))
+ R)
+ (let ((key (car args))
+ (val (cadr args)))
+ (setq rest (cddr args))
+ (if (eq key ':=)
+ (progn
+ (setq rhs (if (listp val) val (list val)))
+ (if (and (consp rest) (eq (car rest) ':BUILD))
+ ;; BUILD clause: construct fn and compile it
+ (let ((build-args (cadr rest)))
+ (setq action
+ (if (atom build-args)
+ (if (symbolp build-args)
+ build-args
+ (parse-build :FORM build-args))
+ (if (keywordp (car build-args))
+ (apply #'parse-build build-args)
+ (parse-build :FORM build-args))))
+ (setq rest (cddr rest)))
+ ;; no :BUILD clause, use IDENTITY fn
+ (setq action
+ (if (= (length rhs) 1) 'identity 'identity*))))
+ (error "Keyword expected in rule ~S at .. ~{~S ~}~% Probably no () around rule's rhs"
+ name args))
+ (push (make-production-rhs :-syntax rhs
+ :-build-fn action)
+ (zb-rule--productions r))))))))
+
+(defun cons-avm (Feat-Term)
+ (let ((type (Feat-Term--type Feat-Term)))
+ (cons
+ (intern (concatenate 'string "MAKE-"
+ (symbol-name type))
+ (symbol-package type))
+ (mapcan
+ #'(lambda (lvp)
+ (declare (type Label-value-pair lvp))
+ (let ((slot (Label-value-pair--label lvp))
+ (val (Label-value-pair--value lvp)))
+ (list (intern (string slot) *keyword-package*)
+ (if (Feat-Term-p val)
+ (cons-avm val)
+ val))))
+ (Feat-Term--slots Feat-Term)))))
+
+(defun process-semantics (production-rhs)
+ (let ((Syntax (production-rhs--syntax production-rhs))
+ (Feat-Term (production-rhs--semantics production-rhs)))
+ (flet ((msg ()
+ (format nil "The Semantics ~S of the rule RHS:~% ~A~%"
+ Feat-Term
+ (with-output-to-string (s)
+ (print-production-rhs production-rhs s nil)))))
+ (flet ((cons-lambda (ft?)
+ (multiple-value-bind (ll dummies)
+ (make-lambda-list Syntax)
+ `(lambda ,ll
+ ,@(when dummies `((declare (ignore .,dummies))))
+ ,(if ft? (cons-avm Feat-Term) Feat-Term)))))
+ (setf (production-rhs--build-fn production-rhs)
+ (typecase Feat-Term
+ (NULL (if (= 1 (length syntax))
+ 'identity
+ 'identity*))
+ ((or number string)
+ `(lambda (&rest args) (declare (ignore args))
+ ,Feat-Term))
+ (symbol
+ (if (member Feat-Term Syntax)
+ (cons-lambda nil)
+ (error "~A is a variable that does not occur in the RHS!"
+ (msg))))
+ (Feat-Term (cons-lambda t))
+ (T (error "~A should be a feature term, number, string or constituent!" (msg)))))))))
+
+
+;----------------------------------------------------------------------------;
+; generate-form
+;--------------
+;
+;
+(defun generate-form (type map)
+ `(,(intern (concatenate 'string "MAKE-" (symbol-name type))
+ (symbol-package type))
+ ,@(mapcan
+ #'(lambda (pair)
+ (unless (consp pair)
+ (error "Element of :map must be a dotted pair in ~S"
+ map))
+ (let ((constituent (car pair))
+ (slot (cdr pair)))
+ (unless (symbolp constituent)
+ (error "Symbol expected in map ~S at ~S"
+ map constituent))
+ (unless (keywordp slot)
+ (error "Keyword expected in map ~S at ~S"
+ map slot))
+ (list slot constituent)))
+ map)))
+
+(defvar *dummy-count* 0)
+
+(defun next-dummy ()
+ (let* ((root "DUMMY")
+ (dummy (intern (if (zerop *dummy-count*)
+ root
+ (format nil "DUMMY~S" *dummy-count*)))))
+ (incf *dummy-count*)
+ dummy))
+
+(defun make-lambda-list (constituents)
+ (let ((*dummy-count* 0) dummies)
+ (values (mapcar #'(lambda (constituent)
+ (if (symbolp constituent)
+ constituent
+ (let ((d (next-dummy)))
+ (push d dummies)
+ d)))
+ constituents)
+ dummies)))
+
+;; search the list for atom and return T if atom occurs anywhere
+;; this is overly cautious and should be replaced by a tree-walker
+;; but it will only cause some warnings of the compiler.
+(defun search-list (atom tree)
+ (if (atom tree)
+ (eq atom tree)
+ (when (consp tree)
+ (dolist (n tree)
+ (when (search-list atom n) (return t))))))
+
+
+#||
+(apply #'parse-build '( "(" Formula ")" ) '(:form (progn Formula)))
+(apply #'parse-build '(Identifier) '(:type Propositional-variable
+ :map ((Identifier . :-name))))
+(apply #'parse-build '(Formula.1 "and" Formula.2)
+ '(:type Boolean-And
+ :map ((Formula.1 . :-rand1)
+ (Formula.2 . :-rand2))))
+||#
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Top level load function
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; LOAD-GRAMMAR loads a Zebu source grammar and prepares it for
+;;; compilation
+;;; Internalize a grammar in the lisp syntax described above.
+;;; Set up data structures as described above.
+;;; Every grammar interns the empty string as a grammar symbol
+;;; Generate the hierarchy, if a :domain is specified
+;;; and if *generate-domain* is true.
+
+(defun get-grammar-options-key (name)
+ (do ((options *grammar-options* (cddr options)))
+ ((null options) nil)
+ (when (eq (car options) name) (RETURN (cadr options)))))
+
+(defun load-grammar (filename &key (verbose T)
+ &aux (g-file (probe-file filename)))
+ (unless g-file
+ (error "grammar file not found: ~S" filename))
+ (format t "~%Reading grammar from ~A~%" filename)
+ (initialize-grammar)
+ ;; read first form (possibly twice -- in the right package)
+ (let ((grammar-stream (open g-file :direction :input)))
+ (unwind-protect
+ (progn
+ (setq *grammar-options*
+ (catch 'read-grammar-options
+ (check-grammar-options
+ (read grammar-stream) g-file t)))
+ (unless *grammar-options*
+ (close grammar-stream)
+ (setq grammar-stream (open g-file :direction :input))
+ (setq *grammar-options*
+ (catch 'read-grammar-options
+ (check-grammar-options
+ (read grammar-stream) g-file t))))
+ (setq *lex-cats* (get-grammar-options-key ':lex-cats))
+ (if (eq *compiler-grammar* *NULL-Grammar*)
+ (let ((eof (list nil)))
+ (pre-process-rules
+ #'(lambda ()
+ (loop (let ((rule (read grammar-stream nil eof)))
+ (when verbose (print rule))
+ (if (consp rule)
+ (if (eq rule eof)
+ (return nil)
+ (if (eq (car rule) 'defstruct)
+ (push rule *domain-structs*)
+ (return (parse-defrule rule))))
+ (warn "In file ~a~% illegal rule ~s ignored!"
+ g-file rule)))))
+ nil))
+ (let (*preserve-case*
+ *Kleene+-rules*
+ (ff (file-parser-aux
+ grammar-stream #'error t *compiler-grammar*
+ verbose)))
+ (pre-process-rules
+ #'(lambda ()
+ (loop
+ (let ((f (or (pop ff) (pop *Kleene+-rules*))))
+ (if (null f)
+ (return nil)
+ (if (zb-rule-p f)
+ (return f)
+ (push f *domain-types*))))))
+ t))))
+ (close grammar-stream)))
+ (format t "~%~S productions, ~S symbols~%"
+ *production-count* *g-symbol-count*)
+ (setq *symbol-array* (list->vector (reverse *symbols*)))
+ (unless *start-symbol* (error "No start symbol"))
+ g-file)
+
+;;;------------------------------------------------------------------------;
+;; dump-domain-file
+;;;------------------------------------------------------------------------;
+;; generate code for domain, printers, and regular expressions
+;; dump it onto the domain-file
+;; it may be the case that none of the above are necessary, in which
+;; case no domain-file is generated
+;; the domain-file is specified as:
+;; name: from grammar-option :DOMAIN-FILE
+;; type: the first element of *load-source-pathname-types*
+;; directory: same as grammar-file
+;; if not directory in grammar-file from
+;; *default-pathname-defaults*
+;; if such a file exists already, a warning is given and the old file
+;; is renamed.
+
+(defun dump-domain-file (grammar-file verbose)
+ (let* ((domain-file
+ (merge-pathnames
+ (or (get-grammar-options-key ':DOMAIN-FILE)
+ (make-pathname
+ :name (format nil "~A-domain"
+ (get-grammar-options-key ':NAME))))
+ (merge-pathnames
+ (merge-pathnames (make-pathname
+ :type (first *load-source-pathname-types*))
+ grammar-file)
+ *default-pathname-defaults*)))
+ (*print-array* t) ; bit-vectors of regex code
+ *print-level* *print-length* *print-circle*
+ written?)
+ #-MCL (when (probe-file domain-file)
+ (warn "Renaming existing domain file ~a" domain-file))
+ (with-open-file (port domain-file
+ :if-does-not-exist :create
+ :if-exists #-MCL :rename #+MCL :supersede
+ :direction :output)
+ (format port ";;; This file was generated by Zebu (Version ~a)~%~%(IN-PACKAGE ~S)~%(REQUIRE \"zebu-package\")~%(USE-PACKAGE \"ZEBU\")~%"
+ zb:*zebu-version* (package-name *package*))
+
+ (when *generate-domain*
+ (format t "~%Generating domain source code onto file: ~a"
+ domain-file)
+ (setq written? (generate-domain-file domain-file port)))
+
+ ;; Write actions onto domain file
+ (when verbose
+ (format t "~%Writing actions of rules to ~a" domain-file)
+ (terpri port))
+ (dolist (r *zb-rules*)
+ (let ((non-terminal (car r)))
+ (when verbose (format t "~%Rule ~S" non-terminal))
+ (dolist (production (zb-rule--productions (cdr r)))
+ (let ((fn (production-rhs--build-fn production)))
+ (when (consp fn)
+ (let ((fn-name (gentemp (symbol-name non-terminal))))
+ (when verbose (format t " Action: ~S" fn-name))
+ (setf (production-rhs--build-fn production) fn-name)
+ (pprint `(defun ,fn-name . ,(cdr fn)) port)
+ (terpri port)
+ (setq written? t)))))))
+ (terpri port)
+ ;; for lexical categories: compile the rx-token parsers!
+ (when *lex-cats*
+ (pprint '(eval-when (compile)
+ (unless (member "zebu-regex" *modules* :test #'equal)
+ (WARN "Load the Zebu Compiler!")))
+ port)
+ (pprint '(declaim (special *REGEX-GROUPS* *REGEX-GROUPINGS*))
+ port)
+ (dolist (lex-cat *lex-cats*)
+ (pprint (def-regex-parser (car lex-cat) (cadr lex-cat))
+ port)
+ (terpri port))
+ (setq written? t))
+ (when written?
+ (nconc *grammar-options* (list ':DOMAIN-FILE
+ (namestring domain-file)))
+ domain-file))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-loadgram.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-lr0-sets.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-lr0-sets.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,197 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-lr0-sets.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Fri Apr 23 10:00:40 1993 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+
+;;; This defines the representation for sets of items, and
+;;; computes the canonical lr(0) collection of sets of items.
+;;; It currently leaves the closures lying around on the sets
+;;; of items, they could be flushed just after they are used.
+;;; It gets hold of the grammar via the symbol 'augmented start
+;;; and the application of g-symbol-own-productions to symbols.
+;;; The grammar should have been previously internalized
+;;; using load-grammar.
+
+(in-package "ZEBU")
+
+(defvar *lr0-item-set-count*)
+(defvar *lr0-item-sets*)
+(defvar *lr0-start-state-index*)
+(declaim (fixnum *lr0-start-state-index*))
+
+;;; A type for sets of items.
+;;; The kernel will be a o-set of items, the closure might be
+;;; an o-set, or might be null if we are trying to save space.
+;;; goto-map will be a oset of pairs whose cars are grammar symbols
+;;; and whose cdrs are item-sets.
+
+(defstruct (item-set (:print-function
+ (lambda (item-set stream depth)
+ (declare (ignore depth))
+ (item-set-print-kernel item-set nil stream))))
+ index
+ kernel
+ (closure ())
+ goto-map)
+
+(defun item-set-print-kernel (item-set closure-too? &optional (stream t))
+ (oset-for-each
+ #'(lambda (item)
+ (item-print item stream) (terpri stream))
+ (if closure-too?
+ (item-set-get-closure! item-set)
+ (item-set-kernel item-set))))
+
+(declaim (inline goto-map-order-function item-set-order-function
+ new-item-set))
+
+(defun goto-map-order-function (a b)
+ (g-symbol-order-function (car (the cons a)) (car (the cons b))))
+
+(defun new-item-set (kernel)
+ (make-item-set :kernel kernel
+ :goto-map (make-oset
+ :order-fn #'goto-map-order-function)))
+
+
+;;; Item sets can be identified by looking at their kernels, so:
+(defun item-set-order-function (a b)
+ (declare (type item-set a b))
+ ;; (oset-order-function (item-set-kernel a) (item-set-kernel b))
+ ;; expand call for efficiency
+ (let* ((oset-a (item-set-kernel a))
+ (oset-b (item-set-kernel b))
+ (odf (oset-order-fn oset-a)))
+ (labels ((oset-order-aux (ilista ilistb)
+ (if (null ilista)
+ 'equal
+ (let ((item-order
+ (funcall odf
+ (car (the cons ilista))
+ (car (the cons ilistb)))))
+ (if (eq 'equal item-order)
+ (oset-order-aux
+ (cdr (the cons ilista)) (cdr (the cons ilistb)))
+ item-order)))))
+ (if (eq odf (oset-order-fn oset-b))
+ (let ((a-card (oset-cardinality oset-a))
+ (b-card (oset-cardinality oset-b)))
+ (declare (fixnum a-card b-card))
+ (if (< a-card b-card)
+ 'correct-order
+ (if (= a-card b-card)
+ ;; same cardinality, same type, so march down the lists...
+ (oset-order-aux (oset-item-list oset-a)
+ (oset-item-list oset-b))
+ 'wrong-order)))
+ (error "incompatible types of sets: oset-order-function")))))
+
+;;; Result is an oset of item-sets which comprise the canonical
+;;; lr(0) sets of items.
+
+(defun make-lr0-collection ()
+ (let* ((lr0-set (make-oset :order-fn #'item-set-order-function))
+ (start-prod (car (g-symbol-own-productions
+ *augmented-start-g-symbol*)))
+ (initial-kernel
+ (make-oset
+ :item-list (list (new-item start-prod))
+ :order-fn #'item-order-function
+ :cardinality 1)))
+ (let ((initial-state (new-item-set initial-kernel)))
+ (lr0-insert-item-set! initial-state lr0-set)
+ (setf *lr0-item-set-count* 0)
+ (dolist (is (oset-item-list lr0-set))
+ (setf (item-set-index is) (post-inc *lr0-item-set-count*)))
+ (setf *lr0-start-state-index* (item-set-index initial-state))
+ (format t "~S item sets~%" *lr0-item-set-count*)
+ (setf *lr0-item-sets* lr0-set)
+ '())))
+
+;----------------------------------------------------------------------------;
+; lr0-insert-item-set!
+;---------------------
+; item-set should be of that type.
+; Collection should be an o-set of item-sets.
+; Returns a pointer to the item set in the collection.
+
+(defun lr0-insert-item-set! (item-set collection)
+ (multiple-value-bind (inserted? the-item)
+ (oset-insert-2! item-set collection)
+ (when inserted? ; item wasn't already there
+ (let ((item-set-goto-map (item-set-goto-map item-set)))
+ (princ ".")
+ (dolist (subset (oset-select-subsets
+ (item-set-get-closure! item-set)
+ #'symbol-after-dot))
+ (declare (type oset subset))
+ ;; (assert (typep subset 'oset))
+ ;; subset is an oset of items with same after dot
+ (let ((subset-item-list (oset-item-list subset)))
+ (when subset-item-list
+ (let ((goto-set (make-oset :order-fn #'item-order-function)))
+ (dolist (item subset-item-list)
+ (let ((next (advance-dot item)))
+ (if next (oset-insert! next goto-set))))
+ (unless (oset-empty? goto-set)
+ (oset-insert!
+ (cons (symbol-after-dot (car subset-item-list))
+ (lr0-insert-item-set! (new-item-set goto-set)
+ collection))
+ item-set-goto-map))))))))
+ the-item))
+
+;;; Returns the oset of items which is the closure of the item
+;;; set, calculating it if need be from the kernel.
+;;; Caches the closure in the closure slot.
+(defun item-set-get-closure! (item-set)
+ (or (item-set-closure item-set)
+ (setf (item-set-closure item-set) (closure (item-set-kernel item-set)))))
+
+
+;;; This isn't used in the current implementation: Sep 13, 1989.
+#||
+(defun item-set-flush-closure (item-set)
+ (setf (item-set-closure item-set) '()))
+
+;; inline expanded in lr0-insert-item-set!
+;;; Subset is an oset of items which all have the same after dot symbol.
+;;; Result is an oset of items.
+;;; Gives back an empty set if the dots are all the way to the right
+;;; in the input set.
+
+(defun goto (subset)
+ (let ((result (make-oset :order-fn #'item-order-function)))
+ (dolist (item (oset-item-list subset) result)
+ (let ((next (advance-dot item)))
+ (if next (oset-insert! next result))))))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+#||
+(load-grammar "ex1.zb")
+(make-lr0-collection)
+(print-collection nil)
+(print-collection t)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-lr0-sets.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-mg-hierarchy.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-mg-hierarchy.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,176 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-mg-hierarchy.lisp
+; Description: types and printers for the meta grammar
+; Author: Joachim H. Laubsch
+; Created: 13-May-92
+; Modified: Thu Dec 21 11:50:12 1995 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(require "zebu-aux")
+(provide "zebu-mg-hierarchy")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Top of hierarchy for ZEBU META-Grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(DEFSTRUCT (ZEBU-MG (:INCLUDE KB-DOMAIN)
+ (:CONSTRUCTOR NIL)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; KB-SEQUENCE
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar *kb-sequence-separator* " "
+ "A string, separating the elements of a KB-sequence")
+
+(defstruct (KB-SEQUENCE (:include ZEBU-MG)
+ (:print-function KB-SEQUENCE-print))
+ first
+ (rest nil :type (or NULL KB-SEQUENCE)))
+
+(defun KB-SEQUENCE-print (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (if (KB-SEQUENCE-p ITEM)
+ (let ((first (KB-SEQUENCE-first ITEM))
+ (rest (KB-SEQUENCE-rest ITEM)))
+ (if (null rest)
+ (format STREAM "~a" first)
+ (if (kb-sequence-p rest)
+ (format STREAM "~a~:{~A~a~}"
+ first
+ (labels ((cons-kb-seq (seq)
+ (if (null seq)
+ nil
+ (cons (list *kb-sequence-separator*
+ (KB-SEQUENCE-first seq))
+ (cons-kb-seq
+ (KB-SEQUENCE-rest seq))))))
+ (cons-kb-seq rest)))
+ (format STREAM "~a~A~a" first *kb-sequence-separator* rest))))
+ ""))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; FEAT-TERM
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(DEFSTRUCT (FEAT-TERM (:INCLUDE Zebu-mg)
+ #||
+ (:print-function
+ (lambda (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~@[type: ~S ~][~{~S~^ ~}]"
+ (FEAT-TERM--type ITEM)
+ (FEAT-TERM--slots ITEM))))
+ ||#
+ )
+ -TYPE
+ (-SLOTS nil))
+
+(DEFSTRUCT (LABEL-VALUE-PAIR (:INCLUDE ZEBU-MG)
+ #||
+ (:print-function
+ (lambda (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "(~S ~S)"
+ (Label-value-pair--label ITEM)
+ (Label-value-pair--value ITEM))))
+ ||#
+ )
+ -LABEL
+ (-VALUE nil))
+
+#|| Not used yet
+(DEFSTRUCT (GENERAL-VAR (:INCLUDE ZEBU-MG)
+ #||
+ (:print-function
+ (lambda (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "%~S"
+ (General-Var--name ITEM))))
+ ||#
+ )
+ -NAME)
+
+(DEFSTRUCT (TAGGED-TERM (:INCLUDE ZEBU-MG)
+ #||
+ (:print-function
+ (lambda (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~S=~S"
+ (Tagged-Term--tag ITEM)
+ (Tagged-Term--term ITEM))))
+ ||#
+ )
+ -TERM
+ -TAG)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; PRODUCTION-RHS
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(DEFSTRUCT (PRODUCTION-RHS (:INCLUDE ZEBU-MG)
+ #||
+ (:print-function print-production-rhs)
+ ||#
+ )
+ (-SYNTAX nil)
+ (-SEMANTICS nil)
+ -BUILD-FN)
+
+(defun print-production-rhs (ITEM STREAM LEVEL)
+ (DECLARE (IGNORE LEVEL))
+ (format STREAM
+ "~{~S ~}~@[ { ~S }~];"
+ (production-rhs--syntax ITEM)
+ (production-rhs--semantics ITEM)))
+
+(DEFSTRUCT (Kleene (:INCLUDE ZEBU-MG) )
+ -constituent
+ -separator)
+
+(DEFSTRUCT (Kleene* (:INCLUDE Kleene) ))
+(DEFSTRUCT (Kleene+ (:INCLUDE Kleene) ))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Type definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct (domain-type (:include zebu-mg))
+ -supertype -type -slots print-function)
+
+(defun cons-domain-type (name avm print-function)
+ ;; Return: [supertype type slots print-function]
+ (let ((type (if (feat-term-p avm)
+ (feat-term--type avm)
+ 'KB-Domain))
+ (slots (if (feat-term-p avm)
+ (feat-term--slots avm)
+ avm)))
+ (make-domain-type
+ :-supertype type
+ :-type name
+ :-slots (mapcar #'(lambda (slot)
+ (let ((v (label-value-pair--value slot)))
+ (if (null v)
+ (label-value-pair--label slot)
+ (list (label-value-pair--label slot) v))))
+ slots)
+ :print-function print-function)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-mg-hierarchy.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-mg.tab
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-mg.tab Wed Oct 17 09:04:46 2007
@@ -0,0 +1,146 @@
+
+(:FILE "/home/rudi/lisp/zebu-3.5.5/zebu-mg.zb" :NAME "zebu-mg" :DOMAIN-FILE "zmg-dom" :PACKAGE "ZEBU" :GRAMMAR "null-grammar" :IDENTIFIER-START-CHARS "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" :IDENTIFIER-CONTINUE-CHARS "$-_.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" :DOMAIN-FILE "/home/rudi/lisp/zebu-3.5.5/zmg-dom.lisp")
+#37(THE-EMPTY-STRING AUGMENTED-START THE-END-G-SYMBOL META-GRAMMAR DEF-TYPE ZB-RULE IDENTIFIER ":=" TYPED-CONJ PRINT-FUNCTION ";" CONJ "<<" "print-function:" ">>" ":" "[" LABEL-VALUE-PAIRS "]" FEAT-TERM NUMBER STRING "*" "+" LABEL-VALUE-PAIR "(" ")" NON-TERMINAL "-->" RHS RHS1 MORE-RHS CONSTITUENT-LIST "{" "}" CONSTITUENT "|" )
+
+
+#19(6 7 10 12 13 14 15 16 18 20 21 22 23 25 26 28 33 34 36 )
+
+#34((1 . 1)(3 . 1)(3 . 1)(4 . 5)(4 . 5)(9 . 0)(9 . 4)(8 . 3)(11 . 3)(19 . 1)(19 . 1)(19 . 1)(19 . 2)(19 . 2)(19 . 1)(19 . 1)(24 . 4)(24 . 3)(17 . 0)(17 . 2)(5 . 4)(27 . 1)(29 . 0)(29 . 2)(30 . 1)(30 . 4)(32 . 2)(32 . 0)(35 . 1)(35 . 3)(35 . 3)(35 . 1)(31 . 0)(31 . 3))
+
+#57(
+((6 :S 54))
+((2 :A 0))
+((2 :R 1))
+((2 :R 2))
+((10 :R 5) (12 :S 10))
+((10 :S 6))
+((2 :R 3))
+((10 :R 5) (12 :S 10))
+((10 :S 9))
+((2 :R 4))
+((13 :S 11))
+((6 :S 12))
+((14 :S 13))
+((10 :R 6))
+((15 :S 15))
+((16 :S 17))
+((10 :R 7) (12 :R 7) (26 :R 7) (34 :R 7))
+((18 :R 18) (25 :S 51))
+((18 :S 19))
+((10 :R 8) (12 :R 8) (26 :R 8) (34 :R 8))
+((26 :R 10) (34 :R 10))
+((26 :R 11) (34 :R 11))
+((26 :R 12) (34 :R 12))
+((26 :R 13) (34 :R 13))
+((26 :R 14) (34 :R 14))
+((26 :R 15) (34 :R 15))
+((26 :S 27))
+((18 :R 16) (25 :R 16))
+((18 :R 17) (25 :R 17))
+((18 :R 18) (25 :S 51))
+((18 :R 19))
+((28 :S 32))
+((6 :S 55) (10 :R 22) (21 :S 46) (33 :R 27) (36 :R 27))
+((10 :S 34))
+((2 :R 20))
+((10 :R 32) (36 :S 47))
+((10 :R 23))
+((6 :S 56) (16 :S 17) (20 :S 20) (21 :S 21))
+((34 :S 39))
+((10 :R 25) (36 :R 25))
+((6 :S 55) (10 :R 27) (21 :S 46) (33 :R 27) (36 :R 27))
+((10 :R 26) (33 :R 26) (36 :R 26))
+((21 :S 43))
+((6 :R 29) (10 :R 29) (21 :R 29) (33 :R 29) (36 :R 29))
+((21 :S 45))
+((6 :R 30) (10 :R 30) (21 :R 30) (33 :R 30) (36 :R 30))
+((6 :R 31) (10 :R 31) (21 :R 31) (33 :R 31) (36 :R 31))
+((6 :S 55) (10 :R 27) (21 :S 46) (33 :R 27) (36 :R 27))
+((10 :R 32) (36 :S 47))
+((10 :R 33))
+((6 :S 14) (16 :S 17))
+((6 :S 52))
+((6 :S 56) (16 :S 17) (20 :S 20) (21 :S 21) (26 :S 28))
+((10 :R 24) (33 :S 37) (36 :R 24))
+((7 :S 50) (28 :R 21))
+((6 :R 28) (10 :R 28) (21 :R 28) (22 :S 42) (23 :S 44) (33 :R 28) (36 :R 28))
+((15 :S 15) (22 :S 22) (23 :S 23) (26 :R 9) (34 :R 9)))
+
+#57(
+((3 . 1)(4 . 2)(5 . 3)(27 . 31))
+()
+()
+()
+((9 . 5))
+()
+()
+((9 . 8))
+()
+()
+()
+()
+()
+()
+()
+((11 . 16))
+()
+((17 . 18)(24 . 29))
+()
+()
+()
+()
+()
+()
+()
+()
+()
+()
+()
+((17 . 30)(24 . 29))
+()
+()
+((29 . 33)(30 . 35)(32 . 53)(35 . 40))
+()
+()
+((31 . 36))
+()
+((8 . 24)(11 . 25)(19 . 38))
+()
+()
+((32 . 41)(35 . 40))
+()
+()
+()
+()
+()
+()
+((30 . 48)(32 . 53)(35 . 40))
+((31 . 49))
+()
+((8 . 4)(11 . 7))
+()
+((8 . 24)(11 . 25)(19 . 26))
+()
+()
+()
+())
+0
+
+2
+
+#15((META-GRAMMAR . #S(ZB-RULE :-NAME META-GRAMMAR :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (DEF-TYPE) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (ZB-RULE) :-SEMANTICS NIL :-BUILD-FN IDENTITY))))
+(DEF-TYPE . #S(ZB-RULE :-NAME DEF-TYPE :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER ":=" TYPED-CONJ PRINT-FUNCTION ";") :-SEMANTICS NIL :-BUILD-FN DEF-TYPE16) #S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER ":=" CONJ PRINT-FUNCTION ";") :-SEMANTICS NIL :-BUILD-FN DEF-TYPE17))))
+(PRINT-FUNCTION . #S(ZB-RULE :-NAME PRINT-FUNCTION :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX NIL :-SEMANTICS NIL :-BUILD-FN IDENTITY*) #S(PRODUCTION-RHS :-SYNTAX ("<<" "print-function:" IDENTIFIER ">>") :-SEMANTICS NIL :-BUILD-FN PRINT-FUNCTION15))))
+(TYPED-CONJ . #S(ZB-RULE :-NAME TYPED-CONJ :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER ":" CONJ) :-SEMANTICS NIL :-BUILD-FN TYPED-CONJ14))))
+(CONJ . #S(ZB-RULE :-NAME CONJ :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX ("[" LABEL-VALUE-PAIRS "]") :-SEMANTICS NIL :-BUILD-FN CONJ13))))
+(FEAT-TERM . #S(ZB-RULE :-NAME FEAT-TERM :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (NUMBER) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (STRING) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER "*") :-SEMANTICS NIL :-BUILD-FN FEAT-TERM10) #S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER "+") :-SEMANTICS NIL :-BUILD-FN FEAT-TERM11) #S(PRODUCTION-RHS :-SYNTAX (TYPED-CONJ) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (CONJ) :-SEMANTICS NIL :-BUILD-FN FEAT-TERM12))))
+(LABEL-VALUE-PAIR . #S(ZB-RULE :-NAME LABEL-VALUE-PAIR :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX ("(" IDENTIFIER FEAT-TERM ")") :-SEMANTICS NIL :-BUILD-FN LABEL-VALUE-PAIR8) #S(PRODUCTION-RHS :-SYNTAX ("(" IDENTIFIER ")") :-SEMANTICS NIL :-BUILD-FN LABEL-VALUE-PAIR9))))
+(LABEL-VALUE-PAIRS . #S(ZB-RULE :-NAME LABEL-VALUE-PAIRS :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX NIL :-SEMANTICS NIL :-BUILD-FN IDENTITY*) #S(PRODUCTION-RHS :-SYNTAX (LABEL-VALUE-PAIR LABEL-VALUE-PAIRS) :-SEMANTICS NIL :-BUILD-FN CONS))))
+(ZB-RULE . #S(ZB-RULE :-NAME ZB-RULE :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (NON-TERMINAL "-->" RHS ";") :-SEMANTICS NIL :-BUILD-FN ZB-RULE7))))
+(NON-TERMINAL . #S(ZB-RULE :-NAME NON-TERMINAL :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER) :-SEMANTICS NIL :-BUILD-FN IDENTITY))))
+(RHS . #S(ZB-RULE :-NAME RHS :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX NIL :-SEMANTICS NIL :-BUILD-FN IDENTITY*) #S(PRODUCTION-RHS :-SYNTAX (RHS1 MORE-RHS) :-SEMANTICS NIL :-BUILD-FN CONS))))
+(RHS1 . #S(ZB-RULE :-NAME RHS1 :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (CONSTITUENT-LIST) :-SEMANTICS NIL :-BUILD-FN RHS15) #S(PRODUCTION-RHS :-SYNTAX (CONSTITUENT-LIST "{" FEAT-TERM "}") :-SEMANTICS NIL :-BUILD-FN RHS16))))
+(CONSTITUENT-LIST . #S(ZB-RULE :-NAME CONSTITUENT-LIST :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (CONSTITUENT CONSTITUENT-LIST) :-SEMANTICS NIL :-BUILD-FN CONS) #S(PRODUCTION-RHS :-SYNTAX NIL :-SEMANTICS NIL :-BUILD-FN IDENTITY*))))
+(CONSTITUENT . #S(ZB-RULE :-NAME CONSTITUENT :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER) :-SEMANTICS NIL :-BUILD-FN IDENTITY) #S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER "*" STRING) :-SEMANTICS NIL :-BUILD-FN CONSTITUENT3) #S(PRODUCTION-RHS :-SYNTAX (IDENTIFIER "+" STRING) :-SEMANTICS NIL :-BUILD-FN CONSTITUENT4) #S(PRODUCTION-RHS :-SYNTAX (STRING) :-SEMANTICS NIL :-BUILD-FN IDENTITY))))
+(MORE-RHS . #S(ZB-RULE :-NAME MORE-RHS :-PRODUCTIONS (#S(PRODUCTION-RHS :-SYNTAX NIL :-SEMANTICS NIL :-BUILD-FN IDENTITY*) #S(PRODUCTION-RHS :-SYNTAX ("|" RHS1 MORE-RHS) :-SEMANTICS NIL :-BUILD-FN MORE-RHS1))))
+)
\ No newline at end of file
Added: vendor/zebu/zebu-mg.zb
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-mg.zb Wed Oct 17 09:04:46 2007
@@ -0,0 +1,155 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: zebu-mg.zb
+; Description: Metagrammar for Zebu
+; Author: Joachim H. Laubsch
+; Created: 13-Apr-92
+; Modified: Thu Dec 21 16:26:28 1995 (Joachim H. Laubsch)
+; Language: Lisp
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 10-Mar-93 (Joachim H. Laubsch)
+; add domain definition
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(:name "zebu-mg"
+ :domain-file "zmg-dom"
+ :package "ZEBU"
+ :grammar "null-grammar"
+ :identifier-start-chars
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ :identifier-continue-chars
+ "$-_.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ )
+
+(defrule Meta-Grammar
+ := Def-Type
+ := zb-rule)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Domain Definition
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defrule Def-Type
+ := ( Identifier ":=" Typed-Conj Print-function ";" )
+ :build (cons-domain-type Identifier Typed-Conj Print-function)
+
+ := ( Identifier ":=" Conj Print-function ";")
+ :build (cons-domain-type Identifier Conj Print-function)
+ )
+
+(defrule Print-function
+ := ()
+
+ := ("<<" "print-function:" Identifier ">>")
+ :build (:form Identifier))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; AVM grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defrule Typed-Conj
+ := ( Identifier ":" Conj )
+ :build (:type Feat-Term
+ :map ((Conj . :-slots)
+ (Identifier . :-type))))
+
+(defrule Conj
+ := ( "[" Label-value-pairs "]" )
+ :build (:form Label-value-pairs))
+
+(defrule Feat-Term
+ := Identifier
+ := Number
+ := String
+
+ := (Identifier "*")
+ :build (intern (concatenate 'string (string Identifier) "*"))
+
+ := (Identifier "+")
+ :build (intern (concatenate 'string (string Identifier) "+"))
+
+ := Typed-Conj
+
+ := Conj
+ :build (:type Feat-Term
+ :map ((Conj . :-slots)))
+ )
+
+(defrule Label-value-pair
+ := ( "(" Identifier Feat-Term ")" )
+ :build (:type Label-value-pair
+ :map ((Identifier . :-label)
+ (Feat-Term . :-value)))
+
+ := ( "(" Identifier ")" )
+ :build (:type Label-value-pair
+ :map ((Identifier . :-label)))
+ )
+
+(defrule Label-value-pairs
+ := ()
+
+ := ( Label-value-pair Label-value-pairs )
+ :build cons
+ )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Grammar Rules
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defrule zb-rule
+ := ( Non-terminal "-->" Rhs ";")
+ :build (:type zb-rule
+ :map ((Non-terminal . :-name)
+ (Rhs . :-productions))))
+
+(defrule Non-terminal := Identifier)
+
+(defrule Rhs
+ := ()
+
+ := ( Rhs1 More-Rhs )
+ :build cons
+ )
+
+(defrule Rhs1
+ := ( Constituent-list )
+ :build (:type Production-Rhs
+ :map ((Constituent-list . :-syntax)))
+
+ := ( Constituent-list "{" Feat-Term "}" )
+ :build (:type Production-Rhs
+ :map ((Constituent-list . :-syntax)
+ (Feat-Term . :-semantics)))
+ )
+
+(defrule Constituent-list
+ := ( Constituent Constituent-list )
+ :build cons
+
+ := () )
+
+(defrule Constituent
+ := Identifier
+ := (Identifier "*" String)
+ :build (:type Kleene* :map ((Identifier . :-constituent)
+ (String . :-separator)))
+ := (Identifier "+" String)
+ :build (:type Kleene+ :map ((Identifier . :-constituent)
+ (String . :-separator)))
+ := String )
+
+(defrule More-Rhs
+ := ()
+ := ( "|" Rhs1 More-Rhs )
+ :build (:form (cons Rhs1 More-Rhs)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-mg.zb
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-oset.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-oset.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,369 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-oset.lisp
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 14-Nov-90
+; Modified: Tue Aug 2 15:03:39 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+(in-package "ZEBU")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Ordered Sets
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; A simple ordered set facility. Items kept in these sets must
+;;; have an order function: these are supplied for integers and
+;;; osets themselves. Items are kept in sorted lists, smallest
+;;; first. Could be re-done with binary search trees.
+;;; See integer-order-function for how order functions are supposed to
+;;; work.
+
+;;; Constructor will default to make a set that orders integers.
+
+(defstruct (oset (:copier nil)
+ )
+ (item-list '() :type list)
+ (order-fn #'integer-order-function)
+ (cardinality 0 :type fixnum))
+
+(declaim (inline oset-empty?))
+(defun oset-empty? (oset) (null (oset-item-list oset)))
+
+;;; Example of how the order function is supposed to work.
+
+(declaim (inline integer-order-function))
+(defun integer-order-function (a b)
+ (declare (fixnum a b))
+ (cond ((< a b) 'correct-order)
+ ((> a b) 'wrong-order)
+ (T 'equal)))
+
+;;; Destructively insert an item into a set
+;;; Returns the item if it wasn't there already, else NIL.
+(defun oset-insert! (item set)
+ ;; Returns NIL if nothing is inserted or T if item was inserted
+ ;; otherwise like oset-insert-2!
+ (declare (type oset set))
+ (let ((ilist (oset-item-list set)))
+ (if (null ilist)
+ (progn (setf (oset-item-list set) (list item)
+ (oset-cardinality set) 1)
+ t)
+ (let ((odf (oset-order-fn set))
+ order)
+ (cond ((eq 'correct-order
+ (setq order (funcall odf item (car (the cons ilist)))))
+ (setf (oset-item-list set) (cons item ilist))
+ (incf (oset-cardinality set))
+ t)
+ ((eq 'equal order) nil) ; item already there
+ (T ;; Ilist isn't null, and item goes somewhere after
+ ;; the car of ilist.
+ (do ((ilist ilist ilist-cdr)
+ (ilist-cdr (cdr ilist) (cdr ilist-cdr)))
+ ((null ilist-cdr)
+ (setf (cdr (the cons ilist)) (list item))
+ (incf (oset-cardinality set))
+ t)
+ (let ((ilist-cdr1 (car (the cons ilist-cdr))))
+ (when (eq 'correct-order
+ (setq order (funcall odf item ilist-cdr1)))
+ (setf (cdr (the cons ilist)) (cons item ilist-cdr))
+ (incf (oset-cardinality set))
+ (return-from oset-insert! t))
+ (when (eq 'equal order) ; already there
+ (return-from oset-insert! nil))))))))))
+
+;;; Returns two values: (1) NIL if nothing is inserted ot T if item was
+;;; inserted, and (2) a pointer to the item either found or inserted
+;;; into the set (so is eq to a member of the set).
+
+(defun oset-insert-2! (item set)
+ (declare (type oset set))
+ (let ((ilist (oset-item-list set)))
+ (if (null ilist)
+ (progn (setf (oset-item-list set) (list item)
+ (oset-cardinality set) 1)
+ (values t item))
+ (let ((odf (oset-order-fn set))
+ (ilist-hd (car (the cons ilist)))
+ order)
+ (cond ((eq 'correct-order
+ (setq order (funcall odf item ilist-hd)))
+ (setf (oset-item-list set) (cons item ilist))
+ (incf (oset-cardinality set))
+ (values t item))
+ ((eq 'equal order) (values nil ilist-hd))
+ ;; item already there
+ (T ;; Ilist isn't null, and item goes somewhere after
+ ;; the car of ilist.
+ (do ((ilist ilist ilist-cdr) (ilist-cdr (cdr ilist) (cdr ilist-cdr)))
+ ((null ilist-cdr)
+ (setf (cdr (the cons ilist)) (list item))
+ (incf (oset-cardinality set))
+ (values t item))
+ (let ((ilist-cdr1 (car (the cons ilist-cdr))))
+ (when (eq 'correct-order
+ (setq order (funcall odf item ilist-cdr1)))
+ (setf (cdr (the cons ilist)) (cons item ilist-cdr))
+ (incf (oset-cardinality set))
+ (return-from oset-insert-2! (values t item)))
+ (when (eq 'equal order) ; already there
+ (return-from oset-insert-2! (values nil ilist-cdr1)))))))))))
+
+
+;;; Insert a list of items into an oset. returns the SET.
+(declaim (inline oset-insert-list!))
+(defun oset-insert-list! (list oset)
+ (dolist (x list oset) (oset-insert! x oset)))
+
+;;; It's easy to define a generic order function on osets if they
+;;; have the same order function
+;;; making for easy osets of osets.
+
+(defun oset-order-function (oset-a oset-b &aux (odf (oset-order-fn oset-a)))
+ (declare (type oset oset-a oset-b))
+ (labels ((oset-order-aux (ilista ilistb)
+ (if (null ilista)
+ 'equal
+ (let ((item-order (funcall odf (car ilista) (car ilistb))))
+ (if (eq 'equal item-order)
+ (oset-order-aux (cdr ilista) (cdr ilistb))
+ item-order)))))
+ (if (eq odf (oset-order-fn oset-b))
+ (let ((a-card (oset-cardinality oset-a))
+ (b-card (oset-cardinality oset-b)))
+ (declare (fixnum a-card b-card))
+ (if (< a-card b-card)
+ 'correct-order
+ (if (= a-card b-card)
+ ;; same cardinality, same type, so march down the lists...
+ (oset-order-aux (oset-item-list oset-a)
+ (oset-item-list oset-b))
+ 'wrong-order)))
+ (error "incompatible types of sets: oset-order-function"))))
+
+; (declaim (inline oset-comparable?))
+; (defun oset-comparable? (oseta osetb)
+; (eq 'equal (oset-order-function oseta osetb)))
+
+;----------------------------------------------------------------------------;
+; oset-select-subsets
+;--------------------
+;;; Yields a list of disjoint subsets whose union is the set. For
+;;; each subset the value of selection-fn applied to the members is
+;;; the same in the sense of eqv.
+;;; partition set according to selection-fn
+
+(defun oset-select-subsets (set selection-fn)
+ (let ((r-ilist (oset-item-list set))
+ (alist '())
+ (odf (oset-order-fn set)))
+ (dolist (item r-ilist)
+ (let* ((key (funcall selection-fn item))
+ (found-association (assoc key alist :test #'eql)))
+ (if found-association
+ (setf (cdr found-association)
+ (cons item (cdr found-association)))
+ (push (cons key (list item)) alist))))
+ (do ((alist-tl alist (cdr alist-tl)))
+ ((null alist-tl) alist)
+ (let ((items (cdar (the cons alist-tl))))
+ (setf (car alist-tl) (make-oset :item-list (nreverse items)
+ :cardinality (length items)
+ :order-fn odf))))))
+
+(declaim (inline oset-for-each oset-memq oset-copy oset-union oset-empty!))
+(defun oset-for-each (procedure set)
+ (declare (type oset set))
+ (dolist (x (oset-item-list set)) (funcall procedure x)))
+
+(defun oset-memq (elt set)
+ (member elt (oset-item-list (the oset set))))
+
+(defun oset-copy (oset)
+ (declare (type oset oset))
+ (make-oset
+ :item-list (copy-list (oset-item-list oset))
+ :order-fn (oset-order-fn oset)
+ :cardinality (oset-cardinality oset)))
+
+(defun oset-union (oset1 oset2)
+ (declare (type oset oset1 oset2))
+ #||
+ (assert (eql (oset-order-fn oset1) (oset-order-fn oset2))
+ ()
+ "Mismatched order functions in oset union.")
+ (if (> (oset-cardinality oset1) (oset-cardinality oset2))
+ (oset-insert-list! (oset-item-list oset2)
+ (oset-copy oset1))
+ (oset-insert-list! (oset-item-list oset1)
+ (oset-copy oset2)))
+ ||#
+ (oset-insert-list! (oset-item-list oset1)
+ (oset-copy oset2)))
+
+(defun oset-delete (item oset)
+ (declare (type oset oset))
+ (let ((item-list (oset-item-list oset)))
+ (if (member item item-list)
+ (make-oset :item-list (delete item item-list)
+ :cardinality (1- (oset-cardinality oset))
+ :order-fn (oset-order-fn oset))
+ oset)))
+
+(defun oset-empty! (oset)
+ (declare (type oset oset))
+ (setf (oset-cardinality oset) 0
+ (oset-item-list oset) '()))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; LR(1) items
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; lr(1) items.
+;;; These are going to be represented by structs:
+;;; after-dot is an integer which indexes the symbol in the
+;;; production which follows the dot
+;;; that comes after the dot.
+;;;
+;;; look-aheads is an oset of grammar symbols.
+;;; The item data structure
+;;; essentially stands for the set of lr(1) items which are the same
+;;; except for each having one lookahead symbol from the set look-aheads.
+;;;
+;;; look-ahead-dependers is an oset of items to whom
+;;; lalr(1) lookaheads
+;;; propagate from this item.
+
+(defstruct (item (:print-function item-print))
+ (production nil)
+ (after-dot 0 :type fixnum)
+ (look-aheads (make-oset :order-fn #'g-symbol-order-function))
+ (look-ahead-dependers
+ (make-oset :order-fn #'item-order-function)))
+
+;;; A handy predicate.
+(declaim (inline dot-at-right-end?))
+
+(defun dot-at-right-end? (item)
+ (declare (type item item))
+ (= (the fixnum (production-length (item-production item)))
+ (the fixnum (item-after-dot item))))
+
+;;; Get the symbol after the dot -- 'the-bogus-symbol if dot is flushright.
+(defun symbol-after-dot (item)
+ (declare (type item item))
+ (let ((pr-after (nthcdr (the fixnum (item-after-dot item))
+ (the list (rhs (item-production item))))))
+ (if pr-after
+ (car pr-after)
+ 'the-bogus-symbol)))
+
+;;; Make an item with the dot moved one to the right, or false if
+;;; dot gets past the end.
+;;; Since this is used during lr(0) set construction, it only
+;;; deals with production and after-dot slots, the others
+;;; are filled in as '() by default.
+(defun advance-dot (item)
+ (declare (type item item))
+ (let ((production (item-production item))
+ (item-after-dot (item-after-dot item)))
+ (if (= (production-length production)
+ (the fixnum item-after-dot))
+ nil
+ (make-item :production production
+ :after-dot (1+ item-after-dot)))))
+
+;;; Make an item which has the dot at the left end of the rhs.
+(declaim (inline new-item))
+(defun new-item (production)
+ (make-item :production production))
+
+;;; For osets of items:
+;;; this is used during lr(0) sets of items construction. Only the
+;;; production and after dot fields are tested, since these characterize
+;;; lr(0) items.
+
+(defun item-order-function (ia ib)
+ (declare (type item ia ib))
+ (let ((production-index-a (production-index (item-production ia)))
+ (production-index-b (production-index (item-production ib))))
+ (declare (fixnum production-index-a production-index-b))
+ (if (< production-index-a production-index-b)
+ 'correct-order
+ (if (= production-index-a production-index-b)
+ (let ((iad (item-after-dot ia)) (ibd (item-after-dot ib)))
+ (declare (fixnum iad ibd))
+ (if (< iad ibd)
+ 'correct-order
+ (if (= iad ibd)
+ 'equal
+ 'wrong-order)))
+ 'wrong-order))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+
+#||
+ (integer-order-function 1 2)
+ (setq fred (make-oset))
+ (oset-item-list fred)
+ (oset-insert! 3 fred)
+ (oset-insert-2! 4 fred)
+ (oset-insert-list! '(5 6 7 7) fred)
+ (oset-insert-list! '(10 11) fred)
+ (oset-insert! 1100 fred)
+ (setq ned (make-oset))
+ (setq mary (make-oset :order-fn #'oset-order-function))
+ (oset-insert! ned mary)
+ (oset-insert! ned mary)
+ (oset-insert! fred mary)
+ (oset-insert! fred mary)
+ (mapc #'oset-item-list (oset-item-list mary))
+ (mapc #'oset-item-list (oset-select-subsets fred #'(lambda (x) (> x 5))))
+ (mapc #'oset-item-list (oset-select-subsets fred #'evenp))
+ (oset-for-each #'(lambda (x) (format t "~S " x)) fred)
+ (oset-memq 5 fred)
+ (oset-memq 99 fred)
+ (setq freddy (oset-copy fred))
+ (oset-item-list freddy)
+ (setq al (car (oset-select-subsets fred #'evenp)))
+ (setq hal (cadr (oset-select-subsets fred #'evenp)))
+ (oset-item-list (oset-union al hal))
+ (oset-item-list fred)
+ (oset-item-list (oset-delete 1100 fred))
+ (oset-empty! freddy)
+ (oset-item-list freddy)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test: "zebu-item"
+#||
+ (defun red ((new-item (car *productions*)))
+ (item-print fred)
+ (defvar ned (advance-dot fred))
+ (item-print ned)
+ (item-order-function ned ned)
+ (item-order-function ned fred)
+ (item-order-function fred ned)
+ (symbol-after-dot fred)
+ (dot-at-right-end? fred)
+ (dot-at-right-end? ned))
+||#
+
+||#
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-oset.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-package.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-package.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,214 @@
+; -*- mode: Lisp -*- --------------------------------------------------- ;
+; File: zebu-defsystem-package.lisp
+; Description: package definition (mk:defsystem version)
+; Author: Rudi Schlatte, based on zebu-package.lisp by J.Laubsch
+; Language: CL
+; Package: CL-USER
+; Status: Experimental (Do Not Distribute)
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Package and parameter definitions for use with mk:defsystem.
+; Eliminates dependence on some symbols (*ZEBU-directory* et al.)
+; being present in CL-USER.
+;
+; This file REPLACES zebu-package.lisp when using mk:defsystem for the
+; load process. Rationale: zebu-package.lisp expects some symbols and
+; packages to be present, and setting everything up including creating
+; a fake package PSGRAPH was not something very clean to do.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(in-package "CL-USER")
+(provide "zebu-package")
+
+#+LUCID ; while not up tp CLtL2
+(eval-when (compile load eval)
+ (defmacro LCL::DECLAIM (decl-spec) `(proclaim ',decl-spec)))
+
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; This package is not used anywhere
+;;#+LUCID
+;;(defpackage "PSGRAPH"
+;; (:use "LUCID-COMMON-LISP"))
+;;
+;;#-LUCID
+;;(defpackage "PSGRAPH"
+;; (:use "COMMON-LISP"))
+
+
+(defpackage "ZEBU"
+ (:nicknames "ZB")
+ #+LUCID (:use "LISP" "LUCID-COMMON-LISP")
+ #+LUCID (:import-from "SYSTEM" "*KEYWORD-PACKAGE*")
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Gives an error when loading compiled files
+;; #+LUCID (:import-from "LCL" "DECLAIM")
+;; (:import-from "PSGRAPH" PSGRAPH::PSGRAPH)
+ #+MCL (:use "COMMON-LISP" "CCL")
+ #+KCL (:use "LISP")
+ #+ALLEGRO (:use "COMMON-LISP" "EXCL")
+ #-(or lucid mcl kcl allegro) (:use "COMMON-LISP")
+
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Defined in this file / package instead, see below
+;; (:import-from "CL-USER" CL-USER::*ZEBU-DIRECTORY*
+;; CL-USER::*ZEBU-binary-directory*)
+ (:export "*COMMENT-BRACKETS*" "*COMMENT-START*" "*PRESERVE-CASE*"
+ "*CASE-SENSITIVE*"
+ "*DISALLOW-PACKAGES*" "*STRING-DELIMITER*"
+ "*SYMBOL-DELIMITER*"
+ "*IDENTIFIER-START-CHARS*" "*IDENTIFIER-CONTINUE-CHARS*"
+ "*ALLOW-CONFLICTS*" "*WARN-CONFLICTS*"
+ "*CURRENT-GRAMMAR*" "*GENERATE-DOMAIN*"
+ "*ZEBU-VERSION*"
+ "CATEGORIZE" "END-OF-TOKENS-CATEGORY"
+ "COMPILE-LALR1-GRAMMAR" "COMPILE-SLR-GRAMMAR"
+ "DEBUG-PARSER"
+ "DEFRULE" "FILE-PARSER" "FIND-GRAMMAR" "IDENTITY*"
+ "IDENTIFIERP"
+ "KB-DOMAIN" "KB-DOMAIN-P" "KB-TYPE-NAME-P"
+ "KB-SEQUENCE" "KB-SEQUENCE-P" "*KB-SEQUENCE-SEPARATOR*"
+ "MAKE-KB-SEQUENCE" "KB-SEQUENCE-FIRST" "KB-SEQUENCE-REST"
+ "KB-DEF-SLOT-TYPE" "KB-SET-VALUED-SLOT-P"
+ "KB-SLOT-TYPE" "KB-SLOTS" "KB-SUPERTYPE" "KB-SUBTYPES"
+ "KB-LEGAL-SLOT-P"
+ "KB-TREE-ATTRIBUTES" "DEFINE-TREE-ATTRIBUTES" "DEF-TREE-ATTRIBUTES"
+ "PREORDER-TRANSFORM" "POSTORDER-TRANSFORM"
+ "KIDS" "FOR-EACH-KID" "FOR-EACH-KID!"
+ "FOR-EACH-DESCENDANT"
+ "KB-COPY" "KB-EQUAL" "KB-COMPARE"
+ "LIST-PARSER" "LR-PARSE" "PRINT-ACTIONS" "READ-PARSER"
+ "COMPILE-FROM-COMMAND-LINE"
+ "EMPTY-SEQ" "SEQ-CONS" "EMPTY-SET" "SET-CONS"
+ "K-4-3" "K-2-1" "K-2-2" "K-3-2" "CONS-1-3" "CONS-2-3"
+ "NUMBER" "STRING" "IDENTIFIER"
+ "SHOW-KB-HIERARCHY"
+ "ZEBU" "ZEBU-COMPILER" "ZEBU-COMPILE-FILE" "ZEBU-LOAD-FILE"
+ "ZEBU-RR" "ZEBU-TOP"
+ )
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Defined in this file / package instead, see below
+;; #-LUCID
+;; (:import-from "CL-USER"
+;; CL-USER::*LOAD-SOURCE-PATHNAME-TYPES*
+;; CL-USER::*LOAD-BINARY-PATHNAME-TYPES*))
+ )
+
+(in-package "ZB")
+
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Moved definitions of *ZEBU-direcotory*, *ZEBU-binary-directory*
+;;; over from ZEBU-init.lisp, got rid of importing symbols from
+;;; CL-USER in (defpackage "ZEBU")
+
+; edit the following form for your Lisp, and the directory where you keep Zebu
+(defparameter *ZEBU-directory*
+ (make-pathname
+ :directory ;; Might be loading zebu-package-fasl from the binary directory
+ (remove "binary" (pathname-directory *load-truename*)
+ :from-end t :test #'string-equal
+ :count 1 :end 1))
+ "The location of the ZEBU source files.")
+
+;;---------------------------------------------------------------------------;
+;; *ZEBU-binary-directory*
+;;------------------------
+;; directory for compiled grammars and lisp files
+;;
+(defparameter *ZEBU-binary-directory*
+ (make-pathname :directory (append (pathname-directory *ZEBU-directory*)
+ (list "binary")))
+ "The location of the compiled ZEBU files.")
+
+
+
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Extensions are defined multiple times in COMPILE-Zebu.lisp and
+;;; ZEBU-init.lisp
+;;; I was lazy and snarfed a list from mk:defsystem 3.x :-)
+;;; TODO
+;;; Do something clever with the environment package from CLOCC;
+;;; such a list should really be maintained in one place only.
+
+;;; *filename-extensions* is a cons of the source and binary extensions.
+(defvar *filename-extensions*
+ (car `(#+(and Symbolics Lispm) ("lisp" . "bin")
+ #+(and dec common vax (not ultrix)) ("LSP" . "FAS")
+ #+(and dec common vax ultrix) ("lsp" . "fas")
+ #+ACLPC ("lsp" . "fsl")
+ #+CLISP ("lsp" . "fas")
+ #+KCL ("lsp" . "o")
+ #+IBCL ("lsp" . "o")
+ #+Xerox ("lisp" . "dfasl")
+ ;; Lucid on Silicon Graphics
+ #+(and Lucid MIPS) ("lisp" . "mbin")
+ ;; the entry for (and lucid hp300) must precede
+ ;; that of (and lucid mc68000) for hp9000/300's running lucid,
+ ;; since *features* on hp9000/300's also include the :mc68000
+ ;; feature.
+ #+(and lucid hp300) ("lisp" . "6bin")
+ #+(and Lucid MC68000) ("lisp" . "lbin")
+ #+(and Lucid Vax) ("lisp" . "vbin")
+ #+(and Lucid Prime) ("lisp" . "pbin")
+ #+(and Lucid SUNRise) ("lisp" . "sbin")
+ #+(and Lucid SPARC) ("lisp" . "sbin")
+ #+(and Lucid :IBM-RT-PC) ("lisp" . "bbin")
+ ;; PA is Precision Architecture, HP's 9000/800 RISC cpu
+ #+(and Lucid PA) ("lisp" . "hbin")
+ #+excl ("cl" . "fasl")
+ #+CMU ("lisp" . ,(or (c:backend-fasl-file-type c:*backend*)
+ "fasl"))
+; #+(and :CMU (not (or :sgi :sparc))) ("lisp" . "fasl")
+; #+(and :CMU :sgi) ("lisp" . "sgif")
+; #+(and :CMU :sparc) ("lisp" . "sparcf")
+ #+PRIME ("lisp" . "pbin")
+ #+HP ("l" . "b")
+ #+TI ("lisp" . #.(string (si::local-binary-file-type)))
+ #+:gclisp ("LSP" . "F2S")
+ #+pyramid ("clisp" . "o")
+ #+:coral ("lisp" . "fasl")
+ ;; Harlequin LispWorks
+ #+:lispworks ("lisp" . ,COMPILER:*FASL-EXTENSION-STRING*)
+; #+(and :sun4 :lispworks) ("lisp" . "wfasl")
+; #+(and :mips :lispworks) ("lisp" . "mfasl")
+ #+:mcl ("lisp" . "fasl")
+
+ ;; Otherwise,
+ ("lisp" . ,(pathname-type (compile-file-pathname "foo.lisp")))))
+ "Filename extensions for Common Lisp. A cons of the form
+ (Source-Extension . Binary-Extension). If the system is
+ unknown (as in *features* not known), defaults to \"lisp\" and the
+ file type of compile-file-pathname.")
+
+(defparameter *load-source-pathname-types*
+ (list (car *filename-extensions*)))
+(defparameter *load-binary-pathname-types*
+ (list (cdr *filename-extensions*)))
+
+
+;;; 2000-03-25 by rschlatte at ist.tu-graz.ac.at:
+;;; Snarfed from ZEBU-init.lisp
+(defvar *zebu-version*
+ (let ((file (make-pathname
+ :name "Version"
+ :type nil
+ :directory (pathname-directory
+ *zebu-directory*))))
+ (if (probe-file file)
+ (with-open-file (s file :direction :input)
+ (read-line s))
+ "3.5.5")))
+
+(declaim (special *COMMENT-BRACKETS* *COMMENT-START* *PRESERVE-CASE*
+ *CASE-SENSITIVE* *DISALLOW-PACKAGES* *STRING-DELIMITER*
+ *SYMBOL-DELIMITER* *IDENTIFIER-START-CHARS*
+ *IDENTIFIER-CONTINUE-CHARS*
+ *ALLOW-CONFLICTS* *WARN-CONFLICTS*
+ *CURRENT-GRAMMAR* *GENERATE-DOMAIN*
+ ))
+
+#-LUCID
+(declaim (special *LOAD-SOURCE-PATHNAME-TYPES*
+ *LOAD-BINARY-PATHNAME-TYPES*))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-defsystem-package.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-printers.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-printers.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,178 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-printers.l
+; Description: printing functions for grammar debugging
+; Author: Joachim H. Laubsch
+; Created: 4-Aug-92
+; Modified: Wed Sep 7 17:40:30 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(IN-PACKAGE "ZEBU")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; printing the internals of a grammar
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun print-actions (grammar &optional (stream t))
+ (let ((g (find-grammar (string grammar))))
+ (if (null g)
+ (error "No Grammar named ~S loaded" grammar)
+ (let ((*package* (find-package (grammar-package g)))
+ (zb-rules (grammar-zb-rules g)))
+ (dotimes (i (length zb-rules))
+ (let ((pair (svref zb-rules i)))
+ (format stream "~%~%Rule: ~S" (car pair))
+ (dolist (prod (zb-rule--productions (cdr pair)))
+ (let ((action (production-rhs--build-fn prod)))
+ #+MCL (print action stream)
+ #-MCL (pprint action stream)))))
+ (values)))))
+
+(defun print-production (prod)
+ (format t "~A: ~A -> "
+ (production-index prod) (g-symbol-name (lhs prod)))
+ (dolist (x (rhs prod))
+ (princ (g-symbol-name x)) (princ " ")))
+
+(defun print-productions ()
+ (dolist (x (reverse *productions*))
+ (print-production x) (terpri)))
+
+(defun print-symbols ()
+ (dolist (sym (reverse *symbols*))
+ (format t "~A: ~A~%" (g-symbol-index sym) (g-symbol-name sym)))
+ )
+
+(defun print-own-productions (sym)
+ (dolist (x (g-symbol-own-productions sym))
+ (print-production x) (terpri)))
+
+(defun print-rhs-productions (sym)
+ (dolist (x (g-symbol-rhs-productions sym))
+ (print-production x) (terpri)))
+
+(defun cruise-symbols ()
+ (dolist (sym (reverse *symbols*))
+ (format t "~%~A: ~A~%"
+ (g-symbol-index sym)
+ (g-symbol-name sym))
+ (when (g-symbol-own-productions sym)
+ (format t "Own productions:~%")
+ (print-own-productions sym))
+ (when (g-symbol-rhs-productions sym)
+ (format t "RHS productions:~%")
+ (print-rhs-productions sym))
+ (princ "----------------------------")
+ ))
+
+(defun cruise-symbols-2 ()
+ (terpri)
+ (dotimes (i (length *symbol-array*))
+ (let ((sym (svref *symbol-array* i)))
+ (format t "~S: ~S~%"
+ (g-symbol-index sym)
+ (g-symbol-name sym)))))
+
+(defun cruise-follow-sets ()
+ (let (*print-circle*)
+ (dolist (gs *symbols*)
+ (when (g-symbol-non-terminal? gs)
+ (format t "~%~A: ~S~%--------------------"
+ gs
+ (oset-item-list (g-symbol-follow-set gs)))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun print-collection (closures-too?)
+ (format t "~%Start state index: ~A~%" *lr0-start-state-index*)
+ (oset-for-each
+ #'(lambda (item-set)
+ (format t "------------------ ~A -------------------~%"
+ (item-set-index item-set))
+ (item-set-print-kernel item-set closures-too?)
+ (let ((gotos (item-set-goto-map item-set)))
+ (when (oset-item-list gotos)
+ (princ "gotos: ")
+ (oset-for-each
+ #'(lambda (gmelt)
+ (format t "~A -> ~A "
+ (g-symbol-name (car gmelt))
+ (item-set-index (cdr gmelt))))
+ gotos)
+ (terpri)))
+ )
+ *lr0-item-sets*))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun item-print (item &optional (stream t) level)
+ ;; This only prints the lr(0) parts and the lookaheads.
+ (declare (ignore level))
+ (let ((after-dot (item-after-dot item))
+ (production (item-production item)))
+ (format stream "~A -> " (g-symbol-name (lhs production)))
+ (do ((ncdr (rhs production) (cdr ncdr))
+ (i 0 (1+ i)))
+ ((null ncdr)
+ (when (= after-dot i) (princ ". "))
+ (unless (oset-empty? (item-look-aheads item))
+ (princ "{ " stream)
+ (oset-for-each
+ #'(lambda (gs) (format stream "~A " (g-symbol-name gs)))
+ (item-look-aheads item))
+ (princ "}" stream)))
+ (format stream "~:[~;. ~]~A "
+ (= after-dot i)
+ (g-symbol-name (car ncdr))))))
+
+(defun item-list-print (item-list)
+ (dolist (item item-list)
+ (terpri)
+ (item-print item)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun cruise-parse-tables ()
+ (format t "Start-state is ~S" *lr0-start-state-index*)
+ (dotimes (i *lr0-item-set-count*)
+ (format t "~%~A~%actions: " i)
+ (oset-for-each
+ #'(lambda (action-elt)
+ (format t "~A : ~A ~A "
+ (get-print-name (car action-elt))
+ (cadr action-elt)
+ (caddr action-elt)))
+ (svref (the vector *action-array*) i))
+ (format t "~%gotos: ")
+ (oset-for-each
+ #'(lambda (goto-elt)
+ (format t "~A : ~A "
+ (get-print-name (car goto-elt))
+ (cdr goto-elt))
+ )
+ (svref (the vector *goto-array*) i))
+ (format t "~%--------------------------------------------------")
+ ))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+#||
+ (load "zebu-loadgram")
+ (load-grammar "ex1.grm")
+ (print-symbols)
+ (cruise-symbols)
+ (cruise-symbols-2)
+ (print-productions)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-printers.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-regex.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-regex.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,530 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-regex.l
+; Description: A Lisp based Regular Expression Compiler
+; Author: Joachim H. Laubsch
+; Created: 21-Sep-92
+; Modified: Mon Apr 18 13:38:26 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+;
+; (c) Copyright 1992, Hewlett-Packard Company
+;;; All rights reserved.
+;;;
+;;; Use and copying of this software and preparation of derivative works
+;;; based upon this software are permitted. Any distribution of this
+;;; software or derivative works must comply with all applicable United
+;;; States export control laws.
+;;;
+;;; This software is made available AS IS, and Hewlett-Packard Company
+;;; makes no warranty about the software, its performance or its conformity
+;;; to any specification.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+; 13-Jan-93 (Joachim H. Laubsch)
+; Aletrnatives, to be indicated by \| need to be done!
+; 7-Oct-92 (Joachim H. Laubsch)
+; made . fail on Newline in String
+; 28-Sep-92 (Joachim H. Laubsch)
+; made ? work when it occured after a string (similar to the cases for +,*)
+; 21-Sep-92 (Joachim H. Laubsch)
+; made behavior conform more with Emacs Lisp's STRING-MATCH
+; e.g. (string-match "\\(na\\)x\\1" "naxnana") matches now,
+; but before (string-match "(na)x\\1" "naxnana") did.
+; "\(" is the grouping construct, and since \ is the quoting character,
+; it must be qoted as well, giving "\\(".
+; Avoided string-copying by introducing pointers in the match group case.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; -*- Mode:Common-Lisp; Package:ZEBU; Base:10 -*-
+;;;
+;;; This code was written by:
+;;;
+;;; Lawrence E. Freil <lef at nscf.org>
+;;; National Science Center Foundation
+;;; Augusta, Georgia 30909
+;;;
+;;; If you modify this code, please comment your modifications
+;;; clearly and inform the author of any improvements so they
+;;; can be incorporated in future releases.
+;;;
+;;; nregex.lisp - My 4/8/92 attempt at a Lisp based regular expression
+;;; parser.
+;;;
+;;; This regular expression parser operates by taking a
+;;; regular expression and breaking it down into a list
+;;; consisting of lisp expressions and flags. The list
+;;; of lisp expressions is then turned into a
+;;; lambda expression that can be later applied to a
+;;; string argument for parsing.
+
+
+(in-package "ZEBU")
+(provide "zebu-regex")
+
+;;;
+;;; Declare the global variables for storing the paren index list.
+;;;
+(declaim (special *regex-groups* *regex-groupings*))
+
+;; In Gnu Emacs Lisp's regular expressions the braces: {,} are not special,
+;; neither are the parens: (,), nor the alternatives char: |
+;;(defvar *regex-special-chars* "?*+.()[]\\${}")
+(defvar *regex-special-chars* "?*+.[]\\$")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; For debugging
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Declare some simple macros to make the code more readable.
+;;;
+(defvar *regex-debug* nil) ; Set to nil for no debugging code
+
+(defmacro info (message &rest args)
+ (if *regex-debug*
+ `(format *standard-output* ,message , at args)))
+
+(eval-when (compile)
+ (setq *regex-debug* nil))
+
+;;;
+;;; Declare a simple interface for testing. You probably wouldn't want
+;;; to use this interface unless you were just calling this once.
+;;;
+#||
+(defun regex (expression string)
+ "Usage: (regex <expression> <string)
+ This function will call regex-compile on the expression and then apply
+ the string to the returned lambda list."
+ (let ((findit (cond ((stringp expression)
+ (regex-compile expression))
+ ((listp expression)
+ expression)))
+ (result nil))
+ (if (not (funcall (if (functionp findit)
+ findit
+ (eval `(function ,findit))) string))
+ (return-from regex nil))
+ (if (= *regex-groupings* 0)
+ (return-from regex t))
+ (dotimes (i *regex-groupings*)
+ (push (funcall 'subseq
+ string
+ (car (svref *regex-groups* i))
+ (cadr (svref *regex-groups* i)))
+ result))
+ (reverse result)))
+
+||#
+
+;; specialized to the :anchored T case
+;; returns just the body of the fn with STRING, START, END free.
+
+(defun regex-compile (source &aux (ln-source (length source)))
+ "Usage: (regex-compile <regular expression>)"
+ ;; If the expression was an empty string then it always
+ ;; matches (so lets leave early)
+ (when (= ln-source 0) (return-from regex-compile '(t)))
+ (macrolet ((add-exp (list)
+ ;; Add an item to the end of expression
+ `(setf expression-ln (+ expression-ln (length ,list))
+ expression (append expression ,list)))
+ (add-exp1 (item)
+ `(setf expression-ln (1+ expression-ln)
+ expression (nconc expression (list ,item)))))
+
+ (info "Now entering regex-compile with ~S~%" source)
+ ;;
+ ;; This routine works in two parts.
+ ;; The first pass take the regular expression and produces a list of
+ ;; operators and lisp expressions for the entire regular expression.
+ ;; The second pass takes this list and produces the lambda expression.
+ (let ((expression ; holder for expressions
+ ;;
+ ;; Generate the very first expression to save the starting index
+ ;; so that group 0 will be the entire string matched always
+ ;;
+ (list '(setf (svref *regex-groups* 0) (list index nil))))
+ (expression-ln 1) ; length of expression
+ (group 1) ; Current group index
+ (group-stack nil) ; Stack of current group endings
+ (result nil) ; holder for built expression.
+ )
+
+ ;; If the first character is a literal, then do a quick scan to see
+ ;; if it is even in the string.
+ ;; If not then we can issue a quick nil,
+ ;; otherwise we can start the search at the matching character to skip
+ ;; the checks of the non-matching characters anyway.
+ ;;
+ ;; If I really wanted to speed up this section of code it would be
+ ;; easy to recognize the case of a fairly long multi-character literal
+ ;; and generate a Boyer-Moore search for the entire literal.
+ ;;
+ ;; I generate the code to do a loop because on CMU Lisp this is about
+ ;; twice as fast a calling position.
+ ;;
+
+ ;;
+ ;; Loop over each character in the regular expression building the
+ ;; expression list as we go.
+ ;;
+ (do ((eindex 0 (1+ eindex)))
+ ((= eindex ln-source))
+ (let ((current (char source eindex)))
+ (info "Now processing character ~A index = ~A~%" current eindex)
+ (case current
+ (#\.
+ ;;
+ ;; Generate code for a single wild character
+ ;;
+ (add-exp1 '(if (>= index length)
+ (return-from compare nil)
+ (incf index)))
+ )
+ (#\$
+ ;;
+ ;; If this is the last character of the expression then
+ ;; anchor the end of the expression, otherwise let it slide
+ ;; as a standard character (even though it should be quoted).
+ ;;
+ (if (= eindex (1- ln-source))
+ (add-exp1 '(if (/= index length)
+ (return-from compare nil)))
+ (add-exp1 '(if (and (< index length)
+ (eql (char string index) #\$))
+ (incf index)
+ (return-from compare nil)))))
+ (#\* (add-exp1 'ASTERIX))
+
+ (#\+ (add-exp1 'PLUS))
+
+ (#\? (add-exp1 'QUESTION))
+
+ (#\[
+ ;;
+ ;; Start of a range operation.
+ ;; Generate a bit-vector that has one bit per possible character
+ ;; and then on each character or range, set the possible bits.
+ ;;
+ ;; If the first character is carat then invert the set.
+ (let* ((invert (eql (char source (1+ eindex)) #\^))
+ (bitstring (make-array
+ 256
+ :element-type 'bit
+ :initial-element (if invert 1 0)))
+ (set-char (if invert 0 1)))
+ (if invert (incf eindex))
+ (let (hi-char)
+ (do* ((x (1+ eindex) (1+ x))
+ (char (char source x)
+ (if (= x ln-source)
+ (error "No closing \"]\" found in ~a"
+ source)
+ (char source x))))
+ ((eql char #\]) (setf eindex x))
+ (info "Building range with character ~A~%" (char source x))
+ (if (let ((x+2 (+ x 2)))
+ (and (< x+2 ln-source)
+ (eql (char source (1+ x)) #\-)
+ (not (char= (setf hi-char (char source x+2))
+ #\]))))
+ (progn
+ (if (char>= char hi-char)
+ (error "Invalid range \"~A-~A\". Ranges must be in acending order"
+ char hi-char))
+ (do ((j (char-code char) (1+ j)))
+ ((> j (char-code hi-char))
+ (incf x 2))
+ (info "Setting bit for char ~A code ~A~%" (code-char j) j)
+ (setf (sbit bitstring j) set-char)))
+ (progn
+ ;;
+ ;; If the character is quoted then find out what
+ ;; it should have been
+ ;;
+ (when (char= char #\\)
+ (let (length)
+ (multiple-value-setq (char length)
+ (regex-quoted (subseq source (1+ x)) invert))
+ (incf x length)))
+ (info "Setting bit for char ~C code ~A~%"
+ char (char-code char))
+ (if (vectorp char)
+ (bit-ior bitstring char t)
+ (setf (sbit bitstring (char-code char))
+ set-char))))))
+ (add-exp1 `(let ((range ,bitstring))
+ (if (>= index length)
+ (return-from compare nil))
+ (if (= 1 (sbit range (char-code (char string index))))
+ (incf index)
+ (return-from compare nil))))))
+ (#\\
+ ;;
+ ;; Intrepret the next character as a special, range, octal, group or
+ ;; just the character itself.
+ ;;
+ (multiple-value-bind (value length)
+ (regex-quoted (subseq source (1+ eindex)) nil)
+ (cond ((listp value) (add-exp value))
+ ((characterp value)
+ (case value
+ (#\(
+ ;;
+ ;; Start a grouping.
+ ;;
+ (incf group)
+ (push group group-stack)
+ (add-exp1 `(setf (svref *regex-groups* ,(1- group))
+ (list index nil)))
+ (add-exp1 group))
+ (#\)
+ ;;
+ ;; End a grouping
+ ;;
+ (let ((group (pop group-stack)))
+ (add-exp1 `(setf (cadr (svref *regex-groups* ,(1- group)))
+ index))
+ (add-exp1 (- group))))
+ (t (add-exp1 `(if (and (< index length)
+ (eql (char string index)
+ ,value))
+ (incf index)
+ (return-from compare nil))))))
+ ((vectorp value)
+ (add-exp1 `(let ((range ,value))
+ (if (>= index length)
+ (return-from compare nil))
+ (if (= 1 (sbit range (char-code (char string index))))
+ (incf index)
+ (return-from compare nil))))))
+ (incf eindex length)))
+ (t
+ ;;
+ ;; We have a literal character.
+ ;; Scan to see how many we have and if it is more than one
+ ;; generate a string= verses as single eql.
+ ;;
+ (let* ((lit "")
+ (term (dotimes (litindex (- ln-source eindex) nil)
+ (let ((litchar (char source (+ eindex litindex))))
+ (if (position litchar *regex-special-chars*)
+ (return litchar)
+ (progn
+ (info "Now adding ~A relative index ~A to lit~%"
+ litchar litindex)
+ (setf lit (concatenate 'string lit
+ (string litchar)))))))))
+ ;;(break "lit: ~S term: ~S" lit term)
+ (if (= (length lit) 1)
+ (progn
+ (add-exp1 `(if (and (< index length)
+ (eql (char string index)
+ ,current))
+ (incf index)
+ (return-from compare nil))))
+ ;;
+ ;; If we have a multi-character literal then we must
+ ;; check to see if the next character (if there is one)
+ ;; is an asterix or a plus. If so then we must not use this
+ ;; character in the big literal.
+ (progn
+ (when (member term '(#\* #\+ #\?))
+ (setf lit (subseq lit 0 (1- (length lit)))))
+ (if (= (length lit) 1)
+ (add-exp1 `(if (and (< index length)
+ (eql (char string index)
+ ,(schar lit 0)))
+ (incf index)
+ (return-from compare nil)))
+ (progn
+ (add-exp1 `(let ((new-index (+ index ,(length lit))))
+ (if (< length new-index)
+ (return-from compare nil))
+ (if (string= string ,lit :start1 index
+ :end1 new-index)
+ (incf index ,(length lit))
+ (return-from compare nil))))
+ (incf eindex (1- (length lit))))))))))))
+ ;;
+ ;; Plug end of list to return t. If we made it this far then
+ ;; We have matched!
+ (add-exp1 '(setf (cadr (svref *regex-groups* 0)) index))
+ (add-exp1 '(return-from final-return t))
+ ;;
+ ;;
+ ;; Now take the expression list and turn it into a lambda expression
+ ;; replacing the special flags with lisp code.
+ ;; For example: A BEGIN needs to be replaced by an expression that
+ ;; saves the current index, then evaluates everything till it gets to
+ ;; the END then save the new index if it didn't fail.
+ ;; On an ASTERIX I need to take the previous expression and wrap
+ ;; it in a do that will evaluate the expression till an error
+ ;; occurs and then another do that encompases the remainder of the
+ ;; regular expression and iterates decrementing the index by one
+ ;; of the matched expression sizes and then returns nil. After
+ ;; the last expression insert a form that returns t so that
+ ;; if the entire nested sub-expression succeeds then the loop
+ ;; is broken manually.
+ ;;
+ ;;
+ ;; Reversing the current expression makes building up the
+ ;; lambda list easier due to the nesting of expressions when
+ ;; an asterisk has been encountered.
+ (setf expression (reverse expression))
+ (info "~&Regular Expression:~%(~{~s~% ~}) ;; ~d"
+ expression expression-ln)
+
+ (do ((elt 0 (1+ elt)))
+ ((= elt expression-ln))
+ (let ((piece (nth elt expression))
+ (piece+1 (nth (1+ elt) expression)))
+ ;;
+ ;; Now check for PLUS, if so then ditto the expression and then let the
+ ;; ASTERIX below handle the rest.
+ ;;
+ ;; (princ ".")
+ (when (eql piece 'PLUS)
+ (cond ((listp piece+1) (push piece+1 result))
+ ;;
+ ;; duplicate the entire group
+ ;; NOTE: This hasn't been implemented yet!!
+ (t (warn "~%GROUP repeat hasn't been implemented yet~%"))))
+ (cond ((listp piece) ; Just append the list
+ (push piece result))
+ ((eql piece 'QUESTION) ; Wrap it in a block that won't fail
+ (cond ((listp piece+1)
+ (push `(progn (block compare ,piece+1)
+ t)
+ result)
+ (incf elt))
+ ;;
+ ;; This is a QUESTION on an entire group which
+ ;; hasn't been implemented yet!!!
+ ;;
+ (t
+ (warn "~%Optional groups not implemented yet~%"))))
+ ((or (eql piece 'ASTERIX) ; Do the wild thing!
+ (eql piece 'PLUS))
+ (when (listp piece+1)
+ ;;
+ ;; This is a single character wild card so
+ ;; do the simple form.
+ ;;
+ (setf result
+ `((let ((oindex index))
+ (block compare
+ (do nil (nil) ,piece+1))
+ (do ((start index (1- start)))
+ ((< start oindex) nil)
+ (let ((index start))
+ (block compare
+ , at result))))))
+ (incf elt)))))) ; Just ignore everything else.
+
+ (info "~&Result:~s" result)
+ ;;
+ ;; Now wrap the result in a lambda list that can then be
+ ;; invoked or compiled, however the user wishes.
+ ;;
+ (setf result
+ `((setf *regex-groupings* ,group)
+ (block final-return
+ (block compare
+ (let ((index start)
+ (length end))
+ , at result))))))))
+
+
+;;;
+;;; Define a function that will take a quoted character and return
+;;; what the real character should be plus how much of the source
+;;; string was used. If the result is a set of characters, return an
+;;; array of bits indicating which characters should be set. If the
+;;; expression is one of the sub-group matches, return a
+;;; list-expression that will provide the match.
+;;;
+
+(defun regex-quoted (char-string &optional (invert nil))
+ "Usage: (regex-quoted <char-string> &optional invert)
+ Returns either the quoted character or a simple bit vector of bits set for
+ the matching values"
+ (let ((first (char char-string 0))
+ (used-length 1)
+ result)
+ (setf result
+ (case first
+ (#\n #\NewLine)
+ (#\c #\Return)
+ (#\t #\Tab)
+ (#\d #*0000000000000000000000000000000000000000000000001111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
+ (#\D #*1111111111111111111111111111111111111111111111110000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)
+ (#\w #*0000000000000000000000000000000000000000000000001111111111000000011111111111111111111111111000010111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
+ (#\W #*1111111111111111111111111111111111111111111111110000000000111111100000000000000000000000000111101000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)
+ (#\b #*0000000001000000000000000000000011000000000010100000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
+ (#\B #*1111111110111111111111111111111100111111111101011111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)
+ (#\s #*0000000001100000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
+ (#\S #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)
+ (t (if (and (char>= first #\0) (char<= first #\9))
+ (if (and (> (length char-string) 2)
+ (and (char>= (char char-string 1) #\0)
+ (char<= (char char-string 1) #\9)
+ (char>= (char char-string 2) #\0)
+ (char<= (char char-string 2) #\9)))
+ ;;
+ ;; It is a single character specified in octal
+ ;;
+ (parse-integer char-string
+ :end (setf used-length 3)
+ :radix 8 :junk-allowed t)
+
+ ;;
+ ;; We have a group number replacement.
+ ;;
+ (let ((group (- (char-code first) (char-code #\0))))
+ `((let* ((range (svref *regex-groups* ,group))
+ (start-old (car (the cons range)))
+ (end-old (cadr (the cons range)))
+ (ln-nstring (- end-old start-old))
+ (new-index (+ index ln-nstring)))
+ (if (< length new-index)
+ (return-from compare nil))
+ (if (string= string string
+ :start1 start-old
+ :end1 end-old
+ :start2 index
+ :end2 new-index)
+ (setq index new-index)
+ (return-from compare nil))))))
+ first))))
+ (if (and (vectorp result) invert)
+ (bit-xor result #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 t))
+ (values result used-length)))
+
+#||
+(defun match-beginning (n)
+ (first (SVREF *REGEX-GROUPS* n)))
+
+(defun match-end (n)
+ (second (SVREF *REGEX-GROUPS* n)))
+||#
+
+(defun def-regex-parser (name pattern)
+ (when (and (eql (symbol-package name) (find-package "LISP"))
+ (fboundp name))
+ (error "A lexical category should not name a Lisp function: ~s"
+ name))
+ (let* ((body (regex-compile pattern)))
+ `(defun ,name (STRING &optional (START 0) (END (length STRING)))
+ ,@(when *regex-debug*
+ '((info "~%Looking at: ~S..."
+ (subseq string START (min (+ 10 START) END)))))
+ (when (progn .,body)
+ (second (SVREF *REGEX-GROUPS* 0))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-regex.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-rr.asd
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-rr.asd Wed Oct 17 09:04:46 2007
@@ -0,0 +1,14 @@
+;;; -*- Lisp -*-
+
+(in-package #:asdf)
+
+(defsystem #:zebu-rr
+ :version "3.5.5"
+ :depends-on ("zebu")
+ :components
+ ((:file "zebu-kb-domain")
+ (:file "zebu-tree-attributes"
+ :in-order-to ((compile-op (load-op "zebu-kb-domain"))))
+ (:file "zebra-debug"
+ :in-order-to ((compile-op (load-op "zebu-kb-domain"
+ "zebu-tree-attributes"))))))
Added: vendor/zebu/zebu-rr.system
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-rr.system Wed Oct 17 09:04:46 2007
@@ -0,0 +1,21 @@
+;;; -*- Lisp -*-
+
+;;;(in-package "CL-USER")
+
+(mk:defsystem "zebu-rr"
+ :source-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/"
+ :binary-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/binary/"
+ ;;:package "ZEBU"
+ ;; Are the dependencies correct?
+ :depends-on ("zebu")
+ :components
+ ((:file "zebu-kb-domain")
+ (:file "zebu-tree-attributes"
+ :depends-on ("zebu-kb-domain"))
+ (:file "zebra-debug"
+ :depends-on ("zebu-kb-domain" "zebu-tree-attributes"))))
+
+
+
+
+
Added: vendor/zebu/zebu-slr.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-slr.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,52 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-slr.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 1-Nov-90
+; Modified: Fri Mar 8 14:46:41 1996 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+
+;;;
+;;; Do all needed to build an slr table starting with a lisp syntax grammar.
+(in-package "ZEBU")
+
+(defun slr-tables-from-grammar (file-name &rest args)
+ (apply #'load-grammar file-name args)
+ (calculate-empty-string-derivers)
+ (calculate-first-sets)
+ (calculate-follow-sets)
+ (make-lr0-collection)
+ (build-parse-tables nil)
+ file-name)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; test:
+
+#||
+(slr-tables-from-grammar "ex1.zb")
+(format t "symbols: ~%")
+(cruise-symbols-2)
+(format t "productions: ~%")
+(print-productions)
+(format t "lr0 item sets: ~%")
+(print-collection nil)
+(format t "slr tables: ~%")
+(cruise-parse-tables)
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-slr.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-tables.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-tables.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,125 @@
+; -*- mode: CL -*- ------------------------------------------------- ;
+; File: zebu-tables.l
+; Description: Conversion to CL of the original Scheme program by (W M Wells)
+; Author: Joachim H. Laubsch
+; Created: 31-Oct-90
+; Modified: Mon Apr 11 14:11:29 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Revisions:
+; RCS $Log: $
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1989, by William M. Wells III
+;;; All Rights Reserved
+;;; Permission is granted for unrestricted non-commercial use.
+(in-package "ZEBU")
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; On the representation of parsing tables:
+;;;
+;;; Action function is an array, indexed by the state number,
+;;; of functions of grammar symbols represented as osets of
+;;; 3 element lists containing a g-symbol index, the character
+;;; s, r, or a for shift reduce or accept, and an integer encoding the
+;;; next state, or production index as appropriate.
+;;;
+;;; Goto for non-terminals will be represented by a parallel array
+;;; of osets of pairs whose cars are g-symbol indices, and whose
+;;; cdrs are state indices.
+
+(defvar *action-array*)
+(defvar *goto-array*)
+(declaim (type vector *action-array* *goto-array*))
+
+;;; An oset order function for parse table entries.
+(defun integer-function-order-function (a b)
+ (integer-order-function (car (the cons a)) (car (the cons b))))
+
+;;; Build the description of the state machine which is the lr-parser.
+;;; The *lr0-item-sets* correspond to the states of the parser machine.
+
+(defun build-parse-tables (doing-lalr1)
+ (setf *action-array* (make-sequence 'vector *lr0-item-set-count*))
+ (setf *goto-array* (make-sequence 'vector *lr0-item-set-count*))
+ (dotimes (i *lr0-item-set-count*)
+ (setf (svref (the vector *action-array*) i)
+ (make-oset :order-fn #'integer-function-order-function))
+ (setf (svref (the vector *goto-array*) i)
+ (make-oset :order-fn #'integer-function-order-function)))
+ (oset-for-each
+ #'(lambda (item-set)
+ (oset-for-each
+ #'(lambda (goto-elt)
+ ;; Car of goto-elt is g-sym, cdr is item-set.
+ (if (g-symbol-non-terminal? (car goto-elt))
+ (oset-insert! (cons (g-symbol-index (car goto-elt))
+ (item-set-index (cdr goto-elt)))
+ (svref (the vector *goto-array*)
+ (item-set-index item-set)))
+ (parse-table-insert! (g-symbol-index (car goto-elt))
+ :s
+ (item-set-index (cdr goto-elt))
+ item-set)))
+ (item-set-goto-map item-set))
+ (oset-for-each
+ #'(lambda (closure-item)
+ ;; Could these be kernel items?
+ (if (dot-at-right-end? closure-item)
+ (let* ((closure-item-production (item-production closure-item))
+ (lhs-closure-item-production (lhs closure-item-production)))
+ (if (eq *augmented-start-g-symbol* lhs-closure-item-production)
+ (parse-table-insert! (g-symbol-index *the-end-g-symbol*)
+ :a 0 item-set) ; accept, bogus 0
+ (oset-for-each
+ #'(lambda (gs)
+ (parse-table-insert!
+ (g-symbol-index gs)
+ :r
+ (production-index closure-item-production)
+ item-set))
+ ;; Here is the only difference between slr and lalr1
+ ;; (in the table construction phase).
+ (if doing-lalr1
+ (item-look-aheads closure-item)
+ (g-symbol-follow-set lhs-closure-item-production)))))))
+ (item-set-get-closure! item-set))
+ )
+ *lr0-item-sets*))
+
+
+;;; An auxillary function for adding an entry to a parse table.
+;;; A simple feature allows the system to be used with some
+;;; ambiguous grammars: if the variable *allow-conflicts* it true,
+;;; then when a conflict arises at table construction time, simply
+;;; prefer the action which is already in the tables.
+;;; This feature works for the "dangling else" problem.
+
+(defvar *allow-conflicts* t)
+(declaim (special *warn-conflicts*))
+
+(defun parse-table-insert! (g-sym-index action-key index item-set)
+ (let ((to-insert (list g-sym-index action-key index)))
+ (multiple-value-bind (inserted? the-item)
+ (oset-insert-2! to-insert
+ (svref *action-array* (item-set-index item-set)))
+ (unless inserted?
+ (when *warn-conflicts*
+ (warn "ACTION CONFLICT!!!-- state: ~S~%old entry: ~S new entry: ~S~%~
+ Continuing to build tables despite conflicts.~%~
+ Will prefer old entry: ~S"
+ (item-set-index item-set) the-item to-insert the-item))
+ (unless *allow-conflicts* (error "ACTION CONFLICT"))))))
+
+(declaim (inline get-print-name))
+(defun get-print-name (index)
+ (g-symbol-name (svref (the vector *symbol-array*) index)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-tables.l
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu-tree-attributes.lisp
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu-tree-attributes.lisp Wed Oct 17 09:04:46 2007
@@ -0,0 +1,836 @@
+; -*- mode: CL -*- ----------------------------------------------------- ;
+; File: zebu-tree-attributes.lisp
+; Description: Functions operating on abstract syntax trees
+; Author: Joachim H. Laubsch
+; Created: 26-Feb-93
+; Modified: Wed Oct 12 21:26:14 1994 (Joachim H. Laubsch)
+; Language: CL
+; Package: ZEBU
+; Status: Experimental (Do Not Distribute)
+; RCS $Header: $
+;
+; (c) Copyright 1990, Hewlett-Packard Company
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ZEBU")
+(require "zebu-kb-domain")
+(require "zebu-mg-hierarchy")
+(provide "zebu-tree-attributes")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; tree attributes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Plist implementation
+
+(declaim (inline KB-TREE-ATTRIBUTES))
+(defun KB-tree-attributes (class-name)
+ (get (the symbol class-name) 'KB-TREE-ATTRIBUTES))
+;----------------------------------------------------------------------------;
+; define-tree-attributes
+;-----------------------
+; for each class enter the tree attributes in the form:
+; ((<reader1> <reader2> ...) . (<writer1> <writer2> ...))
+; where <readeri> is the name of the accessor for slot i
+; <writeri> is a compiled function to set slot i
+
+(defun define-tree-attributes (class slots)
+ (let (writers)
+ (dolist (slot slots)
+ (let ((def `(lambda (x y)
+ (declare (type ,class x))
+ (setf (,slot x) y))))
+ (push
+ (compile nil def)
+ writers)))
+ (setf (get (the symbol class) 'KB-TREE-ATTRIBUTES)
+ (cons slots (nreverse writers))) ))
+
+;; The reason for this macro is that then the compiler does
+;; not need to be loaded when a file is loaded which contains
+;; def-tree-attributes forms
+#||
+(defmacro def-tree-attributes (class &rest slots)
+ (check-type class symbol)
+ (let (writers setters)
+ (dolist (slot slots)
+ (check-type slot symbol)
+ (let* ((setter (intern (format nil "SET-~a" slot)))
+ (def `(defun ,setter (x y)
+ (declare (type ,class x))
+ (setf (,slot x) y))))
+ (push def writers)
+ (push setter setters)))
+ `(progn
+ , at writers
+ (setf (get ',class 'KB-TREE-ATTRIBUTES)
+ (cons
+ ',slots
+ (mapcar #'(lambda (setter) (symbol-function setter))
+ ',(nreverse setters)))))))
+
+;; avoid duplicate definitions
+(defmacro def-tree-attributes (class &rest slots)
+ (check-type class symbol)
+ (let (writers setters)
+ (dolist (slot slots)
+ (check-type slot symbol)
+ (let ((setter (intern (format nil "SET-~a" slot))))
+ (unless (fboundp setter)
+ (push `(defun ,setter (x y)
+ (declare (type ,class x))
+ (setf (,slot x) y))
+ writers))
+ (push setter setters)))
+ `(progn
+ (eval-when (compile eval) , at writers)
+ (setf (get ',class 'KB-TREE-ATTRIBUTES)
+ (cons
+ ',slots
+ (mapcar #'(lambda (setter)
+ (symbol-function setter))
+ ',(nreverse setters)))))))
+
+||#
+
+(defmacro def-tree-attributes (class &rest slots)
+ (check-type class symbol)
+ (flet ((wrong-slotdescr (d)
+ (error "Tree attribute ~s not a symbol~%or of the form (<symbol> :set)"
+ d)))
+ (let (writers setters set-valued-slots)
+ (dolist (slotdescr slots)
+ (let (slot setter)
+ (typecase slotdescr
+ (symbol (setf slot slotdescr))
+ (cons (setf slot (first slotdescr))
+ (push slotdescr set-valued-slots))
+ (t (wrong-slotdescr slotdescr)))
+ (setf setter (intern (format nil "SET-~a" slot)))
+ (unless (fboundp setter)
+ (push `(defun ,setter (x y)
+ (declare (type ,class x))
+ (setf (,slot x) y))
+ writers))
+ (push setter setters)))
+ `(progn
+ (eval-when (compile eval #+CLISP load) , at writers)
+ ,@(mapcar #'(lambda (set-valued-slot)
+ (let ((type (second set-valued-slot)))
+ (if (eq type :set)
+ `(zb::KB-def-slot-type
+ ',(first set-valued-slot) :set)
+ (wrong-slotdescr set-valued-slot))))
+ set-valued-slots)
+ (setf (get ',class 'KB-TREE-ATTRIBUTES)
+ (cons
+ ',slots
+ (list . ,(mapcar #'(lambda (setter) `(function ,setter))
+ (nreverse setters)))))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Hashtable implementation
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#||
+(defvar *KB-TREE-ATTRIBUTES* (make-hash-table))
+(declaim (type HASH-TABLE *KB-TREE-ATTRIBUTES*))
+
+(declaim (inline KB-TREE-ATTRIBUTES))
+(defun KB-TREE-ATTRIBUTES (class-name)
+ (gethash class-name *KB-TREE-ATTRIBUTES*))
+
+;----------------------------------------------------------------------------;
+; define-tree-attributes
+;-----------------------
+; for each class enter the tree attributes in the form:
+; ((<reader1> <reader2> ...) . (<writer1> <writer2> ...))
+; where <readeri> is the name of the accessor for slot i
+; <writeri> is a compiled function to set slot i
+
+(declaim (inline KB-TREE-ATTRIBUTES))
+(defun define-tree-attributes (class slots)
+ (let (writers)
+ (dolist (slot slots)
+ (let ((def `(lambda (x y)
+ (declare (type ,class x))
+ (setf (,slot x) y))))
+ (push
+ (compile nil def)
+ writers)))
+ (setf (gethash class *KB-TREE-ATTRIBUTES*)
+ (cons slots (nreverse writers))) ))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Set/Sequence Valued Slots
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar *KB-SLOT-types* (make-hash-table))
+(declaim (type HASH-TABLE *KB-SLOT-types*))
+
+(declaim (inline KB-set-valued-slot-p))
+(defun KB-set-valued-slot-p (reader)
+ (eq (gethash reader *KB-SLOT-types*) ':set))
+
+(defun KB-def-slot-type (reader type)
+ (setf (gethash reader *KB-SLOT-types*) type))
+
+;----------------------------------------------------------------------------;
+; kids
+;-----
+; collect all the kids of OBJECT which are in KB-Domain.
+; if a kid is a SET or SEQUENCE of subnodes, include those which are
+; in KB-Domain.
+
+(defun kids (object &aux R)
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (let ((ta (KB-tree-attributes (type-of object))))
+ (when ta
+ (dolist (reader (readers ta) R)
+ (declare (symbol reader))
+ (let ((kids (funcall (the function (symbol-function reader)) object)))
+ (cond ((consp kids)
+ (dolist (k (the list kids))
+ (when (KB-Domain-p k) (push k R))))
+ ((KB-Domain-p kids)
+ (push kids R))))))))
+ )
+
+;-----------------------------------------------------------------------------;
+; subexpressions
+;---------------
+;
+; All immediate subexpressions of a KB-Domain-element
+; anything not of type KB-Domain-element does not have components
+
+(declaim (inline subexpressions))
+(defun subexpressions (KB-Domain-element)
+ (check-type KB-Domain-element KB-Domain)
+ (kids KB-Domain-element))
+
+;----------------------------------------------------------------------------;
+; for-each-kid
+;-------------
+; iterate over all kids of NODE which are in KB-Domain, calling FUN.
+; NODE must be of type KB-Domain.
+; Returns nil
+
+(defun for-each-kid (FUN NODE)
+ (declare (type function fun))
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (if (KB-Domain-p NODE) ; (subtypep typ 'KB-Domain)
+ (let ((ta (KB-tree-attributes (type-of node))))
+ (when ta
+ (dolist (reader (readers ta))
+ (declare (symbol reader))
+ (let ((subnode (funcall (the function (symbol-function reader)) NODE)))
+ (cond
+ ((CONSp subnode) ; value is a set or sequence
+ (dolist (kid (the list subnode))
+ (when (KB-Domain-p kid) (funcall FUN kid))))
+ ((KB-Domain-p subnode) (funcall fun subnode)))))))
+ (error "Can't iterate over non KB-Domain object: ~S" NODE))))
+
+(defun for-each-kid! (FUN NODE)
+ ;; just like for-each-kid, but if FUN(kid) ~eq kid then replace kid
+ ;; by the value of FUN(kid)
+ ;; returns NODE
+ (declare (type function fun))
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (if (KB-Domain-p NODE) ; (subtypep typ 'KB-Domain)
+ (macrolet ((readers (x) `(the list (car (the cons ,x))))
+ (writers (x) `(the list (cdr (the cons ,x)))))
+ (let ((ta (KB-tree-attributes (type-of node))))
+ (if (null ta)
+ NODE
+ ;; ta ((<reader1> <reader2> ...) (<writer1> <writer2> ...))
+ (do ((r (readers ta) (cdr r)) (w (writers ta) (cdr w)))
+ ((null r) NODE)
+ (let* ((reader (car (the cons r)))
+ (subnode (funcall (the function (symbol-function reader))
+ NODE)))
+ (cond
+ ((CONSp subnode) ; value is a set or sequence
+ (do ((kids (the list subnode) (cdr kids)))
+ ((null kids))
+ (let ((kid (car (the cons kids))))
+ (if (KB-Domain-p kid)
+ (let ((newval (funcall FUN kid)))
+ (unless (eq kid newval)
+ (setf (car kids) newval)))))))
+ ((KB-Domain-p subnode)
+ (let ((vv (funcall fun subnode)))
+ (unless (eq vv subnode)
+ ;; (eval `(setf (,reader ,NODE) ',vv))
+ (funcall (the compiled-function (car w)) NODE vv))))))))))
+ (error "Can't iterate over non KB-Domain object: ~S" NODE)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; preorder-transform
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#||
+(defun preorder-transform (node funs)
+ (check-type node KB-Domain)
+ (check-type funs list)
+ (macrolet ((readers (x) `(the list (car (the cons ,x))))
+ (writers (x) `(the list (cdr (the cons ,x))))
+ (mung-node (n) `(preorder-transform-aux (transform-node ,n))))
+ (labels ((preorder-transform-aux (n)
+ (let ((ta (KB-tree-attributes (type-of n))))
+ (when (null ta)
+ (return-from preorder-transform-aux n))
+ (do ((r (readers ta) (cdr r)) (w (writers ta) (cdr w)))
+ ((null r) n)
+ (let* ((reader (car (the cons r)))
+ (subnode (funcall (the function (symbol-function reader))
+ n)))
+ (cond ((CONSp subnode) ; value is a set or sequence
+ (do ((kids (the list subnode) (cdr kids)))
+ ((null kids))
+ (let ((kid (car (the cons kids))))
+ (when (KB-Domain-p kid)
+ (let ((newval (mung-node kid)))
+ (unless (eq kid newval)
+ (setf (car (the cons kids)) newval)))))))
+ ((KB-Domain-p subnode)
+ (let ((subnode1 (mung-node subnode)))
+ (unless (eq subnode1 subnode)
+ (funcall (car (the cons w)) n subnode1)))))))))
+ (transform-node (n)
+ (let (fun-fired?)
+ (do ((funRest (the list funs))
+ (oldn (KB-copy n) (KB-copy n)))
+ ((null funRest) n)
+ (let ((fun (car funRest)))
+ ;; run each function to acquiescence
+ ;; each function returns 2 values,
+ ;; (1) the new node
+ ;; (2) whether there was a change in this node
+ ;; that may make it necessary for this function to run
+ ;; again on the same node
+ ;; if a function had an effect --- fun-fired? = T ---
+ ;; we start all over with all functions (except the current)
+ (loop do (multiple-value-bind (v change?)
+ (funcall (the Function fun) n)
+ (if change?
+ (setq n v)
+ (if (eq n v)
+ (return n)
+ (setq n v)))
+ (format t "~%;; ~S~%;; ~S~%;; --> ~S" fun oldn v)
+ (setq fun-fired? t)))
+ (if fun-fired?
+ (setq funRest (remove fun funs)
+ fun-fired? nil)
+ (pop funRest)))))))
+ (mung-node node))))
+||#
+(defun preorder-transform (node funs)
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (check-type node KB-Domain) (check-type funs list)
+ (macrolet ((readers (x) `(the list (car (the cons ,x))))
+ (writers (x) `(the list (cdr (the cons ,x))))
+ (mung-node (n) `(preorder-transform-aux (transform-node ,n))))
+ (flet ((transform-node (n)
+ (let (fun-fired?)
+ (do ((funRest (the list funs)))
+ ((null funRest) n)
+ (let ((fun (car funRest)))
+ ;; run each function to acquiescence
+ ;; each function returns 2 values,
+ ;; (1) the new node
+ ;; (2) whether there was a change in this node
+ ;; that may make it necessary for this function to run
+ ;; again on the same node
+ ;; if a function had an effect --- fun-fired? = T ---
+ ;; we start all over with all functions (except the current)
+ (loop (multiple-value-bind (v change?)
+ (funcall (the Function fun) n)
+ (if change?
+ (setq n v)
+ (if (eq n v)
+ (return n)
+ (setq n v)))
+ ;; (format t "~%;; ~S~%;; ~S~%;; --> ~S" fun oldn v)
+ (setq fun-fired? t)))
+ (if fun-fired?
+ (setq funRest (remove fun funs)
+ fun-fired? nil)
+ (pop funRest)))))))
+ (labels ((preorder-transform-aux (n)
+ (let ((ta (KB-tree-attributes (type-of n))))
+ (if (null ta)
+ n
+ (do ((r (readers ta) (cdr r))
+ (w (writers ta) (cdr w)))
+ ((null r) n)
+ (let* ((reader (car (the cons r)))
+ (subnode (funcall
+ (the function
+ (symbol-function reader))
+ n)))
+ (cond ((CONSp subnode) ; value is a set or sequence
+ (do ((kids (the list subnode) (cdr kids)))
+ ((null kids))
+ (let ((kid (car (the cons kids))))
+ (when (KB-Domain-p kid)
+ (let ((newval (mung-node kid)))
+ (unless (eq kid newval)
+ (setf (car (the cons kids)) newval)))))))
+ ((KB-Domain-p subnode)
+ (let ((subnode1 (mung-node subnode)))
+ (unless (eq subnode1 subnode)
+ (funcall (car (the cons w))
+ n subnode1)))))))))))
+ (mung-node node)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; postorder-transform
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; just like preorder, but descend down first to the leaves, and then
+;; transform from bottom-up
+(defun postorder-transform (node funs &optional (exhaustive nil))
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (check-type node KB-Domain) (check-type funs list)
+ (macrolet ((readers (x) `(the list (car (the cons ,x))))
+ (writers (x) `(the list (cdr (the cons ,x))))
+ ;; here is the difference to preorder: recurse first!
+ (mung-node (n)
+ `(transform-node (postorder-transform-aux ,n))))
+ (flet ((transform-node (n)
+ (block transform-node
+ ;; (format t "~%transform-node: ~S" n)
+ (do ((funRest (the list funs)) rule-fired?)
+ ((null funRest) n)
+ (let ((fun (car funRest)))
+ ;; run each function to acquiescence
+ ;; each function returns 2 values,
+ ;; (1) the new node
+ ;; (2) whether there was a change in this node
+ ;; that may make it necessary for this function to run
+ ;; again on the same node
+ ;; if a function had an effect --- fun-fired? = T ---
+ ;; we start all over at the leaves
+ (loop (multiple-value-bind (v change?)
+ (funcall (the Function fun) n)
+ (if change?
+ (setq n v)
+ (if (eq n v)
+ (return nil)
+ (setq n v)))
+ (if exhaustive
+ (return-from transform-node
+ (values n t))
+ (setq rule-fired? t))))
+ (if rule-fired?
+ (setq funRest (remove fun funs)
+ rule-fired? nil)
+ (pop funRest)))))))
+ (labels ((postorder-transform-aux (n)
+ (let ((ta (KB-tree-attributes (type-of n))))
+ (if (null ta)
+ n
+ ;; (format t "~%postorder-transform: ~S" n)
+ (do ((r (readers ta) (cdr r)) (w (writers ta) (cdr w)))
+ ((null r) n)
+ (let* ((reader (car (the cons r)))
+ (subnode (funcall (the function
+ (symbol-function reader))
+ n)))
+ (cond ((CONSp subnode) ; value is a set or sequence
+ (do ((kids (the list subnode) (cdr kids)))
+ ((null kids))
+ (let ((kid (car (the cons kids))))
+ (when (KB-Domain-p kid)
+ (loop
+ (multiple-value-bind (newval rule-fired?)
+ (mung-node kid)
+ (if (eq kid newval)
+ (if rule-fired?
+ (if exhaustive
+ nil ; go on
+ (return nil))
+ (return nil))
+ (progn
+ (setf (car (the cons kids)) newval)
+ (setf kid newval)
+ (if exhaustive
+ nil ; go on
+ (return nil))))))))))
+ ((KB-Domain-p subnode)
+ (loop
+ (multiple-value-bind (subnode1 rule-fired?)
+ (mung-node subnode)
+ (if (eq subnode1 subnode)
+ (if rule-fired?
+ (if exhaustive
+ nil ; go on
+ (return nil))
+ (return nil))
+ (progn
+ (funcall (car (the cons w)) n subnode1)
+ (setf subnode subnode1)
+ (if exhaustive
+ nil ; go on
+ (return nil))))))))))))))
+ (loop (multiple-value-bind (new rule-fired?)
+ (mung-node node)
+ (if exhaustive
+ (if (or rule-fired? (not (eq new node)))
+ (setq node new)
+ (return new))
+ (return new))))))))
+
+#||
+(defun descendants (object)
+ (let ((R (list object)))
+ (dolist (kid (kids object) R)
+ (nconc R (descendants kid)))))
+||#
+;; more efficiently:
+
+;----------------------------------------------------------------------------;
+; descendants
+;------------
+;
+
+(defun descendants (object &aux R)
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (check-type object KB-Domain)
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (labels ((descendants-aux (object)
+ (let ((ta (KB-tree-attributes (type-of object))))
+ (when ta
+ (dolist (reader (readers ta))
+ (declare (symbol reader))
+ (let ((kids (funcall (the function (symbol-function reader))
+ object)))
+ (cond ((consp kids)
+ (dolist (k (the list kids))
+ (push k R)
+ (descendants-aux k)))
+ ((KB-Domain-p kids)
+ (push kids R)
+ (descendants-aux kids)))))))))
+ (descendants-aux object)
+ (nreverse (cons object R)))))
+
+;----------------------------------------------------------------------------;
+; for-each-descendant
+;--------------------
+; like for-each-kid
+; Returns nil
+
+(defun for-each-descendant (fn object)
+ (declare (type function fn))
+ (check-type object KB-Domain)
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (labels ((descendants-aux (object)
+ (let ((ta (KB-tree-attributes (type-of object))))
+ (when ta
+ (dolist (reader (readers ta))
+ (declare (symbol reader))
+ (let ((kids (funcall (the function (symbol-function reader))
+ object)))
+ (cond ((consp kids)
+ (dolist (k (the list kids))
+ (funcall fn k)
+ (descendants-aux k)))
+ ((KB-Domain-p kids)
+ (funcall fn kids)
+ (descendants-aux kids)))))))))
+ (funcall fn object)
+ (descendants-aux object))))
+
+;----------------------------------------------------------------------------;
+; KB-copy
+;--------
+; A copy function that walks down all the tree-attributes and copies
+; unless called with :recursive-p Nil
+
+#+LUCID
+(defmacro %copy-structure (x)
+ `(SYSTEM:copy-structure ,x))
+
+#-LUCID
+(defun %copy-structure (term)
+ (let* ((ttype (type-of term))
+ (copy-fn (find-symbol (concatenate
+ 'string "COPY-" (symbol-name ttype))
+ (symbol-package ttype))))
+ (if (fboundp copy-fn)
+ (funcall copy-fn term)
+ (error "No COPY function defined for ~s:~a" term ttype))))
+
+(defun KB-copy (term &optional (recursive-p t))
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (macrolet ((readers (x) `(the list (car (the cons ,x))))
+ (writers (x) `(the list (cdr (the cons ,x)))))
+ (labels ((KB-copy-aux (term)
+ (declare (type KB-Domain term))
+ (let ((new-term (%COPY-STRUCTURE term))
+ (ta (KB-tree-attributes (type-of term))))
+ (if (null ta)
+ new-term
+ (do ((r (readers ta) (cdr r)) (w (writers ta) (cdr w)))
+ ((null r) new-term)
+ (let* ((reader (car (the cons r)))
+ (writer (car (the cons w)))
+ (subnode (funcall (the function
+ (symbol-function
+ (the symbol reader)))
+ new-term)))
+ (cond ((CONSp subnode) ; value is a set or sequence
+ (let ((newsubnode
+ (copy-list (the list subnode))))
+ (funcall (the compiled-function writer)
+ new-term newsubnode)
+ (do ((nrest newsubnode (cdr nrest)))
+ ((null nrest))
+ (let ((kid (car (the cons nrest))))
+ (when (KB-Domain-p kid)
+ (setf (car (the cons nrest))
+ (KB-copy-aux kid)))))))
+ ((KB-Domain-p subnode)
+ (funcall (the compiled-function writer)
+ new-term
+ (KB-copy-aux subnode))))))))))
+ (if recursive-p
+ (KB-copy-aux term)
+ (%COPY-STRUCTURE term)))))
+
+#||
+;; test
+(setq $a (eval (READ-PARSER "walk(agt : John ) ")))
+(setq $aa (KB-copy $a))
+;;
+(car (KB-tree-attributes (type-of $a)))
+;; (ATOMIC-WFF--PREDICATE ATOMIC-WFF--ROLE-ARGUMENT-PAIRS)
+(eq (ATOMIC-WFF--PREDICATE $a) (ATOMIC-WFF--PREDICATE $aa)) ; NIL
+(equal (ATOMIC-WFF--PREDICATE $a) (ATOMIC-WFF--PREDICATE $aa)) ; Nil
+(kb-equal (ATOMIC-WFF--PREDICATE $a) (ATOMIC-WFF--PREDICATE $aa)) ; T
+;; note: equalp does recursive descent on structures
+(equalp (ATOMIC-WFF--PREDICATE $a) (ATOMIC-WFF--PREDICATE $aa)) ; T
+
+(setq $b (eval (READ-PARSER "and{walk(agent: John) talk(agent: John)}")))
+(type-of $b)
+(car (KB-tree-attributes (type-of $b)))
+(setq $bb (KB-copy $b))
+
+||#
+
+;----------------------------------------------------------------------------;
+; KB-equalp
+;----------
+; compares 2 objects of the KB-domain for equality. (something like term-equal?)
+; considers only tree-attributes as relevant
+; This is easier to extend for set-valued slots:
+
+(defun KB-equal (a b)
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (check-type a KB-domain)
+ (check-type b KB-domain)
+ ;; ignores implementation of constants
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (labels
+ ((KB-equal-aux (a b)
+ (block KB-equal-aux
+ (let ((a-typ (type-of a)) (b-typ (type-of b)))
+ (unless (equal a-typ b-typ) (return-from KB-equal-aux 'Nil))
+ (let ((ta (KB-tree-attributes a-typ)))
+ (or
+ (null ta)
+ (dolist (reader (readers ta) t)
+ (declare (symbol reader))
+ (let* ((reader-fn (symbol-function reader))
+ (a-subnode (funcall reader-fn a))
+ (b-subnode (funcall reader-fn b)))
+ (unless (eq a-subnode b-subnode)
+ (unless (equal (type-of a-subnode) (type-of b-subnode))
+ (return-from KB-equal-aux 'Nil))
+ (cond
+ ((CONSp a-subnode) ; value is a set or sequence
+ (if (= (the fixnum (length (the list a-subnode)))
+ (the fixnum (length (the list b-subnode))))
+ (if (KB-set-valued-slot-p reader)
+ ;; We have 2 sets to compare
+ ;; resort to this to avoid consing, see
+ ;; comment below:
+ (unless
+ (and (dolist (bb (the list b-subnode) t)
+ (unless (dolist (aa (the list a-subnode))
+ (when (KB-equal-aux aa bb)
+ (return t)))
+ (return nil)))
+ (dolist (aa (the list a-subnode) t)
+ (unless (dolist (bb (the list b-subnode))
+ (when (KB-equal-aux aa bb)
+ (return t)))
+ (return nil))))
+ (return-from KB-equal-aux 'Nil))
+ ;; We have two sequences to compare
+ ;; Their elements must be in KB-domain
+ (do ((arest a-subnode (cdr arest))
+ (brest b-subnode (cdr brest)))
+ ((atom arest) (eq arest brest))
+ (let ((aa (car (the cons arest)))
+ (bb (car (the cons brest))))
+ (unless (KB-equal-aux aa bb)
+ (return-from KB-equal-aux 'Nil)))))
+ (return-from KB-equal-aux 'Nil)))
+ ((KB-domain-p a-subnode)
+ (unless (KB-equal-aux a-subnode b-subnode)
+ (return-from KB-equal-aux 'Nil)))
+ ((symbolp a-subnode)
+ (unless (string-equal (symbol-name a-subnode)
+ (symbol-name b-subnode))
+ (return-from KB-equal-aux 'Nil)))
+ (T (unless (equal a-subnode b-subnode)
+ (return-from KB-equal-aux 'Nil)))))))))))))
+ (or (equal a b)
+ (KB-equal-aux a b)))))
+
+#||
+(KB-equal (read-nll "DESKTOP-OBJECT(NAME: 'Orders--STR')")
+ (read-nll "DESKTOP-OBJECT(NAME: Orders--STR)"))
+(KB-equal (read-nll "WORK(agent:+{'ABRAMS','BROWNE'})")
+ (read-nll "WORK(agent:+{ABRAMS,BROWNE})"))
+(compile 'KB-equalp)
+||#
+;----------------------------------------------------------------------------;
+; KB-compare
+;-----------
+;; the following is useful for testing
+
+(defun KB-compare (a b &optional verbose
+ &aux (msg "~% KB-compare ~S:~S ~% = ~S:~S"))
+ (declare (inline KB-TREE-ATTRIBUTES))
+ (check-type a KB-domain)
+ (check-type b KB-domain)
+ (macrolet ((readers (x) `(the list (car (the cons ,x)))))
+ (labels
+ ((KB-equal-aux (a b)
+ (block KB-equal-aux
+ (let ((a-typ (type-of a)) (b-typ (type-of b)))
+ (unless (equal a-typ b-typ)
+ (when verbose (format t msg a a-typ b b-typ))
+ (return-from KB-equal-aux 'Nil))
+ (if (typep a 'KB-domain)
+ (let ((ta (KB-tree-attributes a-typ)))
+ (or
+ (null ta)
+ (dolist (reader (readers ta) t)
+ (declare (symbol reader))
+ (let* ((reader-fn (symbol-function reader))
+ (a-subnode (funcall reader-fn a))
+ (b-subnode (funcall reader-fn b)))
+ (when verbose
+ (format t msg
+ a-subnode (type-of a-subnode)
+ b-subnode (type-of b-subnode)))
+ (unless (eq a-subnode b-subnode)
+ (unless (equal (type-of a-subnode) (type-of b-subnode))
+ (return-from KB-equal-aux 'Nil))
+ (cond
+ ((CONSp a-subnode) ; value is a set or sequence
+ (if (= (the fixnum (length (the list a-subnode)))
+ (the fixnum (length (the list b-subnode))))
+ (if (KB-set-valued-slot-p reader)
+ ;; We have 2 sets to compare
+ ;; resort to this to avoid consing, see
+ ;; comment below:
+ (unless
+ (and (dolist (bb (the list b-subnode) t)
+ (unless (dolist (aa (the list a-subnode))
+ (when (KB-equal-aux aa bb)
+ (return t)))
+ (return nil)))
+ (dolist (aa (the list a-subnode) t)
+ (unless (dolist (bb (the list b-subnode))
+ (when (KB-equal-aux aa bb)
+ (return t)))
+ (return nil))))
+ (return-from KB-equal-aux 'Nil))
+ ;; We have two sequences to compare
+ ;; Their elements must be in KB-domain
+ (do ((arest a-subnode (cdr arest))
+ (brest b-subnode (cdr brest)))
+ ((atom arest) (eq arest brest))
+ (let ((aa (car (the cons arest)))
+ (bb (car (the cons brest))))
+ (or (equal aa bb)
+ (KB-equal-aux aa bb)
+ (return-from KB-equal-aux 'Nil)))))
+ (return-from KB-equal-aux 'Nil)))
+ ((KB-domain-p a-subnode)
+ (unless (KB-equal-aux a-subnode b-subnode)
+ (return-from KB-equal-aux 'Nil)))
+ ((symbolp a-subnode)
+ (unless (string= (symbol-name a-subnode)
+ (symbol-name b-subnode))
+ (return-from KB-equal-aux 'Nil)))
+ (T (unless (equal a-subnode b-subnode)
+ (return-from KB-equal-aux 'Nil)))))))))
+ (equal a b))))))
+ (or (eq a b)
+ (KB-equal-aux a b)))))
+
+#|| test
+(KB-equal (make-Placeholder-Var :-Name 'u486)
+ (make-Placeholder-Var :-Name 'subject-nl-semantics))
+||#
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; tree-attributes for kb-sequence
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(def-tree-attributes kb-sequence
+ kb-sequence-first kb-sequence-rest)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Generate (define-tree-attributes ..) for zebu
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Das nachfolgende kannst Du zur Generierung der Tree-Attributes
+; verwenden. Prepare-Tree-Attributes kann auch zur Laufzeit die
+; Attribute eintragen; wenn Du die Definitionen ins Domainfile
+; uebernimmst, muesste Zebu define-tree-attributes immer kennen
+; (zebu-kernel?).
+
+;; diese hashtable ist fuer zebra wiederverwenbar (der gruene punkt)
+
+(defparameter *local-accessor-hashtable* (make-hash-table :test #'equal))
+
+(defun labelnode2accessor (label topnode)
+ "Translates a label symbol and its topnode
+ into a structure accessor (-predicate atomic-wff -> at-wff--pred)"
+ (let* ((key (cons label topnode))
+ (constr (gethash key *local-accessor-hashtable*)))
+ (if constr
+ constr
+ (setf (gethash key *local-accessor-hashtable*)
+ (intern (concatenate 'string
+ (symbol-name topnode) "-"
+ (symbol-name label)))))))
+
+(defun prepare-tree-attributes (type &optional (output-only nil) (stream T))
+ "sets kb-tree-attributes of type and all of its subtypes"
+ (let ((slots (kb-slots type))
+ (slot-funs nil))
+ (dolist (item slots)
+ (if (symbolp item)
+ (push (labelnode2accessor item type) slot-funs)
+ ;; else
+ (push (labelnode2accessor (first item) type) slot-funs)))
+ (when slot-funs
+ (setq slot-funs (nreverse slot-funs))
+ (if output-only
+ (format stream "~S~%~%"
+ `(define-tree-attributes ',type '(, at slot-funs)))
+ ;; else
+ (define-tree-attributes type slot-funs)))
+ (dolist (item (kb-subtypes type))
+ (prepare-tree-attributes item output-only stream))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; End of zebu-tree-attributes.lisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Added: vendor/zebu/zebu.asd
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu.asd Wed Oct 17 09:04:46 2007
@@ -0,0 +1,30 @@
+;;; -*- Lisp -*-
+
+(in-package #:asdf)
+
+(defsystem #:zebu
+ :version "3.5.5"
+ :components
+ ((:module "zebu-kernel"
+ ;; Functions needed in the ZEBU run-time and
+ ;; compile-time enironment
+ :pathname ""
+ :components
+ ((:file "zebu-package")
+ (:file "zebu-aux"
+ :in-order-to
+ ((compile-op (load-op "zebu-package"))))
+ (:file "zebu-mg-hierarchy"
+ :in-order-to
+ ((compile-op (load-op "zebu-aux"))))))
+ (:module "zebu-runtime"
+ ;; Run time system for LALR(1) parser
+ :pathname ""
+ :depends-on ("zebu-kernel")
+ :components
+ ((:file "zebu-loader")
+ (:file "zebu-driver"
+ :in-order-to ((compile-op (load-op "zebu-loader"))))
+ (:file "zebu-actions"
+ :in-order-to ((compile-op (load-op "zebu-loader"))))))))
+
Added: vendor/zebu/zebu.system
==============================================================================
--- (empty file)
+++ vendor/zebu/zebu.system Wed Oct 17 09:04:46 2007
@@ -0,0 +1,22 @@
+;;; -*- Lisp -*-
+
+(mk:defsystem "zebu"
+ :source-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/"
+ :binary-pathname "/users/students/rschlatt/lisp/zebu-3.5.5/binary/"
+ ;;:package "ZEBU"
+ :components ((:module "zebu-kernel"
+ :source-pathname ""
+ :components ((:file "zebu-defsystem-package")
+ (:file "zebu-aux"
+ :depends-on ("zebu-defsystem-package"))
+ (:file "zebu-mg-hierarchy"
+ :depends-on ("zebu-defsystem-package"))))
+ (:module "zebu-runtime"
+ :source-pathname ""
+ :depends-on ("zebu-kernel")
+ :components ((:file "zebu-loader")
+ (:file "zebu-driver"
+ :depends-on ("zebu-loader"))
+ (:file "zebu-actions"
+ :depends-on ("zebu-loader"))))))
+
More information about the Cl-net-snmp-cvs
mailing list