[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/wisi d15913f 4/4: Release version 3.1.5
From: |
Stephen Leake |
Subject: |
[elpa] externals/wisi d15913f 4/4: Release version 3.1.5 |
Date: |
Fri, 30 Jul 2021 19:33:07 -0400 (EDT) |
branch: externals/wisi
commit d15913f4fd6a5bc545c2a656645b44fc123c4979
Author: Stephen Leake <stephen_leake@stephe-leake.org>
Commit: Stephen Leake <stephen_leake@stephe-leake.org>
Release version 3.1.5
* .gitignore: More build artifacts.
* NEWS: Fix release date.
* doclicense.texi: New file.
* wisi.info: Delete; elpa builds it, so no longer in git.
* README: Bump version.
* wisi.el:
* wisi.texi:
* wisitoken-user_guide.texinfo: New file.
---
.gitignore | 3 +
NEWS | 2 +-
README | 2 +-
doclicense.texi | 507 +++++++++++++++++
wisi.el | 4 +-
wisi.info | 1294 ------------------------------------------
wisi.texi | 4 +-
wisitoken-user_guide.info | 611 --------------------
wisitoken-user_guide.texinfo | 616 ++++++++++++++++++++
9 files changed, 1132 insertions(+), 1911 deletions(-)
diff --git a/.gitignore b/.gitignore
index 5f08039..cb87271 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
/wisi-pkg.el
/wisi-autoloads.el
*.elc
+obj/
+wisi.gpr
+wisitoken-user_guide.info
diff --git a/NEWS b/NEWS
index 952e6c7..9264d77 100644
--- a/NEWS
+++ b/NEWS
@@ -7,7 +7,7 @@ Please send wisi bug reports to bug-gnu-emacs@gnu.org, with
* wisi 3.1.5
-29 Jul 2021
+30 Jul 2021
** Update several SAL files for compatibility with gnat FSF 11, Pro
22, Community 2021.
diff --git a/README b/README
index 7e3ef01..6132ef2 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Emacs wisi package 3.1.3
+Emacs wisi package 3.1.5
The wisi package provides utilities for using generalized
error-correcting LR parsers (in external processes) to do indentation,
diff --git a/doclicense.texi b/doclicense.texi
new file mode 100644
index 0000000..a511ffc
--- /dev/null
+++ b/doclicense.texi
@@ -0,0 +1,507 @@
+@c -*-texinfo-*-
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008, 2009 Free Software
Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/wisi.el b/wisi.el
index d9150f3..1c4347c 100644
--- a/wisi.el
+++ b/wisi.el
@@ -7,8 +7,8 @@
;; Keywords: parser
;; indentation
;; navigation
-;; Version: 3.1.4
-;; package-requires: ((emacs "25.0") (seq "2.20"))
+;; Version: 3.1.5
+;; package-requires: ((emacs "25.3") (seq "2.20"))
;; URL: http://stephe-leake.org/ada/wisitoken.html
;;
;; This file is part of GNU Emacs.
diff --git a/wisi.info b/wisi.info
deleted file mode 100644
index e24dcee..0000000
--- a/wisi.info
+++ /dev/null
@@ -1,1294 +0,0 @@
-This is wisi.info, produced by makeinfo version 6.7 from wisi.texi.
-
-Copyright (C) 1999 - 2020 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, with the Front-Cover texts
- being "A GNU Manual", and with the Back-Cover Texts as in (a)
- below. A copy of the license is included in the section entitled
- "GNU Free Documentation License".
-
- (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
- modify this GNU manual. Buying copies from the FSF supports it in
- developing GNU and promoting software freedom."
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Wisi: (wisi). Error-correcting LR parsers and project integration.
-END-INFO-DIR-ENTRY
-
-
-File: wisi.info, Node: Top, Next: Overview, Up: (dir)
-
-Top
-***
-
-Wisi Version 3.1.2
-
-* Menu:
-
-* Overview::
-* Grammar actions::
-* Project extension::
-* GNU Free Documentation License::
-* Index::
-
-
-File: wisi.info, Node: Overview, Next: Grammar actions, Prev: Top, Up: Top
-
-1 Overview
-**********
-
-"wisi" used to be an acronym, but now it's just a name.
-
- The wisi package provides an elisp interface to an external parser.
-It assumes the parser generator package WisiToken
-(<http://stephe-leake.org/ada/wisitoken.html>, implemented in Ada), but
-can use any parser that meets the same API. wisi provides several
-grammar actions, to implement indentation, navigating, and syntax
-highlighting (fontification).
-
- wisi also provides an extension to Emacs 'project.el', providing
-operations useful for compilation and cross-reference.
-
-
-File: wisi.info, Node: Grammar actions, Next: Project extension, Prev:
Overview, Up: Top
-
-2 Grammar Actions
-*****************
-
-Grammar actions are specified in the grammar file, in a nonterminal
-declaration. We assume the user is familiar with parser grammars and
-grammar actions. For example, a simple "if" statement can be declared
-as:
-
- if_statement
- : IF expression THEN statements elsif_list ELSE statements END IF
SEMICOLON
- %((wisi-statement-action [1 statement-start 3 motion 6 motion 10
statement-end])
- (wisi-motion-action [1 3 5 6 10])
- (wisi-indent-action [nil
- [(wisi-hanging% ada-indent-broken (* 2
ada-indent-broken))
- ada-indent-broken]
- nil
- [ada-indent ada-indent] nil nil
- [ada-indent ada-indent] nil nil nil]))%
-
- The item before ':' is the "left hand side", or "nonterminal". The
-list of tokens after ':' is the "right hand side"; in general there can
-be more than one right hand side for each nonterminal (separated by
-'|').
-
- The items enclosed in "%()%" are the grammar actions. They are
-specified as list of elisp forms; an earlier version of the wisi package
-generated an elisp parser. We keep the elisp form because it is
-compact, and easier to read and write than the equivalent Ada code. The
-'wisi-bnf-generate' tool converts the elisp into the required Ada
-statements.
-
- There are two classes of actions; in-parse and post-parse. WisiToken
-calls these "semantic checks" and "user actions". The in-parse actions
-are done as parsing procedes; they provide extra checks that can cause
-the parse to fail. Currently the only one provided is 'match-names'; it
-is used to check that the declaration and end names in named Ada blocks
-are the same (which can aid significantly in error correction). In the
-grammar file, in-parse actions are specified in a second '%()%' block,
-which can be omitted if empty. In this document, the term "action"
-means "post-parse action", we use "in-parse action" unless the meaning
-is clear from context.
-
- Executing the wisi grammar actions creates text properties in the
-source file; those text properties are then used by elisp code for
-various purposes.
-
- The text properties applied are:
-
-'wisi-cache'
- This should be named 'wisi-navigate', but isn't for historical
- reasons (there used to be only one kind of text property).
-
- The property contains a 'wisi-cache' object, containing:
-
- 'nonterm'
- The nonterminal in the grammar production that specified the
- action that produced this text property.
-
- 'token'
- A token identifier naming a token in the production right hand
- side containing the text this text property is applied to.
-
- 'last'
- The position of the last character in the token, relative to
- the first character (0 indexed). The text property is only
- applied to the first character in the token (mostly for
- historical reasons).
-
- 'class'
- A token class; see the list of possible values in
- 'wisi-statement-action' below.
-
- 'containing'
- A marker pointing to the start of the containing token for
- this token; only 'nil' for the outermost containing token in a
- file.
-
- 'prev'
- A marker pointing to the previous "motion token" in the
- statement or declaration. These are normally language
- keywords, but can be other things.
-
- 'next'
- A marker pointing to the next "motion token" in the statement
- or declaration.
-
- 'end'
- A marker pointing to the end of the statement or declaration.
-
- wisi provides motion commands for going to the various markers.
-
-'wisi-name'
- Contains no data, applied to a "name" of some sort. wisi provides
- commands for finding the next/previous name, and returning the
- text. Useful for the names of subprograms, which can then be used
- to build a completion table; see
- 'wisi-xref-identifier-completion-table'.
-
-'font-lock-face'
- The standard font-lock property, specifying the face for the text.
-
- Some major modes do not use this for simple keywords; they use
- font-lock regular expressions instead. One reason for this is so
- keywords are still highlighted when the parser fails, which can
- happen if there are severe syntax errors.
-
- Other items, like function and package names, are typically marked
- with 'font-lock-face' by the parser.
-
-'fontified'
- Another standard font-lock text property; applied whenever
- 'font-lock-face' is.
-
-'wisi-indent'
- Contains the indent (in characters) for the next line; applied to
- the newline character on the preceding line. The first line in a
- buffer is assumed to have indent 0.
-
- Each action is classified as one of 'navigate, face, indent,
-in-parse'; when actions are executed, only one of the first three
-classes is executed (in-parse is always executed). This reflects the
-reasons the parser is run; to figure out how to go somehere (end of
-current statement, start of current procedure, etc), to apply faces for
-syntax highlighting, or to indent the code.
-
-* Menu:
-
-* Navigate actions::
-* Face actions::
-* Indent actions::
-* In-parse actions::
-
-
-File: wisi.info, Node: Navigate actions, Next: Face actions, Up: Grammar
actions
-
-2.1 Navigate actions
-====================
-
-'wisi-statement-action [TOKEN CLASS ...]'
- The argument is a vector; alternating items are a token index (an
- integer or label indicating a token in the right hand side) and a
- "token class"; one of:
-
- 'motion'
- Create a 'wisi-cache' text property on the token, for use in a
- subsequent 'wisi-motion-action'.
-
- 'statement-end'
- Create a 'wisi-cache' text property on the token, enter a
- pointer to it in the other 'wisi-cache' objects in the
- statement or declaration.
-
- 'statement-start'
- Create a 'wisi-cache' text property on the token, enter a
- pointer to it in the other 'wisi-cache' objects (in the
- 'containing' slot) in the statement or declaration.
-
- 'statement-override'
- Same as 'statement-start'; marks the token to be used as the
- statement start if the first token is optional.
-
- 'misc'
- Create a 'wisi-cache' text property on the token, to be used
- for some other purpose. It is good style to indicate the
- purpose in a comment.
-
- For example, ada-mode uses a 'misc' property on left
- parentheses that start a subprogram parameter list; this
- distinquishes them from other left parentheses, and makes it
- possible to automatically call 'ada-format-paramlist' to
- format the parameter list, instead of using the standard Emacs
- 'align'.
-
-'wisi-motion-action [TOKEN ...]'
- The argument is a vector, where each element is either a token
- index or a vector [INDEX ID].
-
- Each terminal token must already have a 'wisi-cache' created by a
- 'wisi-statement-action' (this is checked at action execution, not
- during grammar generation). This action sets the 'prev, next'
- slots for the chain of tokens, creating a chain of motion tokens.
-
- If TOKEN is a nonterminal without an ID specified, the 'wisi-cache'
- must be on the first token in the nonterminal, and it is assumed to
- have a valid pointer in the 'next' slot, indicating a chain of
- motion tokens. That chain is linked into the chain for the current
- right hand side.
-
- If TOKEN is a nonterminal with an ID, the region contained by the
- nonterminal is searched for all 'wisi-cache' with that token ID,
- and for each one where prev/next is not already set, it is linked
- into the motion chain.
-
- Note that the "search" described here is done in the parser
- process, on a tree data structure containing the data that will
- eventually be stored in Emacs text properties.
-
-'wisi-name-action TOKEN'
- TOKEN is a token index. Create a 'wisi-name' text property on the
- token.
-
-
-File: wisi.info, Node: Face actions, Next: Indent actions, Prev: Navigate
actions, Up: Grammar actions
-
-2.2 Face actions
-================
-
-'wisi-face-mark-action [INDEX CLASS ...]'
- The argument is a vector; alternating elements form pairs of INDEX
- CLASS, where class is one of 'prefix, suffix'.
-
- Mark the tokens as part of a compound name, for use by later face
- actions.
-
-'wisi-face-apply-action [TOKEN PREFIX-FACE SUFFIX-FACE ...]'
- The argument is a vector; triples of items specify TOKEN,
- PREFIX-FACE, SUFFIX-FACE. The faces are the elisp names of face
- objects (which must declared by an '%elisp_face' declaration).
-
- If the token is a nonterminal, and it has been marked by a previous
- 'wisi-face-mark-action', the specified faces are applied to the
- prefix and suffix in the token as 'font-lock-face' text properties.
-
- If the token is a terminal, or a non-terminal with no face mark,
- the suffix face is applied to the entire text contained by the
- token.
-
-'wisi-face-apply-list-action [TOKEN PREFIX-FACE SUFFIX-FACE ...]'
- Similar to ’wisi-face-apply-action’, but applies faces to all
- tokens marked by 'wisi-face-mark-action' in each indicated
- production token, and does not apply a face if there are no such
- marks.
-
-
-File: wisi.info, Node: Indent actions, Next: In-parse actions, Prev: Face
actions, Up: Grammar actions
-
-2.3 Indent actions
-==================
-
-Indents are computed for each line in a cumulative way as the grammar
-actions are executed. Initially, each indent is set to 'nil', which
-means "not computed"; this is not the same as the value '0'. The
-grammar actions are executed in a bottom-up fashion; low level
-productions are executed before higher level ones. In general, the
-indent action for a production specifies a "delta indent"; the indent is
-incremented by that amount. When all productions have been processed,
-the indent has been computed for all lines.
-
- Indents are often given as a function call; the arguments to the
-function can be other function calls, or integer expressions.
-'wisitoken-bnf-generate' supports only simple integer expressions; those
-using integers, integer-valued variables, parenthesis, + (plus), -
-(minus), and * (multiply).
-
-'wisi-indent-action [INDENT ...]'
- The argument is a vector, giving an indent for each token in the
- production right-hand side.
-
- For terminals, the indents only have meaning, and are only
- computed, if the token is the first on a line. For nonterminals
- where the indent is not a variant of 'wisi-hanging', the indent is
- only computed if the first terminal token in the nonterminal is the
- first on a line. See 'wisi-hanging' in *note Indent functions::
- for the remaining case.
-
- An indent can have several forms. In the descriptions below, the
- "current token" is given by the position of the indent expression
- in the 'wisi-indent-action' argument list.
-
- An integer
- This gives a delta indent; it is added to the total indent for
- the line.
-
- A variable name
- The name is translated to an Ada identifier by replacing "-"
- with "_", and applying 'Camel_Case'. The translated name must
- identify a directly visible run-time Ada integer variable;
- this is checked at Ada compile time. It provides an integer
- delta indent.
-
- For example, in Ada two indent variable names are 'ada-indent'
- and 'ada-indent-broken', giving the basic ident, and the
- continuation line indent. They are runtime variables so
- different projects can specify them as part of a coding
- standard.
-
- A function call
- A function that computes a delta indent. See *note Indent
- functions::.
-
- [CODE-INDENT , COMMENT-INDENT]
- A vector giving separate indents for code and comments.
-
- Normally, the indent for trailing comments (on lines with no
- code, after all code in the token) is given by the indent of
- the following token in the production. When the current token
- is the last, or the following tokens may be empty, or the
- indent of the following token would be wrong for some reason
- (for example, it is a block end), the comment indent may be
- specified separately. If it is not specified, and the indent
- from the next token is not available, the indent for the
- current token is used for code and comments.
-
- Comment lines that are not trailing are indented by
- CODE-INDENT.
-
- (label . INDENT)
- If token labels are used in a right hand side, they must be
- given explicitly in the indent arguments, using he lisp "cons"
- syntax. Labels are normally only used with EBNF grammars,
- which expand into multiple right hand sides, with optional
- tokens simply left out. Explicit labels on the indent
- arguments allow them to be left out as well.
-
-* Menu:
-
-* Indent functions::
-* Indent example::
-
-
-File: wisi.info, Node: Indent functions, Next: Indent example, Up: Indent
actions
-
-2.3.1 Indent functions
-----------------------
-
-'wisi-anchored TOKEN OFFSET'
- Sets the indent for the current token to be OFFSET (an integer
- expression) from the start of TOKEN (a token index); the current
- token is "anchored to" TOKEN.
-
-'wisi-anchored* TOKEN OFFSET'
- Sets the indent for the current token to be OFFSET from the start
- of TOKEN, but only if TOKEN is the first token on a line; otherwise
- no indent
-
-'wisi-anchored*- TOKEN OFFSET'
- Sets the indent for the current token to be OFFSET from the start
- of TOKEN, but only if TOKEN is the first token on a line and the
- indent for the current token accumulated so far is nil.
-
-'wisi-anchored% TOKEN OFFSET'
- If there is an opening parenthesis containing TOKEN in the line
- containing TOKEN, set the current indent to OFFSET from that
- parenthesis. Otherwise, OFFSET gives an indent delta.
-
-'wisi-anchored%- TOKEN OFFSET'
- Same as 'wisi-anchored%', but only if the current token accumulated
- indent is nil.
-
-'wisi-hanging DELTA-1 DELTA-2'
- The current token is assumed to be a nonterminal. If the text it
- contains spans multiple lines, use DELTA-1 for the first line,
- DELTA-2 for the rest. If the current token is only on one line,
- use DELTA-1.
-
- DELTA-1 and DELTA-2 can be any IDENT expression, except a variant
- of 'wisi-hanging'.
-
-'wisi-hanging% DELTA-1 DELTA-2'
- Similar to 'wisi-hanging'; if the first terminal token in the
- current nonterminal is the first token on the first line, use
- DELTA-1 for the first line and DELTA-2 for the rest. Otherwise,
- use DELTA-1 for all lines.
-
-'wisi-hanging%- DELTA-1 DELTA-2'
- Same as 'wisi-hanging%', except applied only if the current token
- accumulated indent is nil.
-
-'Language-specific function'
- Language-specific indent functions are specified by an
- '%elisp_indent' declaration in the grammar file. Each function
- specifies how many arguments it accepts; this is checked at action
- runtime, not during grammar generation. Each argument is an INDENT
- as described above, or a token ID prefixed by ''' (to allow
- distinguishing token IDs from variable names).
-
-
-File: wisi.info, Node: Indent example, Prev: Indent functions, Up: Indent
actions
-
-2.3.2 Indent example
---------------------
-
-The example 'if_statement' grammar nonterminal is:
-
- if_statement
- : IF expression THEN statements elsif_list ELSE statements END IF
SEMICOLON
- %((wisi-indent-action [nil
- [(wisi-hanging% ada-indent-broken (* 2
ada-indent-broken))
- ada-indent-broken]
- nil
- [ada-indent ada-indent] nil nil
- [ada-indent ada-indent] nil nil nil]))%
-
- We trace how the indent is computed for this sample Ada code:
-
- 1: if A < B and
- 2: C < D
- 3: -- comment on expression
- 4: then
- 5: if E then
- 6: Do_E;
- 7: -- comment on statement
- 8: elsif F then
- 9: G := A + Compute_Something
- 10: (arg_1, arg_2);
- 11: end if;
- 12: end if;
-
- First, the indent for the lower-level nonterminals ('expression,
-statements, elsif_list') are computed. Assume they set the indent for
-line 10 to 2 (for the hanging expression) and leave the rest at nil.
-
- Next, the action for the inner 'if_statement' is executed. Most of
-the tokens specify an indent of 'nil', which means the current
-accumulated indent is not changed. For the others, the action is as
-follows:
-
-'expression:'
- The expression 'E' is contained on one line, and it is not the
- first token on that line, so the indent for line 5 is not changed.
-
-'statements: [ada-indent ada-indent]'
- This specifies separate indents for code and trailing comments,
- because otherwise the trailing comments would be indented with the
- following 'THEN'; instead they are indented with the expression
- code; see the comment on line 7.
-
- Here 'ada-indent' is 3, so the indent for lines 6 and 7 (for the
- first occurence of 'statments') is incremented from 'nil' to '3'.
-
- For the second occurence of 'statements', line 9 is incremented
- from 'nil' to '3', and line 10 from '2' to '5'.
-
- At this point, the accumulated indents are (the indent is given after
-the line number):
- 1: nil : if A < B and
- 2: nil : C < D
- 3: nil : -- comment on expression
- 4: nil : then
- 5: nil : if E then
- 6: 3 : Do_E;
- 7: 3 : -- comment on statement
- 8: nil : elsif F then
- 9: 3 : G := A + Compute_Something
- 10: 5 : (arg_1, arg_2);
- 11: nil : end if;
- 12: nil : end if;
-
- Then the action is executed for the outer 'if_statement':
-
-'expression: [(wisi-hanging% ada-indent-broken (* 2 ada-indent-broken))
ada-indent-broken]'
- This specifies separate indents for code and trailing comments,
- because otherwise the trailing comments would be indented with the
- following 'THEN'; instead they are indented with the expression
- code; see the comment on line 3.
-
- In this case, 'wisi-hanging%' returns DELTA-1, which is
- 'ada-indent-broken', which is 2. So the indent for line 2 is
- incremented from 'nil' to '2'.
-
- The indent for line 3 is also incremented from 'nil' to '2'.
-
-'statements: [ada-indent ada-indent]'
- Here there is only one statement; the nested 'if_statement'. The
- indent for lines 5 .. 11 are each incremented by 3.
-
- The final result is:
- 1: nil : if A < B and
- 2: 2 : C < D
- 3: 2 : -- comment on expression
- 4: nil : then
- 5: 3 : if E then
- 6: 6 : Do_E;
- 7: 6 : -- comment on statement
- 8: 3 : elsif F then
- 9: 6 : G := A + Compute_Something
- 10: 8 : (arg_1, arg_2);
- 11: 6 : end if;
- 12: nil : end if;
-
- In a full grammar, the top production should specify an indent of 0,
-not nil, for tokens that are not indented; then every line will have a
-non-nil indent. However, in normal operation a nil indent is treated as
-0; the 'wisi-indent' text property is not set for lines that have nil
-indent, and 'wisi-indent-region' detects that and uses 0 for the indent.
-You can set the variable 'wisi-debug' to a value > 0 to signal an error
-for nil indents; this is useful to catch indent errors during grammar
-development.
-
-
-File: wisi.info, Node: In-parse actions, Prev: Indent actions, Up: Grammar
actions
-
-2.4 In-parse actions
-====================
-
-'wisi-propagate-name TOKEN'
- The argument is a token index. Set the 'name' component of the
- left-hand-side parse-time token object to the 'name' component of
- the identified token, if it is not empty. Otherwise use the
- 'byte_region' component.
-
-'wisi-merge-name FIRST-TOKEN, LAST-TOKEN'
- The arguments are token indices, giving a range of tokens.
- LAST-TOKEN may be omitted if it is the same as FIRST-TOKEN.
-
- Set the 'name' component of the left-hand-side to the merger of the
- 'name' or 'byte-region' components of the identified tokens.
-
-'wisi-match-name START-TOKEN END-TOKEN'
- The arguments are token indices. Compare the text contained by the
- 'name' (or 'byte_region' if 'name' is empty) token components for
- START-TOKEN and END-TOKEN; signal a parse error if they are
- different.
-
- The behavior when a name is missing is determined by the runtime
- language variable given in the '%end_names_optional_option'
- declaration; if True, a missing name that is supposed to match a
- present name is an error. Both names missing is not an error
- (assuming that is allowed by the grammar).
-
-
-File: wisi.info, Node: Project extension, Next: GNU Free Documentation
License, Prev: Grammar actions, Up: Top
-
-3 Project extension
-*******************
-
-wisi defines the 'cl-defstuct' 'wisi-prj', with operations suitable for
-compilation and cross-reference.
-
- In order to use wisi projects, the user must write project files and
-customize 'project-find-functions' and 'xref-backend-functions'.
-
-* Menu:
-
-* Project files::
-* Selecting projects::
-* Casing exception files::
-* Other project functions::
-
-
-File: wisi.info, Node: Project files, Next: Selecting projects, Up: Project
extension
-
-3.1 Project files
-=================
-
-Project file names must have an extension given by
-'wisi-prj-file-extensions' (default '.adp, .prj').
-
- Project files have a simple syntax; they may be edited directly.
-Each line specifies a project variable name and its value, separated by
-"=":
-
- src_dir=/Projects/my_project/src_1
- src_dir=/Projects/my_project/src_2
-
- There must be no space between the variable name and "=", and no
-trailing spaces after the value.
-
- Any line that does not have an "=" is a comment.
-
- Some variables (like 'src_dir') are lists; each line in the project
-file specifies one element of the list. The value on the last line is
-the last element in the list.
-
- A variable name that starts with '$' is set as a process environment
-variable, for processes launched from Emacs for the project.
-
- In values, process environment variables can be referenced using the
-normal '$var' syntax.
-
- In values, relative file names are expanded relative to the directory
-containing the project file.
-
- Here is the list of project variables defined by wisi; major modes
-may add more.
-
-'casing' [slot: 'case-exception-files']
- List of files containing casing exceptions. *Note Casing exception
- files::.
-
-'src_dir' [slot: 'source-path']
- A list of directories to search for source files.
-
-
-File: wisi.info, Node: Selecting projects, Next: Casing exception files,
Prev: Project files, Up: Project extension
-
-3.2 Selecting projects
-======================
-
-The current project can either be indicated by a global variable (called
-a "selected project"), or depend on the current buffer.
-
- In addition, the project file can be parsed each time it is needed,
-or the result cached to improve response time,
-
- One reason to use a selected project is to handle a hierarchy of
-projects; if projects B and C both depend on library project A, then
-when in a file of project A, there is no way to determine which of the
-three projects to return. So the user must indicate which is active, by
-using one of 'wisi-prj-select-file' or 'wisi-prj-select-cache'.
-
- In addition, if changing from one project to another requires setting
-global resources that must also be unset (such as a syntax propertize
-hook or compilation filter hook), then the project should define
-'wisi-prj-deselect' in addition to 'wisi-prj-select'. Such projects
-require having a selected current project, so it can be deselected
-before a new one is selected. One example of such projects is ada-mode.
-
- One way to declare each project is to add a Local Variables section
-in the main Makefile for the project; when the Makefile is first
-visited, the project is declared. In the examples here, we assume that
-approach is used; each gives an :eval line.
-
- Note that 'wisi-prj-current-parse' and 'wisi-prj-current-cached'
-always succeed after some project is selected; no functions after them
-on 'project-find-functions' will be called. That's why the depth is 90
-for those in the examples.
-
-No caching, current project depends on current buffer
-
- (add-hook 'project-find-functions #'wisi-prj-find-dominating-parse 0)
-
- :eval (wisi-prj-set-dominating "foo.prj" (foo-prj-default
"prj-name"))
-
- 'wisi-prj-set-dominating' declares the name of a project file with
- a default project object, and ensures that the current buffer file
- name is in 'wisi-prj--dominating'.
-
- 'wisi-prj-find-dominating-parse' looks for the filenames in
- 'wisi-prj--dominiating' in the parent directories of the current
- buffer. When one is found, the associated project file is parsed,
- using the default project object to dispatch to the appropriate
- parsers. Then the final project object is returned.
-
-Caching, current project depends on current buffer
-
- (add-hook 'project-find-functions #'wisi-prj-find-dominating-cached
0)
-
- :eval (wisi-prj-cache-dominating "foo.prj" (foo-prj-default
"prj-name"))
-
- 'wisi-prj-cache-dominating' declares the project file, parses it,
- and saves the project object in a cache indexed by the absolute
- project file name.
-
- 'wisi-prj-find-dominating-cached' finds the dominating project
- file, and retrieves the object from the cache.
-
-No caching, last selected project is current
-
- (add-hook 'project-find-functions #'wisi-prj-current-parse 90)
-
- :eval: (wisi-prj-select-file <prj-file> (foo-prj-default "prj-name"))
-
- 'wisi-prj-select-file' sets the project file as the current
- project, and saves the default project object.
-
- 'wisi-prj-current-parse' parses the current project file, using the
- saved default project object, and returns the project object.
-
-Caching, last selected project is current
-
- (add-hook 'project-find-functions #'wisi-prj-current-cached 90)
-
- :eval: (wisi-prj-select-cache <prj-file> (foo-prj-default
"prj-name"))
-
- 'wisi-prj-select-cache' parses the project file, caches the project
- object.
-
- 'wisi-prj-current-cached' returns the cached current project
- object.
-
- In addition, the user should set 'xref-backend-functions'.
-Currently, there is only one choice for wisi projects:
-
- (add-to-list 'xref-backend-functions #'wisi-prj-xref-backend 90)
-
- 'wisi-prj-xref-backend' returns the current wisi project object.
-
-
-File: wisi.info, Node: Casing exception files, Next: Other project
functions, Prev: Selecting projects, Up: Project extension
-
-3.3 Casing exception files
-==========================
-
-Each line in a case exception file specifies the casing of one word or
-word fragment. If an exception is defined in multiple files, the first
-occurrence is used.
-
- If the word starts with an asterisk ('*'), it defines the casing of a
-word fragment (or "substring"); part of a word between two underscores
-or word boundary.
-
- For example:
-
- DOD
- *IO
- GNAT
-
- The word fragment '*IO' applies to any word containing "_io";
-'Text_IO', 'Hardware_IO', etc.
-
-
-File: wisi.info, Node: Other project functions, Prev: Casing exception
files, Up: Project extension
-
-3.4 Other project functions
-===========================
-
-'wisi-refresh-prj-cache (not-full)'
- Refreshes all cached data in the project, and re-selects the
- project. If NOT-FULL is non-nil, slow refresh operations are
- skipped.
-
- This reparses the project file, and any cross reference
- information.
-
-'wisi-prj-select-dominating (dominating-file)'
- Find a wisi-prj matching DOMINATING-FILE (defaults to the current
- buffer file). If the associated project is current, do nothing.
- If it is not current, select it.
-
- This is useful before running 'compilation-start', to ensure the
- correct project is current.
-
-
-File: wisi.info, Node: GNU Free Documentation License, Next: Index, Prev:
Project extension, Up: Top
-
-Appendix A GNU Free Documentation License
-*****************************************
-
- Version 1.3, 3 November 2008
-
- Copyright (C) 2000, 2001, 2002, 2007, 2008, 2009 Free Software
Foundation, Inc.
- <http://fsf.org/>
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- 0. PREAMBLE
-
- The purpose of this License is to make a manual, textbook, or other
- functional and useful document "free" in the sense of freedom: to
- assure everyone the effective freedom to copy and redistribute it,
- with or without modifying it, either commercially or
- noncommercially. Secondarily, this License preserves for the
- author and publisher a way to get credit for their work, while not
- being considered responsible for modifications made by others.
-
- This License is a kind of "copyleft", which means that derivative
- works of the document must themselves be free in the same sense.
- It complements the GNU General Public License, which is a copyleft
- license designed for free software.
-
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same freedoms
- that the software does. But this License is not limited to
- software manuals; it can be used for any textual work, regardless
- of subject matter or whether it is published as a printed book. We
- recommend this License principally for works whose purpose is
- instruction or reference.
-
- 1. APPLICABILITY AND DEFINITIONS
-
- This License applies to any manual or other work, in any medium,
- that contains a notice placed by the copyright holder saying it can
- be distributed under the terms of this License. Such a notice
- grants a world-wide, royalty-free license, unlimited in duration,
- to use that work under the conditions stated herein. The
- "Document", below, refers to any such manual or work. Any member
- of the public is a licensee, and is addressed as "you". You accept
- the license if you copy, modify or distribute the work in a way
- requiring permission under copyright law.
-
- A "Modified Version" of the Document means any work containing the
- Document or a portion of it, either copied verbatim, or with
- modifications and/or translated into another language.
-
- A "Secondary Section" is a named appendix or a front-matter section
- of the Document that deals exclusively with the relationship of the
- publishers or authors of the Document to the Document's overall
- subject (or to related matters) and contains nothing that could
- fall directly within that overall subject. (Thus, if the Document
- is in part a textbook of mathematics, a Secondary Section may not
- explain any mathematics.) The relationship could be a matter of
- historical connection with the subject or with related matters, or
- of legal, commercial, philosophical, ethical or political position
- regarding them.
-
- The "Invariant Sections" are certain Secondary Sections whose
- titles are designated, as being those of Invariant Sections, in the
- notice that says that the Document is released under this License.
- If a section does not fit the above definition of Secondary then it
- is not allowed to be designated as Invariant. The Document may
- contain zero Invariant Sections. If the Document does not identify
- any Invariant Sections then there are none.
-
- The "Cover Texts" are certain short passages of text that are
- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
- that says that the Document is released under this License. A
- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
- be at most 25 words.
-
- A "Transparent" copy of the Document means a machine-readable copy,
- represented in a format whose specification is available to the
- general public, that is suitable for revising the document
- straightforwardly with generic text editors or (for images composed
- of pixels) generic paint programs or (for drawings) some widely
- available drawing editor, and that is suitable for input to text
- formatters or for automatic translation to a variety of formats
- suitable for input to text formatters. A copy made in an otherwise
- Transparent file format whose markup, or absence of markup, has
- been arranged to thwart or discourage subsequent modification by
- readers is not Transparent. An image format is not Transparent if
- used for any substantial amount of text. A copy that is not
- "Transparent" is called "Opaque".
-
- Examples of suitable formats for Transparent copies include plain
- ASCII without markup, Texinfo input format, LaTeX input format,
- SGML or XML using a publicly available DTD, and standard-conforming
- simple HTML, PostScript or PDF designed for human modification.
- Examples of transparent image formats include PNG, XCF and JPG.
- Opaque formats include proprietary formats that can be read and
- edited only by proprietary word processors, SGML or XML for which
- the DTD and/or processing tools are not generally available, and
- the machine-generated HTML, PostScript or PDF produced by some word
- processors for output purposes only.
-
- The "Title Page" means, for a printed book, the title page itself,
- plus such following pages as are needed to hold, legibly, the
- material this License requires to appear in the title page. For
- works in formats which do not have any title page as such, "Title
- Page" means the text near the most prominent appearance of the
- work's title, preceding the beginning of the body of the text.
-
- The "publisher" means any person or entity that distributes copies
- of the Document to the public.
-
- A section "Entitled XYZ" means a named subunit of the Document
- whose title either is precisely XYZ or contains XYZ in parentheses
- following text that translates XYZ in another language. (Here XYZ
- stands for a specific section name mentioned below, such as
- "Acknowledgements", "Dedications", "Endorsements", or "History".)
- To "Preserve the Title" of such a section when you modify the
- Document means that it remains a section "Entitled XYZ" according
- to this definition.
-
- The Document may include Warranty Disclaimers next to the notice
- which states that this License applies to the Document. These
- Warranty Disclaimers are considered to be included by reference in
- this License, but only as regards disclaiming warranties: any other
- implication that these Warranty Disclaimers may have is void and
- has no effect on the meaning of this License.
-
- 2. VERBATIM COPYING
-
- You may copy and distribute the Document in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that you
- add no other conditions whatsoever to those of this License. You
- may not use technical measures to obstruct or control the reading
- or further copying of the copies you make or distribute. However,
- you may accept compensation in exchange for copies. If you
- distribute a large enough number of copies you must also follow the
- conditions in section 3.
-
- You may also lend copies, under the same conditions stated above,
- and you may publicly display copies.
-
- 3. COPYING IN QUANTITY
-
- If you publish printed copies (or copies in media that commonly
- have printed covers) of the Document, numbering more than 100, and
- the Document's license notice requires Cover Texts, you must
- enclose the copies in covers that carry, clearly and legibly, all
- these Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also clearly
- and legibly identify you as the publisher of these copies. The
- front cover must present the full title with all words of the title
- equally prominent and visible. You may add other material on the
- covers in addition. Copying with changes limited to the covers, as
- long as they preserve the title of the Document and satisfy these
- conditions, can be treated as verbatim copying in other respects.
-
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
-
- If you publish or distribute Opaque copies of the Document
- numbering more than 100, you must either include a machine-readable
- Transparent copy along with each Opaque copy, or state in or with
- each Opaque copy a computer-network location from which the general
- network-using public has access to download using public-standard
- network protocols a complete Transparent copy of the Document, free
- of added material. If you use the latter option, you must take
- reasonably prudent steps, when you begin distribution of Opaque
- copies in quantity, to ensure that this Transparent copy will
- remain thus accessible at the stated location until at least one
- year after the last time you distribute an Opaque copy (directly or
- through your agents or retailers) of that edition to the public.
-
- It is requested, but not required, that you contact the authors of
- the Document well before redistributing any large number of copies,
- to give them a chance to provide you with an updated version of the
- Document.
-
- 4. MODIFICATIONS
-
- You may copy and distribute a Modified Version of the Document
- under the conditions of sections 2 and 3 above, provided that you
- release the Modified Version under precisely this License, with the
- Modified Version filling the role of the Document, thus licensing
- distribution and modification of the Modified Version to whoever
- possesses a copy of it. In addition, you must do these things in
- the Modified Version:
-
- A. Use in the Title Page (and on the covers, if any) a title
- distinct from that of the Document, and from those of previous
- versions (which should, if there were any, be listed in the
- History section of the Document). You may use the same title
- as a previous version if the original publisher of that
- version gives permission.
-
- B. List on the Title Page, as authors, one or more persons or
- entities responsible for authorship of the modifications in
- the Modified Version, together with at least five of the
- principal authors of the Document (all of its principal
- authors, if it has fewer than five), unless they release you
- from this requirement.
-
- C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-
- D. Preserve all the copyright notices of the Document.
-
- E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-
- F. Include, immediately after the copyright notices, a license
- notice giving the public permission to use the Modified
- Version under the terms of this License, in the form shown in
- the Addendum below.
-
- G. Preserve in that license notice the full lists of Invariant
- Sections and required Cover Texts given in the Document's
- license notice.
-
- H. Include an unaltered copy of this License.
-
- I. Preserve the section Entitled "History", Preserve its Title,
- and add to it an item stating at least the title, year, new
- authors, and publisher of the Modified Version as given on the
- Title Page. If there is no section Entitled "History" in the
- Document, create one stating the title, year, authors, and
- publisher of the Document as given on its Title Page, then add
- an item describing the Modified Version as stated in the
- previous sentence.
-
- J. Preserve the network location, if any, given in the Document
- for public access to a Transparent copy of the Document, and
- likewise the network locations given in the Document for
- previous versions it was based on. These may be placed in the
- "History" section. You may omit a network location for a work
- that was published at least four years before the Document
- itself, or if the original publisher of the version it refers
- to gives permission.
-
- K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the section
- all the substance and tone of each of the contributor
- acknowledgements and/or dedications given therein.
-
- L. Preserve all the Invariant Sections of the Document, unaltered
- in their text and in their titles. Section numbers or the
- equivalent are not considered part of the section titles.
-
- M. Delete any section Entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-
- N. Do not retitle any existing section to be Entitled
- "Endorsements" or to conflict in title with any Invariant
- Section.
-
- O. Preserve any Warranty Disclaimers.
-
- If the Modified Version includes new front-matter sections or
- appendices that qualify as Secondary Sections and contain no
- material copied from the Document, you may at your option designate
- some or all of these sections as invariant. To do this, add their
- titles to the list of Invariant Sections in the Modified Version's
- license notice. These titles must be distinct from any other
- section titles.
-
- You may add a section Entitled "Endorsements", provided it contains
- nothing but endorsements of your Modified Version by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
-
- You may add a passage of up to five words as a Front-Cover Text,
- and a passage of up to 25 words as a Back-Cover Text, to the end of
- the list of Cover Texts in the Modified Version. Only one passage
- of Front-Cover Text and one of Back-Cover Text may be added by (or
- through arrangements made by) any one entity. If the Document
- already includes a cover text for the same cover, previously added
- by you or by arrangement made by the same entity you are acting on
- behalf of, you may not add another; but you may replace the old
- one, on explicit permission from the previous publisher that added
- the old one.
-
- The author(s) and publisher(s) of the Document do not by this
- License give permission to use their names for publicity for or to
- assert or imply endorsement of any Modified Version.
-
- 5. COMBINING DOCUMENTS
-
- You may combine the Document with other documents released under
- this License, under the terms defined in section 4 above for
- modified versions, provided that you include in the combination all
- of the Invariant Sections of all of the original documents,
- unmodified, and list them all as Invariant Sections of your
- combined work in its license notice, and that you preserve all
- their Warranty Disclaimers.
-
- The combined work need only contain one copy of this License, and
- multiple identical Invariant Sections may be replaced with a single
- copy. If there are multiple Invariant Sections with the same name
- but different contents, make the title of each such section unique
- by adding at the end of it, in parentheses, the name of the
- original author or publisher of that section if known, or else a
- unique number. Make the same adjustment to the section titles in
- the list of Invariant Sections in the license notice of the
- combined work.
-
- In the combination, you must combine any sections Entitled
- "History" in the various original documents, forming one section
- Entitled "History"; likewise combine any sections Entitled
- "Acknowledgements", and any sections Entitled "Dedications". You
- must delete all sections Entitled "Endorsements."
-
- 6. COLLECTIONS OF DOCUMENTS
-
- You may make a collection consisting of the Document and other
- documents released under this License, and replace the individual
- copies of this License in the various documents with a single copy
- that is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the documents
- in all other respects.
-
- You may extract a single document from such a collection, and
- distribute it individually under this License, provided you insert
- a copy of this License into the extracted document, and follow this
- License in all other respects regarding verbatim copying of that
- document.
-
- 7. AGGREGATION WITH INDEPENDENT WORKS
-
- A compilation of the Document or its derivatives with other
- separate and independent documents or works, in or on a volume of a
- storage or distribution medium, is called an "aggregate" if the
- copyright resulting from the compilation is not used to limit the
- legal rights of the compilation's users beyond what the individual
- works permit. When the Document is included in an aggregate, this
- License does not apply to the other works in the aggregate which
- are not themselves derivative works of the Document.
-
- If the Cover Text requirement of section 3 is applicable to these
- copies of the Document, then if the Document is less than one half
- of the entire aggregate, the Document's Cover Texts may be placed
- on covers that bracket the Document within the aggregate, or the
- electronic equivalent of covers if the Document is in electronic
- form. Otherwise they must appear on printed covers that bracket
- the whole aggregate.
-
- 8. TRANSLATION
-
- Translation is considered a kind of modification, so you may
- distribute translations of the Document under the terms of section
- 4. Replacing Invariant Sections with translations requires special
- permission from their copyright holders, but you may include
- translations of some or all Invariant Sections in addition to the
- original versions of these Invariant Sections. You may include a
- translation of this License, and all the license notices in the
- Document, and any Warranty Disclaimers, provided that you also
- include the original English version of this License and the
- original versions of those notices and disclaimers. In case of a
- disagreement between the translation and the original version of
- this License or a notice or disclaimer, the original version will
- prevail.
-
- If a section in the Document is Entitled "Acknowledgements",
- "Dedications", or "History", the requirement (section 4) to
- Preserve its Title (section 1) will typically require changing the
- actual title.
-
- 9. TERMINATION
-
- You may not copy, modify, sublicense, or distribute the Document
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense, or distribute it is void,
- and will automatically terminate your rights under this License.
-
- However, if you cease all violation of this License, then your
- license from a particular copyright holder is reinstated (a)
- provisionally, unless and until the copyright holder explicitly and
- finally terminates your license, and (b) permanently, if the
- copyright holder fails to notify you of the violation by some
- reasonable means prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
- reinstated permanently if the copyright holder notifies you of the
- violation by some reasonable means, this is the first time you have
- received notice of violation of this License (for any work) from
- that copyright holder, and you cure the violation prior to 30 days
- after your receipt of the notice.
-
- Termination of your rights under this section does not terminate
- the licenses of parties who have received copies or rights from you
- under this License. If your rights have been terminated and not
- permanently reinstated, receipt of a copy of some or all of the
- same material does not give you any rights to use it.
-
- 10. FUTURE REVISIONS OF THIS LICENSE
-
- The Free Software Foundation may publish new, revised versions of
- the GNU Free Documentation 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. See
- <http://www.gnu.org/copyleft/>.
-
- Each version of the License is given a distinguishing version
- number. If the Document specifies that a particular numbered
- version of this License "or any later version" applies to it, you
- have the option of following the terms and conditions either of
- that specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If the
- Document does not specify a version number of this License, you may
- choose any version ever published (not as a draft) by the Free
- Software Foundation. If the Document specifies that a proxy can
- decide which future versions of this License can be used, that
- proxy's public statement of acceptance of a version permanently
- authorizes you to choose that version for the Document.
-
- 11. RELICENSING
-
- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
- World Wide Web server that publishes copyrightable works and also
- provides prominent facilities for anybody to edit those works. A
- public wiki that anybody can edit is an example of such a server.
- A "Massive Multiauthor Collaboration" (or "MMC") contained in the
- site means any set of copyrightable works thus published on the MMC
- site.
-
- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
- license published by Creative Commons Corporation, a not-for-profit
- corporation with a principal place of business in San Francisco,
- California, as well as future copyleft versions of that license
- published by that same organization.
-
- "Incorporate" means to publish or republish a Document, in whole or
- in part, as part of another Document.
-
- An MMC is "eligible for relicensing" if it is licensed under this
- License, and if all works that were first published under this
- License somewhere other than this MMC, and subsequently
- incorporated in whole or in part into the MMC, (1) had no cover
- texts or invariant sections, and (2) were thus incorporated prior
- to November 1, 2008.
-
- The operator of an MMC Site may republish an MMC contained in the
- site under CC-BY-SA on the same site at any time before August 1,
- 2009, provided the MMC is eligible for relicensing.
-
-ADDENDUM: How to use this License for your documents
-====================================================
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and license
-notices just after the title page:
-
- Copyright (C) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-
- If you have Invariant Sections, Front-Cover Texts and Back-Cover
-Texts, replace the "with...Texts." line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with
- the Front-Cover Texts being LIST, and with the Back-Cover Texts
- being LIST.
-
- If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
- If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of free
-software license, such as the GNU General Public License, to permit
-their use in free software.
-
-
-File: wisi.info, Node: Index, Prev: GNU Free Documentation License, Up: Top
-
-Index
-*****
-
-
-
-Tag Table:
-Node: Top920
-Node: Overview1119
-Node: Grammar actions1761
-Node: Navigate actions7174
-Node: Face actions10027
-Node: Indent actions11338
-Node: Indent functions15148
-Node: Indent example17443
-Node: In-parse actions21781
-Node: Project extension23077
-Node: Project files23586
-Node: Selecting projects25006
-Node: Casing exception files29008
-Node: Other project functions29666
-Node: GNU Free Documentation License30424
-Node: Index55580
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/wisi.texi b/wisi.texi
index 8028810..ac1be79 100644
--- a/wisi.texi
+++ b/wisi.texi
@@ -25,7 +25,7 @@ developing GNU and promoting software freedom.''
@titlepage
@sp 10
-@title Wisi Version 3.1.3
+@title Wisi Version 3.1.5
@page
@vskip 0pt plus 1filll
@insertcopying
@@ -37,7 +37,7 @@ developing GNU and promoting software freedom.''
@node Top
@top Top
-Wisi Version 3.1.3
+Wisi Version 3.1.5
@end ifnottex
@menu
diff --git a/wisitoken-user_guide.info b/wisitoken-user_guide.info
deleted file mode 100644
index 7bbdb1b..0000000
--- a/wisitoken-user_guide.info
+++ /dev/null
@@ -1,611 +0,0 @@
-This is wisitoken-user_guide.info, produced by makeinfo version 6.7 from
-wisitoken-user_guide.texinfo.
-
-Copyright (C) 2014-2015, 2017, 2018, 2020 Stephen Leake.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover Texts and no
- Back-Cover Texts. A copy of the license is included in the section
- entitled "GNU Free Documentation License".
-INFO-DIR-SECTION Parser generators
-START-INFO-DIR-ENTRY
-* wisitoken-bnf-generate: (wisitoken-bnf-generate). Ada and Elisp
parser generator
-END-INFO-DIR-ENTRY
-
-
-File: wisitoken-user_guide.info, Node: Top, Next: Overview, Up: (dir)
-
-WisiToken User Guide
-********************
-
-Copyright (C) 2014-2015, 2017, 2018, 2020 Stephen Leake.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover Texts and no
- Back-Cover Texts. A copy of the license is included in the section
- entitled "GNU Free Documentation License".
-
-* Menu:
-
-* Overview::
-* Common grammar problems::
-* Grammar File Syntax::
-
-
-File: wisitoken-user_guide.info, Node: Overview, Next: Common grammar
problems, Prev: Top, Up: Top
-
-1 Overview
-**********
-
-WisiToken is a parser and parser generator toolkit, supporting
-generalized LR (both LALR and LR1) and packrat parsers; the LR parser
-provides robust error recovery. The grammar can be expressed as either
-Ada source code statements, or in an EBNF file. The parser generator
-generates Ada, either plain or assuming the Emacs wisi package.
-
- At one point, "wisi" was short for "Wisent Indentation engine"; the
-Emacs 'wisi' package implements an indentation engine that used to be
-based on the Emacs wisent parser. However, that parser has now been
-replaced by the WisiToken parser, so "wisi" is just a name.
-
-* Menu:
-
-* Install::
-
-
-File: wisitoken-user_guide.info, Node: Install, Up: Overview
-
-1.1 Install
-===========
-
-WisiToken is available as source code only, although a subset is
-available in the GNU ELPA package 'wisi'.
-
- You will also need to install a lexer generator. WisiToken supports
-re2c, and other lexers can be added.
-
- re2c is available from <http://re2c.org/>; it is also packaged in
-Mingw64 and Debian. WisiToken requires at least version 1.3. WisiToken
-assumes the executable 're2c' is in '$PATH'.
-
-
-File: wisitoken-user_guide.info, Node: Common grammar problems, Next:
Grammar File Syntax, Prev: Overview, Up: Top
-
-2 Common grammar problems
-*************************
-
-LALR grammars are tricky. Here we describe some common problems people
-run into.
-
-* Menu:
-
-* Empty choice in list::
-
-
-File: wisitoken-user_guide.info, Node: Empty choice in list, Up: Common
grammar problems
-
-2.1 Empty choice in list
-========================
-
-Many programming languages have lists in the grammar. For example, Ada
-has lists of declarations:
-
- package_body
- : PACKAGE name IS declaration_list BEGIN statement_list END SEMICOLON
- ;
-
- declaration_list
- : declaration
- | declaration_list declaration
- ;
-
- declaration
- : object_declaration
- | subprogram_declaration
- ;; ...
- ;
-
- Note that the above grammar fragment does not allow an empty
-declaration_list. But Ada does, so the question is how can we add that
-to the grammar.
-
- There are four choices:
-
- 1. Add an empty declaration choice to declaration_list:
-
- declaration_list
- : ;; empty list
- | declaration
- | declaration_list declaration
- ;
- This is now redundant; since declaration_list can be empty, the
- second choice is not needed:
- declaration_list
- : ;; empty list
- | declaration_list declaration
- ;
-
- 2. Add an empty declaration choice to declaration:
-
- declaration
- : ;; empty declaration
- | object_declaration
- | subprogram_declaration
- ;; ...
- ;
-
- 3. Add another rule with the empty production:
-
- package_body
- : PACKAGE name IS declarative_part BEGIN statement_list END
SEMICOLON
- ;
-
- declarative_part
- : ;; empty
- | declaration_list
- ;
-
- declaration_list
- : declaration
- | declaration_list declaration
- ;
-
- declaration
- : object_declaration
- | subprogram_declaration
- ;; ...
- ;
-
- 4. Add another choice in package_body that leaves out
- declaration_list:
- package_body
- : PACKAGE name IS declaration_list BEGIN statement_list END
SEMICOLON
- | PACKAGE name IS BEGIN statement_list END SEMICOLON
- ;
-
- Choice 1 is redundant, giving parse errors at parse time. Consider
-the following statements, where "<empty>" is used to indicate an empty
-declaration:
-
- 1) package One is <empty> begin end ; 2) package One is package One
-is <empty> begin end ; begin end ; 3) package One is <empty> package One
-is <empty declaration> begin end ; begin end ;
-
- In parsing 3), the second 'package' causes a shift/reduce conflict;
-shift to start the nested declaration (as in 2), reduce to the empty
-declaration. Both are correct according to the grammar.
-
- Choice 2 leads to a shift/reduce conflict in the production for
-package_body; implementing the wisi parser as a generalized LALR parser
-allows it to handle this option.
-
- Choice 2 is the preferred choice for Ada, since it involves the least
-modifications to the original Ada grammar in the Ada reference manual.
-
-
-File: wisitoken-user_guide.info, Node: Grammar File Syntax, Prev: Common
grammar problems, Up: Top
-
-3 Grammar File Syntax
-*********************
-
-The grammar file syntax is based on Gnu bison syntax with some additions
-and deletions (*note Bison: (bison)Top.).
-
- (The grammar is specified in the WisiToken grammar file
-'wisitoken_grammar.wy').
-
- The top level file structure is a list of declarations and
-nonterminals.
-
- Comments are started by ';;' and terminated by end of line.
-
-* Menu:
-
-* Declarations::
-* Nonterminals::
-* Conditional code::
-
-
-File: wisitoken-user_guide.info, Node: Declarations, Next: Nonterminals,
Up: Grammar File Syntax
-
-3.1 Declarations
-================
-
-Declarations declare terminal tokens, conflicts, and other parser
-parameters.
-
-* Menu:
-
-* Raw Code::
-* Keywords::
-* Tokens::
-* Error recovery::
-* Other declarations::
-
-
-File: wisitoken-user_guide.info, Node: Raw Code, Next: Keywords, Up:
Declarations
-
-3.1.1 Raw code
---------------
-
-%code { actions | copyright_license } [spec | body | context | pre | post]...
%{ <output language code> }%
-
- Raw code declarations contain arbitrary code, copied verbatim into
-the output. The keywords following '%code' determine where the section
-is output.
-
-
-File: wisitoken-user_guide.info, Node: Keywords, Next: Tokens, Prev: Raw
Code, Up: Declarations
-
-3.1.2 Keywords
---------------
-
-%keyword <name> <string>
-
- example:
-%keyword SEMICOLON ";"
-
- "Keywords" are reserved words or symbols in the target language; the
-lexers recognize them by the given string.
-
-
-File: wisitoken-user_guide.info, Node: Tokens, Next: Error recovery, Prev:
Keywords, Up: Declarations
-
-3.1.3 Tokens
-------------
-
-%token < kind > name regexp
-
- example:
-%token <symbol> IDENTIFIER %[ ... ]%
-%token <punctuation> TICK "'"
-
- The syntax of the regular expression is determined by the lexer
-generator. The meaning of 'kind' is determined by the lexer ('re2c'
-ignores this), with the following defined by the WisiToken generator.
-Other token kinds have no effect; they may be used for documentation.
-
-'<string-double>'
- %token <string-double> STRING_LITERAL %[ ... ]%
- A string of characters that have string syntax, with double quote
- delimiters.
-
-'<string-single>'
- %token <string-single> CHARACTER_LITERAL %[ ... ]%
- A string of characters that have string syntax, with single quote
- delimiters.
-
-'<new-line>'
- %token <new-line> [\n] %[ ... ]%
- Not used by the wisi lexer; required by the Ada lexer. The third
- argument is the regular expression to recognize the entire comment.
-
-'<non-reporting>'
- %token <non-reporting> WHITESPACE %[ [ \t] ]%
- A token that is recognized by the lexer, but not returned to the
- parser.
-
-'<delimited-text>'
- %token <delimited-text> RAW_CODE "%{" "}%"
- A token that contains arbitrary text, delimited by the two strings.
-
-
-File: wisitoken-user_guide.info, Node: Error recovery, Next: Other
declarations, Prev: Tokens, Up: Declarations
-
-3.1.4 Error recovery
---------------------
-
-The parser uses an error recovery algorithm when it encounters a syntax
-error; if a solution is found, the parse continues.
-
- Error recovery uses multiple tasks to take advantage of multiple CPU
-cores. Unfortunately, this means there is a race condition; the
-solutions found can be delivered in different orders on different runs.
-This matters because each solution results in a successful parse,
-possibly with different actions (different indentation computed, for
-example). Which solution finally succeeds depends on which are
-terminated due to identical parser stacks, which in turn depends on the
-order they were delivered.
-
- Once the syntax errors are fixed, only ambiguities in the grammar
-itself can cause a similar problem.
-
- Several grammar file declarations set parameters for the error
-recovery. If none of these parameters are present in the grammar file,
-the generated parser does not do error recovery.
-
- The error recovery algorithm generates possible solutions based on
-the parse state preceding the error point, by inserting, deleting, or
-pushing back tokens. Each possible solution is given a cost, and
-enqueued to be checked later. Solutions are checked in cost order
-(lowest first).
-
-'%mckenzie_check_limit <limit>'
- The number of tokens past the error point that must be parsed
- successfully for a solution to be deemed successful. Smaller
- values give faster recovery; larger values give better solutions.
- Too large a value risks encountering another user error, making a
- solution impossible. 3 or 4 works well in practice.
-
-'mckenzie_check_delta_limit <limit>'
- When error recovery is entered with multiple parsers active, once a
- solution has been found for one parser, the other parsers are
- allowed to check only 'mckenzie_check_delta_limit' possible
- solutions before they fail. This prevents long recovery times.
-
-'%mckenzie_cost_default <insert> <delete> <push back> <ignore check fail>'
- McKenzie error recovery default costs for insert, delete, push back
- single tokens, and for ignoring a semantic check failure; four
- floating point numbers.
-
- "Push back" means undo parsing; remove tokens from the parse stack
- and put them back into the input stream. This moves the
- insert/delete point, allowing better solutions. The push back
- default cost is also the undo reduce default cost.
-
- If not specified, costs are zero. Costs can be negative; they all
- add linearly.
-
-'%mckenzie_cost_delete <token> <cost>'
- McKenzie error recovery delete cost for a specific token.
-
-'%mckenzie_cost_fast_forward <cost>'
- McKenzie error recovery cost for parsing ahead after fixing one
- error, moving to the next error location.
-
-'%mckenzie_cost_insert <token> <cost>'
- McKenzie error recovery insert cost for a specific token.
-
-'%mckenzie_cost_fast_forward <cost>'
- McKenzie error recovery cost for using the 'matching_begin'
- strategy.
-
-'%mckenzie_cost_push_back <token> <cost>'
- McKenzie error recovery push back cost for a specific token.
-
-'%mckenzie_cost_undo_reduce <token> <cost>'
- McKenzie error recovery undo reduce cost for a specific token.
-
-'%mckenzie_enqueue_limit <integer>'
- McKenzie error recovery limit on possible solutions enqueued (to be
- checked); default max integer.
-
-'%mckenzie_minimal_complete_cost_delta <cost>'
- McKenzie error recovery cost added to the cost of an inserted token
- when the insert is done by the minimal complete strategy; this cost
- is normally negative.
-
-
-File: wisitoken-user_guide.info, Node: Other declarations, Prev: Error
recovery, Up: Declarations
-
-3.1.5 Other declarations
-------------------------
-
-'%case_insensitive'
- If present, keywords are case insensitive in the lexer.
-
-'%conflict <conflict description>'
- Declare a known conflict.
-
- Example conflict declaration:
- %conflict REDUCE/REDUCE in state abstract_limited_opt,
abstract_limited_synchronized_opt on token NEW
-
- The conflict description is output by 'wisitoken-bnf-generate' when
- an undeclared conflict is detected. If the user decides to not fix
- the conflict, the description can be copied into the grammar source
- file, so it will be ignored next time around.
-
- Resolving conflicts in the grammar can be difficult, but leaving
- them in can increase parse time and cause ambiguous parses.
-
-'%elisp_face <name>'
- Declare a name for an elisp face constant.
-
- When generating Ada code for Emacs, the elisp faces applied by
- 'wisi-face-apply' actions must be declared, so the elisp and Ada
- code aggree on what they mean.
-
-'%elisp_indent <elisp name> <Ada name>'
- Declare elisp and Ada names for an indent variable.
-
- When generating Ada code for Emacs, the elisp indent variables used
- in 'wisi-indent' actions must be declared, so the elisp and Ada
- code aggree on what they mean.
-
-'%elisp_action <elisp name> <Ada name>'
- Declare elisp and Ada names for a custom action subprogram written
- in Ada.
-
- The term "elisp" here is historical; the name is not actually used
- by elisp in the current implementation.
-
-'end_names_optional_option <name>'
- When generating Ada code for Emacs, the name of the Ada variable
- determining whether end block names are optional.
-
- In the Ada language, block names can be repeated at the end; for
- example:
-
- Get_Inputs :
- loop
- ...
- end loop Get_Inputs;
-
- These names are optional in the Ada standard. Making them required
- improves error recovery; the recovery algorithm can use matching
- names to isolate the error.
-
-'generate <generate_algorithm> <output_language> [text_rep]'
-
- '<generate_algorithm>' is one of 'LALR | LR1 | Packrat_Gen |
- Packrat_Proc | External'
-
- '<output_language>' is one of 'Ada | Ada_Emacs'
-
- The algorithm/output_language pair declares one output source set.
- Multiple sets can be declared; they are all generated together.
-
- 'text_rep' determines how the parse table is represented; if
- present, it is in a text file that is loaded at parser run time.
- If absent, it is in the code. For very large parse tables, such as
- for an LR1 parser for a large language like Ada, the text
- representation may be needed, because the Ada compiler can't handle
- the very large number of statements that represent the parser table
- in the code. The text file can take a long time to read at parser
- startup (a few seconds for the Ada language).
-
-'%language_runtime'
- Specify an alternate name for the language runtime package; the
- default is 'Wisi.<language_name>'.
-
-'%meta_syntax [BNF | EBNF]'
- Declares the syntax used by the grammar file. BNF is a minor
- extension of standard Backus Naur Form; EBNF is a large extension.
- The default is BNF.
-
-'%no_enum'
- By default, the generated Ada code includes an enumeration type
- declaring each token. This makes the language-specific runtime
- easier to write (without this type, tokens are identified by
- integers).
-
- '%no_enum' causes the generated code to not include the token
- enumeration type.
-
-'%no_language_runtime'
- When generating Ada code for Emacs, '%no_language_runtime' causes
- the generated code to not include the runtime. Some grammars may
- need no runtime, particularly if they are small grammars intendend
- to test some generator feature.
-
-'%partial_recursion'
- The error recovery algorithm requires computing the recursion
- present in the language grammar. For some grammars (such as Java),
- this is too hard; '%partial_recursion' tells WisiToken to use a
- simpler approximate calculation. This will affect the quality of
- the error recovery, but it will still be robust.
-
-'%start'
- The start token for the grammar.
-
-'re2c_regexp <name> <value>'
- Declare a named regular expression with re2c name and syntax. The
- name may then occur in another re2c regular expression.
-
-
-File: wisitoken-user_guide.info, Node: Nonterminals, Next: Conditional code,
Prev: Declarations, Up: Grammar File Syntax
-
-3.2 Nonterminals
-================
-
-A nonterminal statement declares a nonterminal token, and the associated
-production rules and actions.
-
- The syntax of a nonterminal statement is:
-
-nonterminal : rhs {| rhs} ;
- A nonterminal is defined by a list of alternate right hand sides.
-
-rhs : {rhs_item} [action [action]] ;
- Each right hand side is a list of items, followed by zero to two
-actions; the first is the post-parse action, the second the in-parse
-action.
-
- In-parse actions are exeuted during the parse, when the production is
-reduced; they can add semantic checks that help during error recovery.
-
- Post-parse actions are executed after the parse is complete, when a
-node produced by this production is visited during the tree traversal;
-they typically build an abstract syntax tree.
-
- The actions are written in output-language code; for 'Ada_Emacs'
-output, this is elisp (a hold-over from when WisiToken only output elisp
-code).
-
- If using BNF:
-rhs_item : token ;
- Where 'token' is defined by a token declaration.
-
- if using EBNF:
-rhs_item
- : token
- | < identifier = identifier >
- | rhs_optional_item
- | rhs_multiple_item
- | '(' rhs {| rhs} ')'
- ;
- Here 'token' is either defined by a token declaration, or the token
-value contained in single quotes.
-
- The second option is an attribute, as defined by ANTLR; these are
-ignored in wisitoken.
-
- Parentheses are used to group items.
-
-rhs_optional_item
- : '[' rhs {| rhs} ']'
- | '(' rhs {| rhs} ')' '?'
- | token '?'
- ;
- These options all mean the same thing; the content is present zero or
-one times.
-
-rhs_multiple_item
- : '{' rhs {| rhs} '}'
- | '{' rhs {| rhs} '}-'
- | '(' rhs {| rhs} ')+'
- | '(' rhs {| rhs} ')*'
- | token '+'
- | token '*'
- ;
- "{}", "()*", and "token*" mean the content is present zero or more
-times. "{}-", "()+", and "token+" mean the content is present one or
-more times.
-
-
-File: wisitoken-user_guide.info, Node: Conditional code, Prev: Nonterminals,
Up: Grammar File Syntax
-
-3.3 Conditional code
-====================
-
-It is sometimes necessary to include or exclude some declarations and
-portions of rules based on the choice of lexer or parser.
-
- Therefore WisiToken supports '%if ... %end if' in the grammar file:
-%if {lexer | parser} = {<lexer> | <generate_algorithm>}
-...
-%end if
-
- The lines between '%if' and '%end if' are ignored if the current
-lexer or parser is not the one specified in the '%if' condition.
-
- '%if ... %end if' cannot be nested.
-
-
-
-Tag Table:
-Node: Top727
-Node: Overview1378
-Node: Install2140
-Node: Common grammar problems2637
-Node: Empty choice in list2930
-Node: Grammar File Syntax5912
-Node: Declarations6469
-Node: Raw Code6775
-Node: Keywords7156
-Node: Tokens7468
-Node: Error recovery8803
-Node: Other declarations12525
-Node: Nonterminals17017
-Node: Conditional code19038
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/wisitoken-user_guide.texinfo b/wisitoken-user_guide.texinfo
new file mode 100644
index 0000000..0a371a8
--- /dev/null
+++ b/wisitoken-user_guide.texinfo
@@ -0,0 +1,616 @@
+\input texinfo
+@c Author : Stephen Leake stephen_leake@stephe-leake.org
+@c Web : http://stephe-leake.org/ada/opentoken.html
+@setfilename wisitoken-user_guide.info
+@settitle WisiToken User Guide
+
+@copying
+Copyright @copyright{} 2014-2015, 2017, 2018, 2020, 2021 Stephen Leake.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this
+document under the terms of the GNU Free Documentation License,
+Version 1.3 or any later version published by the Free Software
+Foundation; with no Invariant Sections, no Front-Cover Texts and
+no Back-Cover Texts. A copy of the license is included in the
+section entitled "GNU Free Documentation License".
+@end quotation
+@end copying
+
+@dircategory Parser generators
+@direntry
+* wisitoken-bnf-generate: (wisitoken-bnf-generate). Ada parser
generator
+@end direntry
+
+@titlepage
+@sp 10
+@title WisiToken User Guide
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@node Top
+@top WisiToken User Guide
+
+@ifnottex
+@insertcopying
+@end ifnottex
+
+@menu
+* Overview::
+* Common grammar problems::
+* Grammar File Syntax::
+@end menu
+
+@node Overview
+@chapter Overview
+
+WisiToken is a parser and parser generator toolkit, supporting
+generalized LR (both LALR and LR1) and packrat parsers; the LR parser
+provides robust error recovery. The grammar can be expressed as either
+Ada source code statements, or in an EBNF file. The parser generator
+generates Ada, either plain or assuming the Emacs wisi package.
+
+At one point, ``wisi'' was short for ``Wisent Indentation engine'';
+the Emacs 'wisi' package implements an indentation engine that used to
+be based on the Emacs wisent parser. However, that parser has now been
+replaced by the WisiToken parser, so ``wisi'' is just a name.
+
+@menu
+* Install::
+@end menu
+
+@node Install
+@section Install
+WisiToken is available as source code only, although a subset is
+available in the GNU ELPA package @code{wisi}.
+
+You will also need to install a lexer generator. WisiToken supports
+re2c, and other lexers can be added.
+
+re2c is available from @url{http://re2c.org/}; it is also packaged in
+Mingw64 and Debian. WisiToken requires at least version 1.3.
+WisiToken assumes the executable @code{re2c} is in
+@code{$PATH}.
+
+@node Common grammar problems
+@chapter Common grammar problems
+
+LALR grammars are tricky. Here we describe some common problems people
+run into.
+
+@menu
+* Empty choice in list::
+@end menu
+
+@node Empty choice in list
+@section Empty choice in list
+
+Many programming languages have lists in the grammar. For example, Ada
+has lists of declarations:
+
+@example
+package_body
+ : PACKAGE name IS declaration_list BEGIN statement_list END SEMICOLON
+ ;
+
+declaration_list
+ : declaration
+ | declaration_list declaration
+ ;
+
+declaration
+ : object_declaration
+ | subprogram_declaration
+ ;; ...
+ ;
+@end example
+
+Note that the above grammar fragment does not allow an empty
+declaration_list. But Ada does, so the question is how can we add that
+to the grammar.
+
+There are four choices:
+
+@enumerate
+@item
+Add an empty declaration choice to declaration_list:
+
+@example
+declaration_list
+ : ;; empty list
+ | declaration
+ | declaration_list declaration
+ ;
+@end example
+This is now redundant; since declaration_list can be empty, the second
+choice is not needed:
+@example
+declaration_list
+ : ;; empty list
+ | declaration_list declaration
+ ;
+@end example
+
+
+@item
+Add an empty declaration choice to declaration:
+
+@example
+declaration
+ : ;; empty declaration
+ | object_declaration
+ | subprogram_declaration
+ ;; ...
+ ;
+@end example
+
+@item
+Add another rule with the empty production:
+
+@example
+package_body
+ : PACKAGE name IS declarative_part BEGIN statement_list END SEMICOLON
+ ;
+
+declarative_part
+ : ;; empty
+ | declaration_list
+ ;
+
+declaration_list
+ : declaration
+ | declaration_list declaration
+ ;
+
+declaration
+ : object_declaration
+ | subprogram_declaration
+ ;; ...
+ ;
+@end example
+
+@item
+Add another choice in package_body that leaves out declaration_list:
+@example
+package_body
+ : PACKAGE name IS declaration_list BEGIN statement_list END SEMICOLON
+ | PACKAGE name IS BEGIN statement_list END SEMICOLON
+ ;
+@end example
+@end enumerate
+
+Choice 1 is redundant, giving parse errors at parse time.
+Consider the following statements, where "<empty>" is used to indicate
+an empty declaration:
+
+1) package One is <empty> begin end ;
+2) package One is package One is <empty> begin end ; begin end ;
+3) package One is <empty> package One is <empty declaration> begin end ; begin
end ;
+
+In parsing 3), the second 'package' causes a shift/reduce conflict;
+shift to start the nested declaration (as in 2), reduce to the empty
+declaration. Both are correct according to the grammar.
+
+Choice 2 leads to a shift/reduce conflict in the production for
+package_body; implementing the wisi parser as a generalized LALR parser
+allows it to handle this option.
+
+Choice 2 is the preferred choice for Ada, since it involves the least
+modifications to the original Ada grammar in the Ada reference manual.
+
+@node Grammar File Syntax
+@chapter Grammar File Syntax
+
+The grammar file syntax is based on Gnu bison syntax
+with some additions and deletions (@pxref{Top,Bison,Overview,bison}).
+
+(The grammar is specified in the WisiToken grammar file
+@file{wisitoken_grammar.wy}).
+
+The top level file structure is a list of declarations and
+nonterminals.
+
+Comments are started by @code{;;} and terminated by end of line.
+
+@menu
+* Declarations::
+* Nonterminals::
+* Conditional code::
+@end menu
+
+@node Declarations
+@section Declarations
+
+Declarations declare terminal tokens, conflicts, and other parser
+parameters.
+
+@menu
+* Raw Code::
+* Keywords::
+* Tokens::
+* Error recovery::
+* Other declarations::
+@end menu
+
+@node Raw Code
+@subsection Raw code
+@verbatim
+%code { actions | copyright_license } [spec | body | context | pre | post]...
%{ <output language code> }%
+@end verbatim
+
+Raw code declarations contain arbitrary code, copied verbatim into the
+output. The keywords following @code{%code} determine where
+the section is output.
+
+@node Keywords
+@subsection Keywords
+@verbatim
+%keyword <name> <string>
+@end verbatim
+
+example:
+@verbatim
+%keyword SEMICOLON ";"
+@end verbatim
+
+``Keywords'' are reserved words or symbols in the target language; the
+lexers recognize them by the given string.
+
+@node Tokens
+@subsection Tokens
+@verbatim
+%token < kind > name regexp
+@end verbatim
+
+example:
+@verbatim
+%token <symbol> IDENTIFIER %[ ... ]%
+%token <punctuation> TICK "'"
+@end verbatim
+
+The syntax of the regular expression is determined by the lexer
+generator. The meaning of @code{kind} is determined by the lexer
+(@code{re2c} ignores this), with the following defined by the
+WisiToken generator. Other token kinds have no effect; they may be
+used for documentation.
+
+@table @code
+@item <string-double>
+@verbatim
+%token <string-double> STRING_LITERAL %[ ... ]%
+@end verbatim
+A string of characters that have string syntax, with double quote delimiters.
+
+@item <string-single>
+@verbatim
+%token <string-single> CHARACTER_LITERAL %[ ... ]%
+@end verbatim
+A string of characters that have string syntax, with single quote delimiters.
+
+@item <new-line>
+@verbatim
+%token <new-line> [\n] %[ ... ]%
+@end verbatim
+Not used by the wisi lexer; required by the Ada lexer. The third
+argument is the regular expression to recognize the entire comment.
+
+@item <non-reporting>
+@verbatim
+%token <non-reporting> WHITESPACE %[ [ \t] ]%
+@end verbatim
+A token that is recognized by the lexer, but not returned to the
+parser.
+
+@item <delimited-text>
+@verbatim
+%token <delimited-text> RAW_CODE "%{" "}%"
+@end verbatim
+A token that contains arbitrary text, delimited by the two strings.
+
+@end table
+
+@node Error recovery
+@subsection Error recovery
+The parser uses an error recovery algorithm when it encounters a
+syntax error; if a solution is found, the parse continues.
+
+Error recovery uses multiple tasks to take advantage of multiple CPU
+cores. Unfortunately, this means there is a race condition; the
+solutions found can be delivered in different orders on different
+runs. This matters because each solution results in a successful
+parse, possibly with different actions (different indentation
+computed, for example). Which solution finally succeeds depends on
+which are terminated due to identical parser stacks, which in turn
+depends on the order they were delivered.
+
+Once the syntax errors are fixed, only ambiguities in the grammar
+itself can cause a similar problem.
+
+Several grammar file declarations set parameters for the error
+recovery. If none of these parameters are present in the grammar file,
+the generated parser does not do error recovery.
+
+The error recovery algorithm generates possible solutions based on the
+parse state preceding the error point, by inserting, deleting, or pushing
+back tokens. Each possible solution is given a cost, and enqueued to
+be checked later. Solutions are checked in cost order (lowest first).
+
+@table @code
+@item %mckenzie_check_limit <limit>
+The number of tokens past the error point that must be parsed
+successfully for a solution to be deemed successful. Smaller values
+give faster recovery; larger values give better solutions. Too large a
+value risks encountering another user error, making a solution
+impossible. 3 or 4 works well in practice.
+
+@item mckenzie_check_delta_limit <limit>
+When error recovery is entered with multiple parsers active, once a
+solution has been found for one parser, the other parsers are allowed
+to check only @code{mckenzie_check_delta_limit} possible solutions
+before they fail. This prevents long recovery times.
+
+@item %mckenzie_cost_default <insert> <delete> <push back> <ignore check fail>
+McKenzie error recovery default costs for insert, delete, push back
+single tokens, and for ignoring a semantic check failure; four
+floating point numbers.
+
+``Push back'' means undo parsing; remove tokens from the parse stack
+and put them back into the input stream. This moves the insert/delete
+point, allowing better solutions. The push back default cost is also
+the undo reduce default cost.
+
+If not specified, costs are zero. Costs can be negative; they
+all add linearly.
+
+@item %mckenzie_cost_delete <token> <cost>
+McKenzie error recovery delete cost for a specific token.
+
+@item %mckenzie_cost_fast_forward <cost>
+McKenzie error recovery cost for parsing ahead after fixing one error,
+moving to the next error location.
+
+@item %mckenzie_cost_insert <token> <cost>
+McKenzie error recovery insert cost for a specific token.
+
+@item %mckenzie_cost_fast_forward <cost>
+McKenzie error recovery cost for using the @code{matching_begin}
+strategy.
+
+@item %mckenzie_cost_push_back <token> <cost>
+McKenzie error recovery push back cost for a specific token.
+
+@item %mckenzie_cost_undo_reduce <token> <cost>
+McKenzie error recovery undo reduce cost for a specific token.
+
+@item %mckenzie_enqueue_limit <integer>
+McKenzie error recovery limit on possible solutions enqueued (to be
+checked); default max integer.
+
+@item %mckenzie_minimal_complete_cost_delta <cost>
+McKenzie error recovery cost added to the cost of an inserted token
+when the insert is done by the minimal complete strategy; this cost is
+normally negative.
+
+@end table
+
+@node Other declarations
+@subsection Other declarations
+@table @code
+@item %case_insensitive
+If present, keywords are case insensitive in the lexer.
+
+@item %conflict <conflict description>
+Declare a known conflict.
+
+Example conflict declaration:
+@verbatim
+%conflict REDUCE/REDUCE in state abstract_limited_opt,
abstract_limited_synchronized_opt on token NEW
+@end verbatim
+
+The conflict description is output by @code{wisitoken-bnf-generate}
+when an undeclared conflict is detected. If the user decides to not
+fix the conflict, the description can be copied into the grammar
+source file, so it will be ignored next time around.
+
+Resolving conflicts in the grammar can be difficult, but leaving them
+in can increase parse time and cause ambiguous parses.
+
+@item %elisp_face <name>
+Declare a name for an elisp face constant.
+
+When generating Ada code for Emacs, the elisp faces applied by
+@code{wisi-face-apply} actions must be declared, so the elisp and Ada
+code aggree on what they mean.
+
+@item %elisp_indent <elisp name> <Ada name>
+Declare elisp and Ada names for an indent variable.
+
+When generating Ada code for Emacs, the elisp indent variables used in
+@code{wisi-indent} actions must be declared, so the elisp and Ada code
+aggree on what they mean.
+
+@item %elisp_action <elisp name> <Ada name>
+Declare elisp and Ada names for a custom action subprogram written in
+Ada.
+
+The term ``elisp'' here is historical; the name is not actually used
+by elisp in the current implementation.
+
+@item end_names_optional_option <name>
+When generating Ada code for Emacs, the name of the Ada variable
+determining whether end block names are optional.
+
+In the Ada language, block names can be repeated at the end; for
+example:
+
+@verbatim
+Get_Inputs :
+loop
+...
+end loop Get_Inputs;
+@end verbatim
+
+These names are optional in the Ada standard. Making them required
+improves error recovery; the recovery algorithm can use matching names
+to isolate the error.
+
+@item generate <generate_algorithm> <output_language> [text_rep]
+
+@code{<generate_algorithm>} is one of @code{LALR | LR1 | Packrat_Gen |
Packrat_Proc | External}
+
+@code{<output_language>} is one of @code{Ada | Ada_Emacs}
+
+The algorithm/output_language pair declares one output source
+set. Multiple sets can be declared; they are all generated together.
+
+@code{text_rep} determines how the parse table is represented; if
+present, it is in a text file that is loaded at parser run time. If
+absent, it is in the code. For very large parse tables, such as for an
+LR1 parser for a large language like Ada, the text representation may
+be needed, because the Ada compiler can't handle the very large number
+of statements that represent the parser table in the code. The text
+file can take a long time to read at parser startup (a few seconds for
+the Ada language).
+
+@item %language_runtime
+Specify an alternate name for the language runtime package; the
+default is @code{Wisi.<language_name>}.
+
+@item %meta_syntax [BNF | EBNF]
+Declares the syntax used by the grammar file. BNF is a minor extension
+of standard Backus Naur Form; EBNF is a large extension. The default
+is BNF.
+
+@item %no_enum
+By default, the generated Ada code includes an enumeration type
+declaring each token. This makes the language-specific runtime easier
+to write (without this type, tokens are identified by integers).
+
+@code{%no_enum} causes the generated code to not include the token
+enumeration type.
+
+@item %no_language_runtime
+When generating Ada code for Emacs, @code{%no_language_runtime} causes
+the generated code to not include the runtime. Some grammars may need
+no runtime, particularly if they are small grammars intendend to test
+some generator feature.
+
+@item %partial_recursion
+The error recovery algorithm requires computing the recursion present
+in the language grammar. For some grammars (such as Java), this is too
+hard; @code{%partial_recursion} tells WisiToken to use a simpler
+approximate calculation. This will affect the quality of the error
+recovery, but it will still be robust.
+
+@item %start
+The start token for the grammar.
+
+@item re2c_regexp <name> <value>
+Declare a named regular expression with re2c name and syntax. The name
+may then occur in another re2c regular expression.
+@end table
+
+@node Nonterminals
+@section Nonterminals
+
+A nonterminal statement declares a nonterminal token, and the
+associated production rules and actions.
+
+The syntax of a nonterminal statement is:
+
+@verbatim
+nonterminal : rhs {| rhs} ;
+@end verbatim
+A nonterminal is defined by a list of alternate right hand sides.
+
+@verbatim
+rhs : {rhs_item} [action [action]] ;
+@end verbatim
+Each right hand side is a list of items, followed by zero to two
+actions; the first is the post-parse action, the second the in-parse
+action.
+
+In-parse actions are exeuted during the parse, when the production is
+reduced; they can add semantic checks that help during error recovery.
+
+Post-parse actions are executed after the parse is complete, when a
+node produced by this production is visited during the tree traversal;
+they typically build an abstract syntax tree.
+
+The actions are written in output-language code; for @code{Ada_Emacs}
+output, this is elisp (a hold-over from when WisiToken only output
+elisp code).
+
+If using BNF:
+@verbatim
+rhs_item : token ;
+@end verbatim
+Where @code{token} is defined by a token declaration.
+
+if using EBNF:
+@verbatim
+rhs_item
+ : token
+ | < identifier = identifier >
+ | rhs_optional_item
+ | rhs_multiple_item
+ | '(' rhs {| rhs} ')'
+ ;
+@end verbatim
+Here @code{token} is either defined by a token
+declaration, or the token value contained in single quotes.
+
+The second option is an attribute, as defined by ANTLR; these are
+ignored in wisitoken.
+
+Parentheses are used to group items.
+
+@verbatim
+rhs_optional_item
+ : '[' rhs {| rhs} ']'
+ | '(' rhs {| rhs} ')' '?'
+ | token '?'
+ ;
+@end verbatim
+These options all mean the same thing; the content is present zero or
+one times.
+
+@verbatim
+rhs_multiple_item
+ : '{' rhs {| rhs} '}'
+ | '{' rhs {| rhs} '}-'
+ | '(' rhs {| rhs} ')+'
+ | '(' rhs {| rhs} ')*'
+ | token '+'
+ | token '*'
+ ;
+@end verbatim
+''@{@}'', ''()*'', and ''token*'' mean the content is present zero or more
+times. ''@{@}-'', ''()+'', and ''token+'' mean the content is present one or
+more times.
+
+@node Conditional code
+@section Conditional code
+
+It is sometimes necessary to include or exclude some declarations
+and portions of rules based on the choice of lexer or parser.
+
+Therefore WisiToken supports @code{%if ... %end if} in the grammar file:
+@verbatim
+%if {lexer | parser} = {<lexer> | <generate_algorithm>}
+...
+%end if
+@end verbatim
+
+The lines between @code{%if} and @code{%end if} are ignored if the
+current lexer or parser is not the one specified in the @code{%if}
+condition.
+
+@code{%if ... %end if} cannot be nested.
+
+@c FIXME: doc language_fixes etc.
+@bye